小编Sot*_*ric的帖子

私人[this] vs私人

在Scala中,我将此特性视为对象私有变量.从我不太丰富的Java背景中,我学会了关闭所有内容(使其成为私有)并在必要时打开(提供访问者).Scala引入了更严格的访问修饰符.我应该总是默认使用它吗?或者我应该只在某些特定情况下使用它,我需要明确限制更改字段值,即使对于同一类的对象?换句话说,我应该如何选择

class Dummy {
    private var name = "default name"
}

class Dummy {
    private[this] var name = "default name"
}
Run Code Online (Sandbox Code Playgroud)

第二个更严格,我喜欢它,但我应该总是使用它或只有我有充分的理由?

编辑:正如我在这里 看到private[this]的只是一些subcase而不是this我可以使用其他修饰符:"包,类或单例对象".所以我会留下一些特殊情况.

scala

106
推荐指数
7
解决办法
4万
查看次数

模式匹配vs if-else

我是斯卡拉的新手.最近我写了一个爱好应用程序,并发现自己试图在许多情况下使用模式匹配而不是if-else.

user.password == enteredPassword match {
  case true => println("User is authenticated")
  case false => println("Entered password is invalid")
}
Run Code Online (Sandbox Code Playgroud)

代替

if(user.password == enteredPassword)
  println("User is authenticated")
else
  println("Entered password is invalid")
Run Code Online (Sandbox Code Playgroud)

这些方法是否相同?出于某种原因,其中一个比另一个更受欢迎吗?

scala

69
推荐指数
6
解决办法
4万
查看次数

何时使用Option

我学习Scala已有一段时间了,无法清楚地了解Option的用法.当我链接函数时,它可以帮助我避免空值检查(根据文档).这对我来说很清楚:)

接下来我看到Option可以作为开发人员的一种指示器,这里可以使用null值,并且必须对其进行处理.这是真的吗?如果是,我应该使用选项吗?例如

class Racer {
    val car = new Car()
}
Run Code Online (Sandbox Code Playgroud)

我有Racer类,我确定car field不能为null(因为它是常量并在创建Racer实例时得到一个值).这里不需要选项.

class Racer {
    var car = new Car()
}
Run Code Online (Sandbox Code Playgroud)

在这里,我这样做,以便汽车可以改变.并且有人可以为汽车分配零.我应该在这里使用Option吗?如果是,我注意到我所有的班级字段都是Option的候选者.我的代码看起来像这样

class Racer {
    var car: Option[Car] = None
    var currentRace: Option[Race] = None
    var team: Option[Team] = None
    ...
}
Run Code Online (Sandbox Code Playgroud)

它看起来不错吗?对我来说,似乎有点过度使用.

def foo(): Result = {
    if( something )
        new Result()
    else
        null
}
Run Code Online (Sandbox Code Playgroud)

我有一个可以返回null的方法.我应该返回Option吗?如果方法可以返回null,我是否应该总是这样做?

任何有关它的想法都会有所帮助.提前致谢!

我的问题类似于为什么选项,但我认为它不一样.它更多的是关于何时,而不是为什么.:)

scala

26
推荐指数
4
解决办法
1万
查看次数

比较Option [T]的实例,避免None == None

昨天我突然明白了,并了解人们如何以及为什么人们使用'map'方法和Option来比较值.是的,我有点慢,抱歉:)

我修改了这些非常好的链接,并提出了我想问的问题.

http://twitter.github.com/effectivescala

http://blog.tmorris.net/posts/scalaoption-cheat-sheet

在我的Lift webapp中,我有一些Option [User]和Option [Server]变量.我试图通过以下检查找出此用户是否是此服务器的管理员

if(user.map(_.id) == server.map(_.adminId))
Run Code Online (Sandbox Code Playgroud)

但是我注意到,如果'user'是None而'server'也是None,那么这个检查成功,这对我不利(如果它们中的任何一个是None,我希望这个检查失败).我可以添加user.isDefined条件,但我觉得有更多正确的方法来做到这一点.你能告诉我如何用Scala方式完成它吗?

scala

10
推荐指数
2
解决办法
1万
查看次数

存储主管儿童PID

我是Erlang的初学者,并试图实现我的第一个Erlang应用程序.它是一个网络监视工具,应该对指定的主机执行ping请求.实际上发送ICMP不是一个目标,我对应用程序结构更感兴趣.目前我有monitor_app,monitor_sup(root sup),pinger_sup和pinger(worker).这是pinger_sup:

-module(pinger_sup).
-behaviour(supervisor).
-export([start_link/0, start_child/1, stop_child/1]).
-export([init/1]).

start_link() ->
    supervisor:start_link({local, ?MODULE}, ?MODULE, []).

start_child(Ip) ->
    {ok, Pid} = supervisor:start_child(?MODULE, Ip),
    put(Pid, Ip),
    {ok, Pid}.

stop_child(Ip) ->
    Children = get_keys(Ip),
    lists:foreach(fun(Pid) ->
            pinger:stop(Pid)
        end,
        Children).

init(_Args) ->
    Pinger = {pinger, {pinger, start_link, []},
        transient, 2000, worker, [pinger]},
    Children = [Pinger],
    RestartStrategy = {simple_one_for_one, 4, 3600},
    {ok, {RestartStrategy, Children}}.
Run Code Online (Sandbox Code Playgroud)

并且自己:

-module(pinger).
-behaviour(gen_server).
-export([start_link/1, stop/1, stop_ping/1, ping/1, ping/2]).
-export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
-define(PING_INTERVAL, 5000).

start_link(Ip) ->
    gen_server:start_link(?MODULE, Ip, []).

stop(Pid) …
Run Code Online (Sandbox Code Playgroud)

erlang

4
推荐指数
1
解决办法
2582
查看次数

势在必行与功能的例子

我有一个方法实现在命令式和功能性(我在这里尽我所能)的方式.该方法迭代ArrayBuffer [生物],计算每个生物的距离并返回最近或无(如果世界上没有生物,除了'this').

势在必行:

private def closestEnemy: Option[Creature] = {
  var closest: Option[Creature] = None
  var distanceToClosest = Int.MaxValue

  for(creature <- game.creatures if creature != this) {
    val distance = distanceTo(creature)

    if(distance < distanceToClosest) {
      closest = Some(creature)
      distanceToClosest = distance
    }
  }

  closest
}
Run Code Online (Sandbox Code Playgroud)

功能:

private def closestEnemy: Option[Creature] =
  game.creatures filter { _ != this } map { creature => (creature, distanceTo(creature)) } match {
    case creaturesWithDistance if creaturesWithDistance.isEmpty => None
    case creaturesWithDistance => Some(creaturesWithDistance minBy { _._2 } …
Run Code Online (Sandbox Code Playgroud)

functional-programming scala imperative-programming

4
推荐指数
1
解决办法
827
查看次数