function - 为什么 Scala 类方法不是一等公民?

标签 function scala methods

我刚刚开始使用 Scala 并且正在修改工作表。例如:

def merp(str: String) : String = s"Merrrrrrrp $str"
val merp2 = (str: String) => s"Merrrrrrrp $str"
val merp3 = (str: String) => merp(str)
val merp4 = merp _
merp("rjkghleghe")
merp4("rjkghleghe")

以及相应的工作表结果:
merp: merp[](val str: String) => String
merp2: String => String = <function1>
merp3: String => String = <function1>
merp4: String => String = <function1>
res0: String = Merrrrrrrp rjkghleghe
res1: String = Merrrrrrrp rjkghleghe

比如说,val merp5 = merp产生错误,因为显然方法不能像函数那样是值。但是我仍然可以将方法作为参数传递。我在以下代码片段中演示了这一点,改编自 a similar SO question :
def intCombiner(a: Int, b: Int) : String = s"herrrrrrp $a derrrrrrp $b"
def etaAbstractor[A, B](combineFoo: (A, B) ⇒ String, a: A, b: B) = combineFoo(a, b)
etaAbstractor(intCombiner, 15, 16)

工作表结果:
intCombiner: intCombiner[](val a: Int,val b: Int) => String
etaAbstractor: etaAbstractor[A,B](val combineFoo: (A, B) => String,val a: A,val b: B) => String
res10: String = herrrrrrp 15 derrrrrrp 16

  • 方法不是一流是一种限制,可能是由 Scala 的 JVM 交互强加的,还是语言设计中的决定?
  • 为什么我需要自己滚动 eta abstractions ,如 merp3 ?
  • merp4还有一个 eta abstraction ,还是偷偷摸摸地相似?
  • 为什么我的 etaAbstractor工作? Scala 正在悄悄取代 intCombinerintCombiner _ ?

  • 欢迎提供理论的、计算机科学的答案,以及指向 language specification 中任何相关点的指针。 .谢谢!

    最佳答案

    免责声明:我不是计算机科学家,但我会尝试猜测:

  • 方法是对象的一部分,不存在于对象之外。你不能单独传递方法。闭包是另一种(等价的?)封装状态的方式,通过将对象方法转换为独立函数(顺便说一下,这只是另一个在 Scala 中使用 apply() 方法的对象)您正在创建一个闭包。这个过程被称为 eta 扩展。 §3.3.1 , §6.26.5
  • 你不必。您也可以写信val merp3 : (String => String) = merp . §6.26.5
  • 是的,merp4也是eta扩展。 §6.7
  • §6.26.2
  • 关于function - 为什么 Scala 类方法不是一等公民?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30495571/

    相关文章:

    sql - 光滑的条件和(scala)

    python - a == b 为假,但 id(a) == id(b) 为真?

    python - 使用方法进行列表理解时 eval 的范围

    c - 为什么我应该在 C 中声明一个函数?

    java - 通用类型参数的 T、U、V 约定从何而来?

    scala - 在 Scala 中动态生成案例类

    c# - 定义一个 C# 方法,它接受任何可以与方括号一起使用的对象

    java - 逐个字符串比较文件

    python - 多重分组(迭代或应用函数)

    c - 如何在 C 中调用(不定义)具有可变参数的函数?