scala中的命名函数是什么?

时间:2018-04-11 13:55:20

标签: scala

我对#34;命名函数"感到困惑。

我们按def定义方法,方法名称在def之后。

例如def m() = () => ()我们可以说这种方法的名称是m。 "命名方法"很容易理解,我确定,没有匿名的方法。

我看到"匿名功能的解释"到处。 我知道匿名函数是函数类型的一个实例,我们可以很容易地找到匿名函数的例子。

然后,命名函数也必须是函数类型的实例。

我试着在这里举个例子。 例如val f = () => ()我想这个函数的名称是f。所以,这里有一个命名函数。

但是当我使用工具JD-GUI反编译类文件时,我认为f不是名称,而是ObjectRef

概念"命名功能"合理?我完全搞砸了。

2 个答案:

答案 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来澄清非本地回报的部分。

要回答您的问题,您应该只考虑返回表达式的范围规则的方法。