2014-03-12 23 views
0

我有一些代碼,看起來像這樣:Scala的應用方法僅對隱藏新關鍵字有用嗎?

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

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

我想了解的應用功能的好處,但至今只能把它看作一個類型的語法糖,讓我不要需要使用新的操作符來構造一個Money對象。也就是說,我沒有看到在應用功能有很大的好處,因爲所有它做對我來說是把這個:

val money = new Money(2, 50) 

到:

val money = Money(2, 50) 

我缺少的東西?

+0

它就像一個Factory方法,可以在不更改所有用戶代碼的情況下更改該方法(例如返回Money的子類)。 –

回答

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

Wikipedia

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

在Scala語言的情況下,應用()是用來連接面向對象和功能編程。在Scala中,一切都是一個對象,包括函數:一般來說,「apply」方法是確保對象可以充當函數的便捷方式。

相關問題