1

我是 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 次。

4

3 回答 3

3
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 groupsand可能会更好pass by name

def times(n: Int)(body: => Unit) { (0 until n) foreach( _ => body) }

用法:

scala> times(5){ println("index") }
index
index
index
index
index
于 2013-02-14T13:44:31.293 回答
2

您的第二个功能应该按预期工作。

但是,您的第一个功能输入错误,您需要它是正确的:

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)返回一个作为参数并运行functionUnit(0 until n) foreach(n => body)

于 2013-02-14T13:40:04.087 回答
1

起初有一种趋势认为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)

参数类型的=>前缀意味着参数是按名称传递的。它不会更改类型,它会更改评估策略(有关更多信息,请参见链接)。

于 2013-02-14T15:10:14.627 回答