在類定義中,這兩種方法有什麼區別?def func(var)和def func =(var)有什麼區別?
def func(var)
...
end
def func=(var)
...
end
有沒有,或者是其中一個無效?
在類定義中,這兩種方法有什麼區別?def func(var)和def func =(var)有什麼區別?
def func(var)
...
end
def func=(var)
...
end
有沒有,或者是其中一個無效?
解釋這讀/寫器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)
。
它們都是有效的方法定義。但是,第二個是定義一個「二傳手」的方法 - 你可以調用這個方法的語法如下:
obj.func = 123
本聲明將被翻譯成
obj.func=(123)
你可以看看this answer哪裏我更詳細地解釋這個語法。
謝謝你的啓發:) – 2012-01-18 09:23:18
兩者都可能是一個setter,它真的取決於你使用的值。使用'='使它適合我們的想法,即賦值應該是什麼樣子,但它真的是錦上添花。其他語言的其他編程風格將查找參數的存在以決定它是一個setter還是一個getter。Tinman: – 2012-01-18 22:58:47
那麼=可以省略?它說沒有=的相同的東西? – 2012-01-19 14:52:31
如果您願意,這些定義了getter
和setter
方法。假設你有一個帶有電話屬性的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!
並感謝您使用的另一個很好的例子! – 2012-01-18 09:23:46
不客氣@Roger。與大多數語言相比,Ruby有最好的語法之一:) – Anurag 2012-01-18 09:35:43
好的,現在我明白了......非常感謝你的解釋:D – 2012-01-19 17:19:43
@RogerNordqvist,沒問題。當我學習Ruby時,它讓我產生了循環,因爲我來自其他語言並不那麼靈活。 – 2012-01-19 17:45:28