方法参数的声明究竟是什么意思:
def myFunc(param: => Int) = param
上层定义中 =>
的含义是什么?
答案 0 :(得分:56)
这就是所谓的传递名称。这意味着您传递的函数应该返回Int
,但主要用于实现参数的延迟评估。它有点类似于:
def myFunc(param: () => Int) = param
这是一个例子。考虑answer
函数返回一些Int
值:
def answer = { println("answer"); 40 }
还有两个功能,一个是Int
,一个是Int
按名称:
def eagerEval(x: Int) = { println("eager"); x; }
def lazyEval(x: => Int) = { println("lazy"); x; }
现在使用answer
:
eagerEval(answer + 2)
> answer
> eager
lazyEval(answer + 2)
> lazy
> answer
第一种情况很明显:在评估eagerEval()
answer
之前,会打印"answer"
字符串。第二种情况更有趣。我们实际上是将一个函数传递给lazyEval()
。 lazyEval
首先打印"lazy"
并评估x
参数(实际上,调用x
函数作为参数传递。)
答案 1 :(得分:12)
只是为了确保有一个使用正确术语的答案:Scala语言规范使用术语按名称调用:
的第4.6.1节值参数的类型可以由=>预先固定,例如x:=> T.的类型 这样的参数就是无参数方法type => T.这表明了 在函数应用程序中不会评估相应的参数,但是 而是在函数内的每次使用时进行评估。也就是说,论证是 使用按名称调用进行评估。
答案 2 :(得分:7)
要添加Tomasz Nurkiewicz的上述答案,我遇到的差异是()=> Int和=> Int是第二个允许使用裸块进行调用:
scala> def myfunc(f : () => Int ) = println("Evaluated: " + f )
myfunc: (f: () => Int)Unit
scala> def myfunc2(f : => Int ) = println("Evaluated: " + f )
myfunc2: (f: => Int)Unit
scala> myfunc({1})
<console>:9: error: type mismatch;
found : Int(1)
required: () => Int
myfunc({1})
^
scala> myfunc2({1})
Evaluated: 1