hot*_*zen 2 constructor scala pass-by-name
来自我的另一个问题 是有一种方法来获取构造函数的名字参数吗?我需要一种方法来提供一个代码块,它在对象内部按需/延迟/按名称执行,这个代码块必须能够访问类方法,就像代码块是类的一部分一样.
以下Testcase失败:
package test
class ByNameCons(code: => Unit) {
def exec() = {
println("pre-code")
code
println("post-code")
}
def meth() = println("method")
def exec2(code2: => Unit) = {
println("pre-code")
code2
println("post-code")
}
}
object ByNameCons {
def main(args: Array[String]): Unit = {
val tst = new ByNameCons {
println("foo")
meth() // knows meth() as code is part of ByNameCons
}
tst.exec() // ByName fails (executed right as constructor)
println("--------")
tst.exec2 { // ByName works
println("foo")
//meth() // does not know meth() as code is NOT part of ByNameCons
}
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
foo
method
pre-code
post-code
--------
pre-code
foo
post-code
Run Code Online (Sandbox Code Playgroud)
这是因为当你创建这样的实例时:
val tst = new ByNameCons {
...
}
Run Code Online (Sandbox Code Playgroud)
..你实际上正在创建一个匿名类,就像在java中一样.以上代码与:
val tst = new ByNameCons() { ... }
Run Code Online (Sandbox Code Playgroud)
..而传递by-name的正确语法是:
val tst = new ByNameCons( { ... } )
Run Code Online (Sandbox Code Playgroud)
对于构造函数和函数,您不能以相同的方式省略括号.