2015-01-02 166 views
0

方法調用間距不一致我有一個的getter/setter類:在斯卡拉

class Person { 
    private var _age = 0 

    //getter 
    def age = _age 

    //setter 
    def age_=(value: Int): Unit = _age = value 

    def echo(x: String): Unit = println(x) 
} 

我做了一些測試:

val p = new Person() 
//invoke age setter method 
p.age =(2) 
p age = 11 
p.age = 8-4 

// invoke echo method 
p.echo("Hello") 
p echo "Scala" 
p.echo "Johnson" //compile error here 

所以我就在編譯錯誤:

p.echo "Johnson" 

帶有錯誤訊息:

Error:(84, 16) ';' expected but string literal found. 
     p.echo "Johnson" //compile error here (why scala?) 
      ^

爲什麼p.age = 8-4工作正常,但我得到了p.echo "Johnson"錯誤?是因爲_=def age_=

UPDATE:

我做了一個實驗:

class Person { 

    ... 

    def echo = "Ginger" 
    def echo_=(x: String): Unit = println(x) 
} 

再變echo方法調用:

p.echo= ("Hello") 
p echo= "Scala" 
p.echo= "Johnson" 

他們工作得很好。但是如果我刪除了def echo = "Ginger",我會收到編譯錯誤。所以基於這個觀察,我得出了結論:setter方法的「魔術」取決於getter方法。如果沒有getter方法定義,魔法消失。

但這意味着我不能創建一個setter(只寫)方法??

+1

關於'_'的回答:需要在語法上創建一個標識符。每個符號(非alnum字符)應由至少一個「_」與字母數字字符分隔。 –

+0

@GáborBakos:謝謝。但是似乎下劃線只能使用一次,因爲當我嘗試這個時:'val x _ = _ x = 20',我得到了編譯錯誤。我還有一些關於它的問題,我想我最好爲此做一個單獨的問題。 – null

回答

3

這是因爲自由點,斯卡拉語法只允許你把括號,如果你也落了點:

1 + 2 // 3 
1.+(2) // 3 

1.+ 2 
// <console>:1: error: ';' expected but integer literal found. 
// 1.+ 2 
//  ^

基本上,它認爲你試圖調用一個無參數的方法echo,然後你有一個隨機的字符串在它後面。

+2

但是'p.age = 8-4'可以正常工作。 – null

+2

這是一個完全不同的,特殊處理的語法。這不是「age」是方法名稱,「=」是參數。編譯器將它轉換爲'p.age _ =(8-4)',而不是'p.age(=)...'。 – dhg

+0

查看我更新的問題。所有這些都來自** scala的魔法**? – null