1

我有一个简单的验证类:

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 时也会调用该方法。调用顺序无关紧要。

4

2 回答 2

3

应该很简单:

methods.filter {|m| m.to_s.start_with? 'validate_'}.each {|m| send m, mapping}
于 2013-09-13T18:28:35.773 回答
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"
于 2013-09-13T18:28:50.667 回答