ruby define_method

标签 ruby metaprogramming

我必须通过以下测试:

def test_can_find_by_arbitrary_fields
  assert @library.respond_to? :find_by_artist
  assert !@library.respond_to?(:find_by_bitrate)
  @library.add_song({ :artist => 'Green Day',
                     :name => 'American Idiot',
                     :bitrate => 192 })
  assert @library.respond_to?(:find_by_bitrate)
end

我不确定我该怎么做。

我试过:

def respond_to?(method)
     if self.public_methods.include? method
         true
     elsif (method == :find_by_bitrate)
         define_method :find_by_bitrate, ->(default = nrb)  { @songs.select |a| a[:bitrate] == nrb }       
         false
     else
         false
end

但它说“define_method 未定义”。有什么方法可以定义 find_by_bitrate 方法吗?

最佳答案

您可以在第一次调用方法时在 method_missing 中定义方法。

您是否应该尚待讨论,但这是比 respond_to? 更好的选择。

class Foo
  def method_missing(sym)
    puts "Method missing; defining."
    self.class.send(:define_method, sym) do
      puts "Called #{sym}."
    end
  end
end

健全性检查:

f = Foo.new
=> #<Foo:0x007fa6aa09d3c0>
f.wat
=> Method wat missing; defining.
f.wat
=> Called wat.
f2 = Foo.new
=> Called wat.

关于 ruby define_method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13168009/

相关文章:

ruby-on-rails - 使用保存卡的 Paypal 并行支付

python - pytest测试类生成器: order of tests

ruby-on-rails - 通过发送更新 ActiveRecord

c++ - 使用 MPL 列表扩展 boost 变体

ruby - 在 ruby​​ 中获取 OAuth token (用于 Mendeley API)

ruby-on-rails - ruby rails : What Reporting and/or Charting Tools Are Available?

metaprogramming - 将引用的 Elixir 代码转换为代码字符串

ruby - Ruby 中绑定(bind)/解除绑定(bind)方法的目的是什么?

ruby - 这个带有 struct 的对象构造在内部如何工作?

ruby-on-rails - 运行脚本/服务器时如何定义常量?