scala中的命名函数是什么?
我对“命名函数”感到困惑 我们通过scala中的命名函数是什么?,scala,Scala,我对“命名函数”感到困惑 我们通过def定义一个方法,方法的名称位于def之后 e、 g.defm()=()=>()我们可以说这个方法的名称是m。“命名方法”很容易理解,而且我确信,没有匿名方法 我到处都能看到关于“匿名函数”的解释。 我知道匿名函数是函数类型的实例,我们可以很容易地找到匿名函数的示例 然后,命名函数也必须是函数类型的实例 我试着给自己举个例子。 e、 g.val f=()=>()我想这个函数的名称是f。这里有一个命名函数 但是当我使用工具JD-GUI反编译类文件时,我觉得f不是
def
定义一个方法,方法的名称位于def
之后
e、 g.defm()=()=>()
我们可以说这个方法的名称是m
。“命名方法”很容易理解,而且我确信,没有匿名方法
我到处都能看到关于“匿名函数”的解释。
我知道匿名函数是函数类型的实例,我们可以很容易地找到匿名函数的示例
然后,命名函数也必须是函数类型的实例
我试着给自己举个例子。
e、 g.val f=()=>()
我想这个函数的名称是f
。这里有一个命名函数
但是当我使用工具JD-GUI反编译类文件时,我觉得f
不是一个名称,而是一个ObjectRef
“命名函数”的概念有意义吗?我完全搞砸了。我认为“命名函数”指的是用def
关键字定义的嵌套函数。考虑下面的例子,这会产生不同:
def foo: Int = {
val f: Int => Int = x => return x
f(58)
42
}
println(foo) // returns 58
这里的x=>returnx
部分是匿名函数文本的主体。函数文本被分配给名为f
的变量这一事实对return
语句没有影响:当到达return
时,整个方法foo
返回。在这种情况下,它返回58
,并且永远不会到达42
但是,这与命名嵌套函数不同:
def bar: Int = {
def f(x: Int): Int = {
return x
}
f(58)
42
}
println(bar) // returns 42
这里,返回
只留下嵌套函数f
,而不是整个条
-方法。语句位置中的表达式f(58)
计算为58
,然后被忽略。方法bar
然后返回42
在这种情况下,“功能”一词比“方法”一词更有意义。例如,嵌套函数f
实际上并没有绑定到包含bar
的类以外的其他类,并且它不能在包含方法bar
的类的实例上调用,因此最好将其称为“函数”而不是“方法”
“命名函数”的概念有意义吗
该规范规定:
返回表达式returne
必须出现在某个封闭的命名方法或函数的主体内
命名部分仅引用方法,而不是函数。尽管@som snytt详细阐述了这一点,但我们也可以使用命名函数:
object A extends Function1[Int, Int]
将被视为命名函数
编辑:
联系Lightbend,这是关于规范定义中“命名方法或函数”部分的回复:
这是一个规范错误-它应该只是说“方法”。有
不幸的是,规范中对“方法”和
“功能”。你可以在这篇文章的正上方看到一个例子
返回表达式,其中scapprod方法称为“函数”。
我将提交一份PR,以澄清关于非本地回报的部分
要回答您的问题,您应该只考虑返回表达式的作用域规则。在什么上下文中遇到“命名函数”这个短语?我不清楚您的困惑是什么。你不明白函数值是如何工作的吗?@Andreytytukin在Scala语言规范6.20返回表达式中说,“返回表达式returne必须出现在某个封闭的命名方法或函数体中。”我认为这里专门使用“named”。强调方法或函数必须有名称。Scala中没有“命名函数”。函数从来没有名字,方法总是有名字,类可能有名字,也可能没有名字。我认为traits和singleton对象总是有名称,变量也总是有名称。但是,嵌套函数(即
def
中的def
)有名称@汪李之: 不幸的是,SLS使用“函数”一词的方式相当松散,有时指函数对象,有时指方法,有时两者都指。f
不是函数,而是方法。@YuvalItzchakov称之为“嵌套函数”。该方法称之为“嵌套方法”。我个人更喜欢“嵌套函数”这个名称,因为我看不到任何可以调用f
的对象,但是如果当前的官方指南将其称为“嵌套方法”,我也同意。这是一个有趣的想法,可能是对的,但术语使用得比较松散。方法可能是成员,但重载解析涉及函数。方法类型和函数类型在这里没有真正的帮助。你能详细说明一下这句话的第二部分是什么意思吗?如果“命名”部分仅指方法,则第二部分似乎表示“返回表达式返回e
必须出现在某个封闭函数体内部”。但是我不知道如何解释它,因为例如valc={valf:Int=>Int={x=>returnx};f(42)}
产生一个编译错误“返回到方法定义之外”。语句的第二部分指的是什么功能?是否只是无意中使用了遗留术语嵌套函数->嵌套方法
?规范继续说,“anon fun的apply方法不算作命名函数。”因此,这个答案是不够的。@som snytt您认为规范存在问题,因为它混合了“命名函数”和“命名方法”互换?这显然是一个命名函数objectx扩展了Function1[Int,Int]{…}
。也是案例类的同伴,通常是。但这是一种实用的方法。我不知道这是否就是为什么他们在这里给予这种区别不应有的重视