Scala的apply方法仅对隐藏新关键字有用吗?

时间:2014-03-12 13:55:22

标签: scala

我有一些看起来像这样的代码:

  object Money {
    def apply(dollars: BigInt, cents: BigInt) = new Money(dollars, cents)
  }

  class Money(dollars: BigInt, cents: BigInt) {
    override def toString() = dollars + "." + cents
  }

我试图了解apply函数的好处,但到目前为止只能将它视为一种语法糖,因此我不需要使用new运算符来构造Money对象。也就是说,我在申请功能中看不到很多好处,因为它为我所做的一切都在转变:

val money = new Money(2, 50) 

成:

val money = Money(2, 50)

我错过了什么吗?

2 个答案:

答案 0 :(得分:1)

不要低估语法糖。虽然可以通过直接调用.apply()来完成大部分工作,但它可以使用它并且易于阅读。

例如,让我们采取行动。 所有函数都是Scala中的对象。您可以通过以下方式定义函数:

object add extends Function2[Int, Int, Int] {
  def apply(x: Int, y: Int): Int = x + y
}

val z = add(1, 2) // same as add.apply(1, 2)

这与def add(x: Int, y: Int): Int = x + y的内容大致相同。允许()为apply函数的语法糖,可以将函数实现为对象,但在调用时自然会像函数一样运行。

正如一些评论所指出的那样,在Scala中也有一种惯例,即直接在伴随对象上使用的方法经常用于工厂方法。而不是直接实例化new Foo(bar),调用Foo.apply(bar)Foo(bar)可以调用更复杂的逻辑,为给定的输入创建适当的结果,即Foo或Foo的某个子类。

答案 1 :(得分:1)

来自Wikipedia

In mathematics and computer science, Apply is a function that applies functions to arguments.

对于Scala语言,apply()用于连接面向对象和函数式编程。在Scala中,一切都是一个对象,包括函数:一般来说," apply"方法是确保对象可以充当函数的便捷方法。