使用未知符号发送的默认方法处理程序

时间:2014-02-06 14:26:17

标签: ruby

我定义了一个我打算调用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)

这不起作用。有没有办法实现这个目标?

2 个答案:

答案 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>