你为什么要一个UnboundMethod
?您可以明智地使用UnboundMethod
. 特别是,你不能call
。您唯一能做的就是bind
将它添加到您从中获取它的实例module
以获取 bound Method
。然而,在这种情况下,有module
问题的是Note
's 单例类,它无论如何只有一个实例,所以你只能bind
将它用于Note
. 因此,您不妨一开始就受到约束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
如果你真的坚持要得到 an UnboundMethod
,那么你必须先得到bind
它,然后才能使用它,并且你必须从单例类中得到它,因为singleton_method
返回 aMethod
不是 an 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