在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我可以使用其他修饰符:"包,类或单例对象".所以我会留下一些特殊情况.
我是斯卡拉的新手.最近我写了一个爱好应用程序,并发现自己试图在许多情况下使用模式匹配而不是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已有一段时间了,无法清楚地了解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,我是否应该总是这样做?
任何有关它的想法都会有所帮助.提前致谢!
我的问题类似于为什么选项,但我认为它不一样.它更多的是关于何时,而不是为什么.:)
昨天我突然明白了,并了解人们如何以及为什么人们使用'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方式完成它吗?
我是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) 我有一个方法实现在命令式和功能性(我在这里尽我所能)的方式.该方法迭代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)