2013-05-31 42 views
2

創建一個不受約束的方法對新我有這樣的代碼:如何在Ruby中

class Note < Struct.new :value 
    def to_s 
    value.to_s 
    end 
    def self.use_new(arg) 
    Note.new arg 
    end 
end 

class Chord 
    def initialize(arr) 
    @arr = arr 
    end 

    def play 
    @arr.join('-') 
    end 
end 
new_method = Note.singleton_method(:use_new) 
chords = %w{ G Bb Dd E } 
c = Chord.new(chords.map(:new_method)) 
puts c.play 

現在我知道我沒有地圖要做到這一點,我可以簡單地使用map {|n| Note.new n}

但我想知道如何做到這一點。下面說的Note沒有一個叫做singleton_method的方法。當我嘗試使用實例方法(在定義中沒有自己)時,它說該方法不存在。請指教。

回答

2

爲什麼要UnboundMethodUnboundMethod沒有太多明智的做法。特別是,你不能call它。你唯一能做的就是bind它來自module的一個實例,你爲了獲得一個綁定Method。然而,在這種情況下,module問題是Note的單例類,無論如何它只有一個實例,因此您只能將bindNote。所以,你或許也同樣擺在首位獲取綁定Method

new_method = Note.method(:use_new) 
chords = %w{ G Bb Dd E } 
c = Chord.new(chords.map(&new_method)) # BTW: you had a typo here 
puts c.play 

我也搞不懂你的Note::use_new的目的是什麼。它僅僅是一個圍繞Note::new的無操作包裝,所以它可能只是一個alias_method。或者,甚至更好,只是將其刪除,它沒有服務器的任何目的:

new_method = Note.method(:new) 
chords = %w{ G Bb Dd E } 
c = Chord.new(chords.map(&new_method)) # BTW: you had a typo here 
puts c.play 

您可以使用singleton_method爲好,如果你想只確保獲得單方法:

new_method = Note.singleton_method(:use_new) 
chords = %w{ G Bb Dd E } 
c = Chord.new(chords.map(&new_method)) # BTW: you had a typo here 
puts c.play 

如果你真的堅持上得到一個UnboundMethod,那麼你將不得不bind首先,纔可以使用它,你必須從單例類得到它,因爲singleton_method返回Method不是UnboundMethod

new_method = Note.singleton_class.instance_method(:use_new) 
chords = %w{ G Bb Dd E } 
c = Chord.new(chords.map(&new_method.bind(Note))) 
puts c.play 
+0

我真的不明白如何做到這一點。我試圖抓住新的,但認爲它是「無法忍受的」,所以我定義了一種方法來抓住它。我不知道我們可以在課堂上使用#方法。我認爲它總是必須是instance_method或singleton_method。當我第一次嘗試使用singleton_method時,它說這個函數對於Note類是未定義的。我一直試圖瞭解很長一段時間這種事情。爲什麼我必須在地圖中使用&?我認爲是調用method.to_proc的等式,我不能通過該方法嗎?我怎麼知道.to_proc產量? – Senjai

+0

我不認爲你會有時間來確認這一點嗎? http://stackoverflow.com/questions/16824244/understanding-ruby-metaprogramming-using-method-added-to-overwrite-instance-meth 感謝您的幫助Jorg。 – Senjai

2

試試這個:

new_method = (class << Note; self; end).instance_method(:use_new) 

這解決的主要問題,但仍有一些人。

+0

啊,這是解決方法,讓singleton類的自我吧?這真的是唯一正確地做到這一點的方法嗎? – Senjai

+0

@Senjai:很好,是的。 – Linuxios

+0

其實這並不奏效。我試着玩弄它。把它不會在地圖上工作 – Senjai