Scala 理解它
我正在 注释是我对代码的理解 下面的trait接受一个参数,该参数是非严格求值的(由于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,则
=>
),并返回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())
时被初始化了
打印出来。除了下面的详细答案(谢谢),这些文档还帮了我一把-。