【发布时间】:2015-02-28 13:16:10
【问题描述】:
我有以下 Currying 函数声明:
def logString(count: Int)(fun:() => Unit) {
for (n <- 1 to count) { fun }
}
我是这样调用这个函数的:
logString(3) { () => print("I") }
结果什么都没有——只是没有输出。
然后我只是在“有趣”函数调用之后添加括号,在 Currying 函数声明的主体内:
def logString(count: Int)(fun:() => Unit) {
for (n <- 1 to count) { fun() }
}
结果变成了预期:
III
这是 Scala 的 bug,还是我在学习 Scala 时遗漏了一些规则?
我知道当你声明这样的函数时,有一条规则: 定义我的乐趣 = 1 我们不能用括号调用它——编译失败。 但是在调用带和不带括号的函数时产生不同的结果似乎更像是一个错误。
我是对的还是我错过了有关 Scala 的一些东西?
【问题讨论】:
-
我认为
fun在这种情况下只是一个val,就像你会写val x = 10,然后在一个循环中for (n <- 1 to 5) { x } -
这也是我发布问题时的想法。但似乎不是真的。我做了以下更改: def logString(count: Int)(fun:() => Unit) { for (n ; ; ;
-
是的,确切地说,因为
fun是一个值定义,当您在其上调用+时,因为它的类型为Function0(而不是String例如)它是通过调用toString方法转换为字符串。然后您将获得<function0>,并在其上附加;。这发生了 3 次。 -
@myQs - 如果
fun是一个值,这就是您所期望的 -fun + ";"被评估为fun.toString() + "; "并且fun.toString是<function0>。fun未在 print 语句中进行评估。 -
@myQs - 是的,
fun是Function0类型的值 - 函数是 scala 中的值,就像Ints 或Strings 是值一样。toString只返回值的String表示。对于Function0实例,这是<function0>- 请参阅source。