ruby-on-rails - 如何在 Ruby 中为 new 创建一个未绑定(bind)的方法

标签 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_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)的方法。然而,在这种情况下,有问题的 moduleNote 的单例类,它只有一个实例,因此您只能 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/

相关文章:

ruby-on-rails - 将具有范围的自动增量添加到迁移文件 rails 中的现有列

ruby-on-rails - 无法使用渲染:text with a proc in Rails 4

ruby - Watir webdriver Errno::ECONNREFUSED:无法建立连接,因为目标机器主动拒绝了它。 - 连接(2)

ruby - class << self 是什么意思?

ruby - 如何通过元编程解决这个问题?

ruby - `&method(:method_ name)` 在 ruby 中是什么意思?

ruby-on-rails - 如何使用带有主干的超薄模板?

ruby-on-rails - 在 Ruby 中解析街道地址

javascript - 使用变量来访问对象值,如 Ruby 中的 Javascripts object[var]

sql - Postgresql 中的不同类型.. 如何正确执行此操作?