Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.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_Pass By Name - Fatal编程技术网

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

对,我没有看到新的匿名类语法。现在它有意义了。不过,圆括号和花括号是不能互换的,这有点令人困惑。