gpt4 book ai didi

ruby define_method

转载 作者:太空宇宙 更新时间:2023-11-03 17:37:12 24 4
gpt4 key购买 nike

我必须通过以下测试:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com