【发布时间】:2012-10-21 12:07:34
【问题描述】:
我必须通过以下测试:
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 方法吗?
【问题讨论】:
-
您确定要重新定义
respond_to?吗?我怀疑这不是你想要做的。至少你几乎肯定不想在respond_to?中定义一个方法。 -
并非如此。但我想不出在第一次未找到后插入 find_by_bitrate 的任何其他方式。
-
但是
respond_to?在尝试调用对象上的方法时不会被调用,因此除非您的实际应用代码调用respond_to?,否则它不会定义find_by_bitrate。您使用的是 Ruby 1.9 吗?
标签: ruby metaprogramming