我有一些看起来像这样的代码:
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)
我错过了什么吗?
答案 0 :(得分:1)
不要低估语法糖。虽然可以通过直接调用.apply()
来完成大部分工作,但它可以使用它并且易于阅读。
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)
In mathematics and computer science, Apply is a function that applies functions to arguments.
对于Scala语言,apply()用于连接面向对象和函数式编程。在Scala中,一切都是一个对象,包括函数:一般来说," apply"方法是确保对象可以充当函数的便捷方法。