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]{…}
。也是案例类的同伴,通常是。但这是一种实用的方法。我不知道这是否就是为什么他们在这里给予这种区别不应有的重视