Scala函数未按名称传递,带有花括号(大括号)
我希望通过名称传递函数,并在其执行之前执行一些操作。考虑下面的例子:Scala函数未按名称传递,带有花括号(大括号),scala,pass-by-name,Scala,Pass By Name,我希望通过名称传递函数,并在其执行之前执行一些操作。考虑下面的例子: class Runner { def apply(procedure: => Unit) = { println("running procedure") procedure } } new Runner()(println("procedure!")) // #1 new Runner(){println("procedure!")} // #2 调用1和调用2之间的唯一区别在于花括号。而第
class Runner {
def apply(procedure: => Unit) = {
println("running procedure")
procedure
}
}
new Runner()(println("procedure!")) // #1
new Runner(){println("procedure!")} // #2
调用1和调用2之间的唯一区别在于花括号。而第一个调用输出
running procedure
procedure!
正如所料,仅在第二次通话中
procedure!
是印刷的
似乎在使用大括号时,过程不是按名称传递的,而是执行的为什么本例中的花括号和圆括号不能互换?第一句话:
new Runner()(println("procedure!")) // #1
new Runner(){println("procedure!")} // #2
在第一种情况下,当使用括号时,apply()
方法被调用,println(“过程!”)
作为参数传递。因此,第一个语句相当于:
new Runner().apply(println("procedure!"))
因此,输出为:
running procedure
procedure!
第二句话:
new Runner()(println("procedure!")) // #1
new Runner(){println("procedure!")} // #2
在第二种情况下,通过扩展Runner
创建匿名类。因此,在第二种情况下,语句println(“过程!”)
作为构造函数的一部分执行,但是apply()
没有被调用,因此您只能看到
procedure!
作为输出
自定义控件结构
我想您打算使用第二条语句创建(尽管对于编译器来说,它是一个匿名类)。如果是这种情况,可以使用以下语法:
val runner = new Runner()
runner.apply {println("procedure!")}
// OR simply
runner {println("procedure!")} // this is possible because apply() is defined for Runner
对,我没有看到新的匿名类语法。现在它有意义了。不过,圆括号和花括号是不能互换的,这有点令人困惑。