2012-01-18 115 views

回答

2

解釋這讀/寫器AKA getter/setter方法有些事情在Ruby中:

Ruby沒有強迫我們在方法定義使用=的制定者。我們可以選擇該方法是否有一個。

考慮一下:

class Foo 

    # automagically creates: 
    # .v 
    # .v= 
    attr_accessor :v 

    def initialize(v) 
    puts "inside initialize(#{ v })" 
    @v = v 
    end 

    def setter(v) 
    puts "inside setter(#{ v })" 
    @v = v 
    end 

    def setter=(v) 
    puts "inside setter=(#{ v })" 
    @v = v 
    end 

end 

f = Foo.new(1) 
puts f.v 

f.setter(2) 
puts f.v 

f.setter = 3 
puts f.v 

f.setter=(4) 
puts f.v 

f.v = 5 
puts f.v 

f.v=(6) 
puts f.v 

運行代碼輸出:

inside initialize(1) 
1 
inside setter(2) 
2 
inside setter=(3) 
3 
inside setter=(4) 
4 
5 
6 

=是方法名只是另一封信因爲Ruby是足夠聰明,知道如果看到f.setter = 3它應該使用setter=(v)方法。

Ruby不會強制使用=來設置變量,您可以決定在定義方法時它對您是否更有意義。我們使用=是慣用的,因爲它有助於讓制定者看起來像一個任務,消除了所有制片人名字的衝動,如set_v(v)

+0

好的,現在我明白了......非常感謝你的解釋:D – 2012-01-19 17:19:43

+0

@RogerNordqvist,沒問題。當我學習Ruby時,它讓我產生了循環,因爲我來自其他語言並不那麼靈活。 – 2012-01-19 17:45:28

6

它們都是有效的方法定義。但是,第二個是定義一個「二傳手」的方法 - 你可以調用這個方法的語法如下:

obj.func = 123 

本聲明將被翻譯成

obj.func=(123) 

你可以看看this answer哪裏我更詳細地解釋這個語法。

+0

謝謝你的啓發:) – 2012-01-18 09:23:18

+0

兩者都可能是一個setter,它真的取決於你使用的值。使用'='使它適合我們的想法,即賦值應該是什麼樣子,但它真的是錦上添花。其他語言的其他編程風格將查找參數的存在以決定它是一個setter還是一個getter。Tinman: – 2012-01-18 22:58:47

+0

那麼=可以省略?它說沒有=的相同的東西? – 2012-01-19 14:52:31

1

如果您願意,這些定義了gettersetter方法。假設你有一個帶有電話屬性的Person類。

class Person 
    def phone 
    @phone 
    end 

    def phone=(number) 
    @phone = number 
    end 
end 

現在,你可以通過簡單的設置,這將調用phone=方法的屬性更改手機的屬性(在@phone內部管理)。

john = Person.new 
john.phone = "123-456-7890" 

它看起來像外面的財產分配。您可以在方法名稱末尾堆疊的其他字符爲布爾型獲取器的?,破壞性操作的!。再次,這些只是慣例,你可以自由地使用這三個字符,只要你想。但是,這些符號在代碼中看起來更自然。例如,

question.closed? 
document.destroy! 
+0

並感謝您使用的另一個很好的例子! – 2012-01-18 09:23:46

+1

不客氣@Roger。與大多數語言相比,Ruby有最好的語法之一:) – Anurag 2012-01-18 09:35:43

相關問題