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