函数参数类型和=>

时间:2012-02-29 23:01:59

标签: scala parameters declaration

方法参数的声明究竟是什么意思:

def myFunc(param: => Int) = param

上层定义中 => 的含义是什么?

3 个答案:

答案 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语言规范使用术语按名称调用

  

值参数的类型可以由=>预先固定,例如x:=> T.的类型   这样的参数就是无参数方法type => T.这表明了   在函数应用程序中不会评估相应的参数,但是   而是在函数内的每次使用时进行评估。也就是说,论证是   使用按名称调用进行评估。

- Scala Language Specification

的第4.6.1节

答案 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