2013-09-30 24 views
5

按照Scala的書, 「編程在斯卡拉」 -在斯卡拉,賦值運算符「=」是一個方法調用嗎?

Scala is an object-oriented language in pure form: every value is an object and every operation is a method call. For example, when you say 1 + 2 in Scala, you are actually invoking a method named + defined in class Int.

在這個意義上,使用約賦值運算什麼 「=」 操作?這也是一種方法嗎?似乎不太可能,因爲它必須存在於所有類或一些常見的超類(比如說java.lang.Object?)中,所有類都必須從中繼承它。或者說,並非所有的操作都是真正的Scala方法調用?

回答

11

沒有。賦值運算符(=)是保留字。也低於是:

_:= => < - <:<%>:#@

對於一個更全面的列表,請參閱§ 1.1。有關=的更多信息,請參閱§ 6.12.4

所以是的,這不是一個方法調用。

+0

在列表中找到模(%)運算符也有點令人驚訝。在我看來,它類似於其他基本的算術運算符,如+, - 等,也可能也是一種方法。 –

+3

@Sumit它不是'%',而是'<%'類型參數中的隱式視圖的語法糖 – 4lex1v

+0

當然,謝謝你指出了Alexlv。 –

13

有點除Jatin回答。有一種情況下,=可以被視爲方法調用,但實際上它只是一個語法糖。在Scala中,當醜陋var生活的面向對象的一部分,你可以寫:

class Test { 
    private var x0: Int = 0 
    def x = x0 
    def x_=(a: Int) = x0 = a 
} 

然後,您可以指定新的整數到x

scala> val t = new Test 
t: Test = [email protected] 

scala> t.x = 1 
t.x: Int = 1 

的最後一行將被脫到t.x_=(1)。我認爲在這種情況下,考慮句法糖,可以說=是一個方法調用。

+0

**你的意思是** syntatic sugar **?這是否意味着scala編譯器在背後做魔術? – null

+0

是的!這是編譯器。 @suud – Jatin

2

而其他的答案是標準的Scala是正確的,有一個叫Scala-Virtualized其中=和其它控制結構方法調用的變體。

+0

我真的希望這個項目將合併到主線斯卡拉。從純粹的面向對象的角度來看,能夠實現'var'和'='的行爲是有意義的,更多的是'if','while'等。 –