动态救援条款,此代码如何工作?

时间:2014-10-22 11:20:05

标签: ruby error-handling metaprogramming

def errors_matching(&block)
  m = Module.new
  (class << m ;self; end).instance_eval do
    define_method(:===, &block)
  end
  m
end

这允许我在Ruby中定义动态救援子句,例如:

begin
  raise 'hi'
rescue errors_matching { |e| e.class.name.include?('Runtime') } => e
  puts "Ignoring #{e.message}"
end

我不明白第一段代码。 m = Module.new的重点是什么,然后将self(在这种情况下是主要的)置于单例类中并对其执行instance_eval?

1 个答案:

答案 0 :(得分:1)

这:

class << m; self end

显然与:

相同
m.singleton_class

并且

m.singleton_class.instance_eval { define_method(:foo) {} }

相同
m.define_singleton_method(:foo) {}

所以,整个errors_matching方法只是一种非常复杂的说法:

def errors_matching(&block)
  Module.new.tap do |m| m.define_singleton_method(:===, &block) end
end