Scala 函数参数类型和=>;

Scala 函数参数类型和=>;,scala,parameters,declaration,Scala,Parameters,Declaration,方法参数声明的确切含义是: def myFunc(param: => Int) = param =>在上面的定义中是什么意思?这就是所谓的按名称传递。这意味着您正在传递一个函数,该函数应返回Int,但主要用于实现参数的延迟求值。这有点类似于: def myFunc(param: () => Int) = param 这里有一个例子。考虑一个回答< /代码>函数返回一些 int 值: def answer = { println("answer"); 40 } 和两个函数,一个取

方法参数声明的确切含义是:

def myFunc(param: => Int) = param
=>
在上面的定义中是什么意思?

这就是所谓的按名称传递。这意味着您正在传递一个函数,该函数应返回
Int
,但主要用于实现参数的延迟求值。这有点类似于:

def myFunc(param: () => Int) = param
这里有一个例子。考虑一个<代码>回答< /代码>函数返回一些<代码> int <代码>值:

def answer = { println("answer"); 40 }
和两个函数,一个取
Int
,一个取
Int
按名称:

现在使用
answer
执行这两个命令:

eagerEval(answer + 2)
> answer
> eager

lazyEval(answer + 2)
> lazy
> answer
第一种情况很明显:在调用
earceeval()
answer
之前,将对
进行评估并打印
回答“
字符串。第二个案例更有趣。实际上,我们正在将一个函数传递给
lazyEval()
lazyEval
首先打印
“lazy”
并计算
x
参数(实际上,调用作为参数传递的
x
函数)

另见

只是为了确保有一个使用正确术语的答案:Scala语言规范使用术语“按名称调用”:

值参数的类型可以通过=>预先确定,例如x:=>T。类型 这样的参数就是无参数方法类型=>T。这表明 在函数应用时不计算相应的参数,而是 而是在函数中的每次使用时进行评估。也就是说,论点是正确的 使用名称调用进行计算


--第4.6.1节为了补充上面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
scala>def myfunc(f:()=>Int)=println(“已评估:+f)
myfunc:(f:()=>Int)单位
scala>def myfunc2(f:=>Int)=println(“已评估:+f)
myfunc2:(f:=>Int)单位
scala>myfunc({1})
:9:错误:类型不匹配;
发现:Int(1)
必需:()=>Int
myfunc({1})
^
scala>myfunc2({1})
评价:1

您需要的术语是“按名称传递”,而不是“按值传递”。通过值传递是完全不同的事情;这是Java对原语所做的。我想你的意思是“按名称调用”,而不是“按名称传递”或“按值传递”(参见语言规范4.6.1)道歉,因为这个问题已经被回答了,但是,为了让我的头脑明白这一点,如果上面的两个函数都没有最后的“x”返回/调用,那么只有“急切地求救(…)'将执行'answer'函数,因为'lazyEval(…)'函数中至少需要一个'x'引用,因为lazyEval()使用Scala的“按名称调用”功能(即在lazyEval(…)'name:TYPE'参数定义中包含'=>')。我现在已经证实了我的怀疑。在“lazyEval()”函数中,省略对按名称定义的调用(=>)参数/函数“x”的内部调用会阻止调用“x”。但是,当参数x也作为参数传递时,省略'quengeeval()'中的同一个x调用并不能阻止对参数x的求值。我讨厌这个答案,因为它混淆了零参数函数和Scala的按名称传递参数之间的区别。在将来使用。可能重复的不知道我是如何找到它的。。。我想我应该换一下眼镜……:)堆栈溢出搜索没有帮助——它忽略符号。这就是为什么符号猎犬被创造的原因。我不知道。。好提示。。谢谢你+1.
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