我对#34;命名函数"感到困惑。
我们按def
定义方法,方法名称在def
之后。
例如def m() = () => ()
我们可以说这种方法的名称是m
。 "命名方法"很容易理解,我确定,没有匿名的方法。
我看到"匿名功能的解释"到处。 我知道匿名函数是函数类型的一个实例,我们可以很容易地找到匿名函数的例子。
然后,命名函数也必须是函数类型的实例。
我试着在这里举个例子。
例如val f = () => ()
我想这个函数的名称是f
。所以,这里有一个命名函数。
但是当我使用工具JD-GUI反编译类文件时,我认为f
不是名称,而是ObjectRef
。
概念"命名功能"合理?我完全搞砸了。
答案 0 :(得分:1)
我认为"命名功能"例如,指用def
关键字定义的嵌套函数。请考虑以下示例,这会产生影响:
def foo: Int = {
val f: Int => Int = x => return x
f(58)
42
}
println(foo) // returns 58
这里的x => return x
部分是匿名函数文字的正文。将函数文本分配给名为f
的变量的事实对return
语句没有影响:当达到return
时,整个方法foo
返回。在这种情况下,它返回58
,永远不会达到42
。
但是,对于名为的嵌套函数,这是不同的:
def bar: Int = {
def f(x: Int): Int = {
return x
}
f(58)
42
}
println(bar) // returns 42
此处,return
只保留嵌套函数f
,而不是整个bar
- 方法。语句位置中的表达式f(58)
计算为58
,然后被忽略。方法bar
然后返回42
。
单词"功能"比单词"方法"更有意义。在这种背景下。例如,嵌套函数f
实际上并没有绑定到包含bar
的类以外的某个类,并且无法在包含方法bar
的类的实例上调用它,因此它可能更好地称之为"功能"而不是"方法"。
答案 1 :(得分:1)
概念"命名功能"有意义吗?
规范声明:
返回表达式
return e
必须出现在一些封闭的命名方法或函数的主体内。
命名部分仅指方法,而不是函数。虽然正如@ som-snytt所阐述的那样,我们也可以拥有命名函数:
object A extends Function1[Int, Int]
将被视为命名函数。
联系Lightbend,这是关于"命名方法或功能的答复"规范定义的一部分:
这是一个规范错误 - 它应该只说“方法”。有 遗憾的是,在“方法”和“方法”之间存在一些混淆 “功能”。您可以在通道上方看到此实例 返回表达式,其中scalprod方法称为“函数”。 我将提交一份PR来澄清非本地回报的部分。
要回答您的问题,您应该只考虑返回表达式的范围规则的方法。