我是 Scala 的初学者,请原谅我的无知。
这是一个代码片段,其行为有点难以理解。
def times(n: Int) = (body: Unit) => (0 until n) foreach(n=>body)
times(5){
println("index")
}
输出是:索引只打印一次。
然而,这个:
def times(n: Int) = (0 until n) foreach(n=>println("index"))
打印 10 次。
def times(n: Int) = (body: Unit) => (0 until n) foreach(n=>body)
方法times
创建接受Unit
和返回的函数Unit
。
times(5)
接受Unit
,因此times(5){ println("index") }
将其参数评估println("index")
为Unit
。
要评估println("index")
n
时间,您必须将其作为函数传递,如下所示:
def times(n: Int) = (body: Unit => Unit) => (0 until n) foreach(_ => body())
用法:
times(5){ _ => println("index") }
使用parameter groups
and可能会更好pass by name
:
def times(n: Int)(body: => Unit) { (0 until n) foreach( _ => body) }
用法:
scala> times(5){ println("index") }
index
index
index
index
index
您的第二个功能应该按预期工作。
但是,您的第一个功能输入错误,您需要它是正确的:
def times(n: Int)(body: => Unit) = (0 until n) foreach(n=>body)
否则语义如下。(你的功能:)
def times(n: Int) = (body: Unit) => (0 until n) foreach(n=>body)
如果您调用它将times(n)
返回一个作为参数并运行function
Unit
(0 until n) foreach(n => body)
起初有一种趋势认为Unit
是“一段代码”的意思,这根本不是真的。Unit
有一个值:()
. 而已。
所以body
当你做的时候价值不会times(5){ println("index") }
,它就会。如果你做五次,五次什么都不会发生。{ println("index") }
()
()
发生的事情{ println("index") }
是执行,打印某些内容,然后Unit
返回并分配给body
. 像这样:
scala> val body = { println("index") }
index
body: Unit = ()
scala> (0 until 5) foreach {n => body}
scala>
您可以使用按名称参数做您想做的事情,在这种情况下,该参数将表示一个计算结果为 的表达式Unit
,而不仅仅是Unit
。例如:
def times(n: Int)(body: => Unit) = (0 until n) foreach(n=>body)
参数类型的=>
前缀意味着参数是按名称传递的。它不会更改类型,它会更改评估策略(有关更多信息,请参见链接)。