在Scala中调用带有和不带括号的无参数函数以不同的方式执行

myQ*_*yQs 4 scala currying

我有以下Currying函数声明:

def logString(count: Int)(fun:() => Unit) {
  for (n <- 1 to count) { fun }
}
Run Code Online (Sandbox Code Playgroud)

我用这种方式调用这个函数:

logString(3) { () => print("I") }
Run Code Online (Sandbox Code Playgroud)

结果没什么 - 只是没有输出.

然后我只需在"fun"函数调用后添加括号,在Currying函数声明体内:

def logString(count: Int)(fun:() => Unit) {
  for (n <- 1 to count) { fun() }
}
Run Code Online (Sandbox Code Playgroud)

结果成为预期的结果:

III

这是一些Scala错误,还是在学习Scala时我错过了一些规则?

我知道当你声明这样的函数时有规则:def myFun = 1我们不能用括号调用它 - 编译失败. 但是在调用带括号和不带括号的函数时有不同的结果似乎更像是一个bug.

我是对的还是我想念Scala?

acj*_*jay 6

看看fun它的类型fun: () => Unit.你可以认为这意味着,当你打电话给它时(),你会得到Unit回报.如果没有显式调用它,fun是指该功能的值,而不是调用它的结果.这是高阶函数概念的本质.

如果它有类型fun: => Unit,只需提及fun将导致它被执行,在这种情况下,将无法将该函数作为值引用.


lpi*_*ora 5

当你有这样的声明

val x = 10
Run Code Online (Sandbox Code Playgroud)

这是一个价值定义。在这种情况下,值 x 可以是一个整数,但它也可以是一个函数。

val y = () => println("i'm a function")
Run Code Online (Sandbox Code Playgroud)

然而,无论哪种方式,如果你不带括号调用它,什么都不会发生。

scala> val x = 10
x: Int = 10

scala> val y = () => println("i'm a function")
y: () => Unit = <function0>

scala> x
res0: Int = 10

scala> y
res1: () => Unit = <function0>
Run Code Online (Sandbox Code Playgroud)

当您有这样的函数定义时:

def z() = println("i'm a function def")
Run Code Online (Sandbox Code Playgroud)

然后你可以省略括号并在没有它的情况下调用它。

scala> def z() = println("i'm a function def")
z: ()Unit

scala> z
i'm a function def
Run Code Online (Sandbox Code Playgroud)

在你的情况下fun就像一个值定义(它是一个值参数)。

发生的情况是,当 Scala 评估您的for表达式时,它不会对fun.

只是一样的,如果你没有yVSy()从上面的例子。