如何调用以给定字符串开头的名称的类的所有实例方法



我有一个简单的验证类:

class MappingValidator
    def validate(mapping)
    end
    protected
    def validate_presence_of_title(mapping)
      ...
    end
    def validate_presence_of_key(mapping)
      ...
    end
    def validates_class_exists(mapping)
      ...
    end
  end

validate方法中,我想调用任何以 validate_ 开头的方法并将mapping作为参数传递。这也需要适用于MappingValidator的子类,因此如果子类声明以validate_开头的方法,则在子类实例上调用验证时也会调用该方法。调用顺序无关紧要。

这是怎么回事?

class MappingValidator
    def validate(mapping)
       self.methods.grep(/^validate_/).each do |m|
         send(m,mapping)
       end
    end
    protected
    def validate_presence_of_title(mapping)
      p "1"
    end
    def validate_presence_of_key(mapping)
      p "2"
    end
    def validates_class_exists(mapping)
      p "3"
    end
end
MappingValidator.new.validate("validate_")
# >> "1"
# >> "2"

应该像这样简单:

methods.filter {|m| m.to_s.start_with? 'validate_'}.each {|m| send m, mapping}