scala - Scala 的 apply() 方法魔法是如何工作的?

标签 scala syntactic-sugar magic-methods companion-object

在 Scala 中,如果我在类或顶级对象中定义了一个名为 apply 的方法,则每当我将一对括号附加到该类的实例时,就会调用该方法,并且将 apply() 的适当参数放在它们之间。例如:

class Foo(x: Int) {
    def apply(y: Int) = {
        x*x + y*y
    }
}

val f = new Foo(3)
f(4)   // returns 25

所以基本上,object(args) 只是 object.apply(args) 的语法糖。

Scala 如何进行这种转换?

这里是否存在全局定义的隐式转换,类似于 Predef 对象中的隐式类型转换(但种类不同)?或者是某种更深层次的魔法?我问这个问题是因为 Scala 似乎强烈支持一致应用较小的一组规则,而不是带有许多异常(exception)的许多规则。最初这对我来说似乎是一个异常(exception)。

最佳答案

我认为没有比你最初所说的更深入的事情了:这只是编译器转换 f(a) 的语法糖。进入f.apply(a)作为特殊的语法情况。

这可能看起来像是一个特定的规则,但其中只有少数(例如, update )允许 DSL -类似的结构和库。

关于scala - Scala 的 apply() 方法魔法是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1223834/

相关文章:

scala - scala 中泛型抽象类型的模式匹配

java sugaring,我可以在这里避免几乎重复的代码吗?

haskell - 是否可以在 Haskell 中使用自己的语法糖(如 do 表示法或箭头表示法)?

python - 为什么魔术方法不会被 python 中的 __getattr__ 实现拦截?

scala - 如何在scala中访问名称为 "creative"的对象?

java - 为什么 scala.util.matching.Regex 'apparently' 在 Scala 提取器中失败?

scala - 函数组合、Kleisli 箭头和一元定律

c++ - 向 vector 添加可变大小元素列表的语法糖?

php - 为什么 PHP 在对象上下文中使用静态方法?

php - 检查神奇设置的属性上是否存在属性