有沒有更好的方法來獲取Ruby對象的公共「屬性」?有沒有更好的方法來獲取Ruby對象的公共「屬性」?
def props
self.public_methods.grep(/.=$/) - ["==","==="]
end
有沒有更好的方法來獲取Ruby對象的公共「屬性」?有沒有更好的方法來獲取Ruby對象的公共「屬性」?
def props
self.public_methods.grep(/.=$/) - ["==","==="]
end
那麼,在Ruby中沒有這樣的「屬性」。基本上,自從你創造了這個詞以後(或者更準確地說:你已經定義了它的定義,因爲它適用於Ruby),你可以定義它的含義,但是在另一方面它也意味着你必須自己實現它的語義。所以,如果你將「屬性」定義爲「以等號結尾但不完全由等號組成的方法」,那麼,是的,你的定義是最好的方法。 (順便說一句:你的「財產」的定義包括方法,如<=
,>=
和!=
,這可能會或可能不是你想要的是。)
在Ruby中,除非你做的元編程來破壞封裝,只有這樣,才能改變另一個對象的實例變量是調用碰巧這樣做的方法。沒有使用元編程,就無法告訴方法正在改變哪個實例變量。
舉例來說,如果我有一個人,那類有方法height_feet=
和height_meters=
在裏面,我也不能告訴我們,如果那人的高度是基於@height_feet
或@height_meters
甚至@height_cubits
實施。
這是一件好事,因爲它意味着你純粹編程接口,而不是實現。
所以,如果你想序列化對象或寫一個數據映射器......最常見的做法是什麼?最簡單的方法? – BuddyJoe 2010-12-18 07:33:43
@tyndall:我認爲這是一個單獨的問題。 – 2010-12-18 23:14:58
您的正則表達式不完整:它匹配以任何字符開頭的方法,而不僅僅是單詞字符。讓所有的「作家」的最好辦法是
methods.grep /^\w+=$/
而且正則表達式可以縮短到
methods.grep /\w=$/
,但目前還不太清楚。
正則表達式在開始處沒有'^',所以它匹配任何長度的方法名稱。 – 2011-03-15 22:14:22
正則表達式中的^表示字符串或行的開始,這與字符串的長度完全無關,並且在只有一行的方法名稱中尤爲不重要。 – Tom 2011-03-15 22:40:02
@Refactor:我的意思是指tyndall的正則表達式,而不是正則表達式。我的意思是說它已經與所有的「作家」相匹配。 – 2011-03-15 22:47:25
我想我的意思是屬性。已公開的類內部變量(公共)。正在查看YAML stdlib代碼,無法找到它在這些代碼上的循環。我確定它在那裏,但我找不到它。 – BuddyJoe 2010-12-17 00:28:43
小修正:!=不是一種方法。 – 2010-12-17 00:36:05
@Ryan:1.9甚至沒有? – 2010-12-17 01:20:32