我有这个代码:
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 来执行此操作,我可以简单地使用 map {|n|注意.new n}
但我想知道如何做到这一点。下面说 Note 没有一个叫做 singleton_method 的方法。当我尝试使用实例方法(定义中没有 self )时,它说该方法不存在。请指教。
最佳答案
为什么需要 UnboundMethod
?使用 UnboundMethod
可以明智地做的事情不多。特别是,您不能调用
它。您唯一可以做的就是将它绑定(bind)
到您从中获取它的模块
的一个实例,以获得绑定(bind)的方法
。然而,在这种情况下,有问题的 module
是 Note
的单例类,它只有一个实例,因此您只能 bind
它注意
。因此,您不妨首先获得一个绑定(bind)的 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
关于ruby-on-rails - 如何在 Ruby 中为 new 创建一个未绑定(bind)的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16847900/