我定义了一个我打算调用send
的类:
class Decoder
def Foo
"Decoding Foo"
end
end
decoder = Decoder.new
puts "Foo: '#{decoder.send :Foo}'"
# => Foo: 'Decoding Foo'
Decoder
有其他此类方法。我想用一个没有定义相应方法的符号调用send
,并调用一个默认的处理程序。在这个默认处理程序中,我想知道发送了什么符号。如果未定义Baz
,我想要此输出:
decoder = Decoder.new
puts "Baz: '#{decoder.send :Baz}'"
# => <Unhandled Baz>
我试过这样的事情:
class Decoder
def DefaultHandler
"<Unhandled XXX>"
end
end
decoder = Decoder.new
puts "Baz: '#{decoder.send :Baz}'"
# => undefined method `Baz' for #<Decoder:0x7fa461882a68> (NoMethodError)
这不起作用。有没有办法实现这个目标?
答案 0 :(得分:3)
首先,您不应该使用大写字符串命名方法。其次,如果要捕获未定义方法的调用,则应覆盖BasicObject#method_missing
方法:
class Decoder
def foo
"Decoding foo"
end
def bar
"Decoding bar"
end
def method_missing name, *args
"<Unhandled #{name} with args passed: #{args}>"
end
end
答案 1 :(得分:2)
class Decoder
def method_missing m, *_
"<Unhandled #{m}>"
end
end
puts Decoder.new.send :SomethingUndefined
# => <Unhandled SomethingUndefined>