嘗試瞭解如何編寫可以在對象上調用的實例方法(通過Object#my_method表示法)。我只能通過將我的對象作爲參數傳遞給方法來獲得所需的結果,但我想了解另一種編寫方法的方法。對象上的Ruby調用方法而不是將方法作爲參數傳遞給方法
class Anagram
attr_reader :test_word
def initialize(test_word)
@test_word = test_word.downcase
end
def word_stats(word)
word.downcase.split("").inject(Hash.new(0)) { |h,v| h[v] += 1; h }
end
def match(word_list)
word_list.delete_if { |word| word.downcase == test_word }
word_list.find_all do |word|
word_stats(test_word) == word_stats(word) # <= ** THIS LINE **
end
end
end
我知道我需要改變word_stats
方法,但我不知道該如何重寫粗體那行,這樣我可以代替做這樣的事情:
test_word.word_stats == word.word_stats
這是send
的適當位置?有沒有辦法編寫word_stats
方法,以便它不需要參數?
謝謝!
這種方法提供的功能就是我正在尋找的功能,但我已經以這種方式警告過元編程(例如,「如果您將方法定義粘貼到核心Ruby類中,那麼您做錯了」除非你正在編寫一個包裝器,一個庫等等) – Jim 2014-09-05 16:05:02
re:「做錯了」:如果你不與別人共享代碼,它可能會覆蓋或導致衝突其他代碼,導致一個真正難以追蹤的錯誤。這個想法是我們可以擴展類,但是我們想要小心地做,並且意識到可能的後果。 – 2014-09-05 16:10:04
Jim,不管你是否想要定義一個新的'String'方法,如果你想寫'word.word_stats',這與'word.send(:word_stats)'相同,這是你唯一的選擇。這隻有在爲類「word.class」定義了實例方法':word_class'時纔有效。順便提一句,這不是元編程;這是多種花園式的方法創作。 – 2014-09-05 16:38:12