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