Ruby on rails 如何在Ruby中为new创建一个未绑定的方法

Ruby on rails 如何在Ruby中为new创建一个未绑定的方法,ruby-on-rails,ruby,metaprogramming,function-pointers,Ruby On Rails,Ruby,Metaprogramming,Function Pointers,我有以下代码: 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_

我有以下代码:

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
class注释
现在我知道我不必用map来做这件事,我可以简单地使用
map{n|Note.new n}

但我想知道怎么做。下面的说明没有一个名为singleton_method的方法。当我尝试使用实例方法(定义中没有self)时,它会说该方法不存在。请告知。

尝试以下方法:

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

new_方法=(类为什么需要
未绑定的方法
?使用
未绑定的方法
没有什么明智的选择。特别是,你不能
调用它。你唯一能做的就是
将它绑定到
模块的一个实例
,你可以从中获得绑定的
方法然而,所讨论的
模块
注释
的单例类,它无论如何只有一个实例,因此您只能
将它绑定到
注释
。因此,您最好首先获得一个绑定的
方法

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
周围的一个不可操作的包装器,所以它也可以是一个
别名\u方法
。或者,更好的是,将其删除,它没有任何用途:

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\u方法

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
,那么你必须先绑定它,然后才能使用它,你必须从singleton类中得到它,因为
singleton\u 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

啊,这是一个解决办法,可以让单身阶级的自我变得正确吗?这真的是唯一正确的方法吗?@Senjai:差不多,是的。事实上,这不起作用。我试过玩它。把它放进去不起作用map@Senjai当前位置它回答了您的问题,但没有修复代码。我不太明白如何执行此操作。我尝试d想抓住新的,但认为这是“难以理解的”所以我定义了一个方法来获取它。我不知道我们可以在类上使用#方法。我认为它总是必须是instance#方法或singleton#方法。当我第一次尝试使用singleton#方法时,它说函数对于类注释是未定义的。我一直在尝试理解这类事情。为什么我必须在m中使用&ap?我想&相当于调用method.to_proc,难道我不能通过这个方法吗?我怎么知道呢。to_proc会产生什么结果?我想你也没有时间来证实这一点,对吧?谢谢你的帮助Jorg。