Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 理解它_Scala - Fatal编程技术网

Scala 理解它

Scala 理解它,scala,Scala,我正在 注释是我对代码的理解 下面的trait接受一个参数,该参数是非严格求值的(由于=>),并返回Unit。它的行为类似于构造函数 trait DelayedInit { def delayedInit(x: => Unit): Unit } 据我所知,这个特性有一个var x,它等于一个0-arity函数(无参数)x根据对delayedInit方法的调用进行分配 然后,main将在x上调用apply'.,如果它有Some(Function0[Unit])类型。如果x为None,则

我正在

注释是我对代码的理解

下面的trait接受一个参数,该参数是非严格求值的(由于
=>
),并返回
Unit
。它的行为类似于构造函数

trait DelayedInit {
  def delayedInit(x: => Unit): Unit
}
据我所知,这个特性有一个
var x
,它等于一个0-arity函数(无参数)
x
根据对
delayedInit
方法的调用进行分配

然后,
main
将在
x
上调用
apply'.
,如果它有
Some(Function0[Unit])
类型。如果
x
None
,则不会发生任何事情

trait App extends DelayedInit {
  var x: Option[Function0[Unit]] = None
  override def delayedInit(cons: => Unit) {
    x = Some(() => cons)
  }
  def main(args: Array[String]): Unit =
    x.foreach(_())
}
然后,我根据书中的例子去了REPL:

scala> val x = new App { println("Now I'm initialized") }
x: java.lang.Object with App = $anon$1@2013b9fb
我看到

scala>x.main(Array())

没什么


App
实例的构造是否会导致调用
delayedInit
,从而
x.main(Array())
返回类似构造函数的行为?或者,更具体地说,我现在已经初始化了
应该打印出来吗?

我猜你在
应用程序的同一个文件中定义了自己的
延迟属性。如果您这样做了,请删除它,
DelayedInit
scala
包中的一个特性

我刚从书中得到代码并粘贴到Eclipse工作表中,它就可以正常工作了

编辑


发生的情况是,delayednit中的代码在您使用新应用程序{println(“Now I'm initialized”)}创建的匿名应用程序对象的构造函数之前被调用。您可以在以下屏幕截图中看到:

如果您决定删除此行:

x = Some(() => cons)

您将看到,现在我已初始化从未打印。因为您正在创建的匿名
App
对象的构造函数代码被赋予了
delayedInit
方法,但从未在任何地方运行过,所以
App
的对象构造函数永远不会运行。

它是否只起作用
意味着
现在我已初始化
在调用
x.main(Array)时打印出来())
?据我所知,上述
App
类的实例化在创建对象时没有看到调用
delayedInit
。在Scala中创建对象时,函数(
def
)是的,这是工作表的屏幕截图-在对象实例化时,
delayedInit
如何被调用来更新
x
的值?当一个新的
应用程序创建时,这行不是只被计算
var x:Option[Function0[Unit]]=None
?发生的情况是,
delayedInit
中的代码在匿名
App
对象的构造函数之前被调用,您正在使用
新建App{println(“现在我已初始化”)}
。更多输出-因此
{println(“现在我已初始化”)}
被传递到
delayedInit
方法中?[谢谢你的帮助,毛里西奥]正如毛里西奥指出的,当我没有深入介绍Scala的
delayedInit
时,
现在我在运行
x.main(Array())
时被初始化了
打印出来。除了下面的详细答案(谢谢),这些文档还帮了我一把-。