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

时间:2013-09-13 18:15:32

标签: ruby dynamic methods metaprogramming

我有一个简单的验证类:

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_开头的方法,则在子类实例上调用validate时也会调用它。通话顺序无关紧要。

2 个答案:

答案 0 :(得分:3)

应该如此简单:

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

答案 1 :(得分:3)

这是怎么回事?

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"