这是编写的代码,不使用别名的方式。它包含一个类方法validate
,它指定验证方法和要调用验证方法的方法。可以多次调用此方法validate
以更改验证器并动态验证。
class ActiveClass
end
将所有的方法不是在命名(比如说)MidClass
的ActiveClass
一个子类的验证等。
class MidClass < ActiveClass
def do_this_method(v,a,b)
puts "this: v=#{v}, a=#{a}, b=#{b}"
end
def do_that_method(v,a,b)
puts "that: v=#{v}, a=#{a}, b=#{b}"
end
def yet_another_method(v,a,b)
puts "yet_another: v=#{v}, a=#{a}, b=#{b}"
end
end
MidClass.instance_methods(false)
#=> [:do_this_method, :do_that_method, :yet_another_method]
广场的验证,有一类方法validate
在一起,在一个名为(说)的MidClass
一个子类。
class SubClass < MidClass
def self.validate(validator, *validatees)
superclass.instance_methods(false).each do |m|
if validatees.include?(m)
define_method(m) do |v, *args|
send(validator, v)
super(v, *args)
end
else
define_method(m) do |v, *args|
super(v, *args)
end
end
end
end
private
def validator1(v)
puts "valid1, v=#{v}"
end
def validator2(v)
puts "valid2, v=#{v}"
end
end
SubClass.methods(false)
#=> [:validate]
SubClass.private_instance_methods(false)
#=> [:validator1, :validator2]
类方法validate
传递要使用的验证方法的符号以及要验证的方法。我们来试试吧。
sc = SubClass.new
SubClass.validate(:validator1, :do_this_method, :do_that_method)
sc.do_this_method(1,2,3)
# valid1, v=1
# this: v=1, a=2, b=3
sc.do_that_method(1,2,3)
# valid1, v=1
# that: v=1, a=2, b=3
sc.yet_another_method(1,2,3)
# yet_another: v=1, a=2, b=3
现在更改验证。
SubClass.validate(:validator2, :do_that_method, :yet_another_method)
sc.do_this_method(1,2,3)
# this: v=1, a=2, b=3
sc.do_that_method(1,2,3)
# valid2, v=1
# that: v=1, a=2, b=3
sc.yet_another_method(1,2,3)
# valid2, v=1
# yet_another: v=1, a=2, b=3
当super
不加参数从通常的方法调用时,所有参数和一个块中,如果有一个,被传递到超级。但是,如果该方法是使用define_method
创建的,则不会将参数(并且不包含任何块)传递给super。在后一种情况下,论据必须明确。
我想通过一个块或过程super
如果有一个,但一直在使用错误的秘密酱油。我希望为此提供建议。
您是否希望'first_validate_something'在任何*方法被调用之前调用(甚至是'to_s')?如果不是,它应该如何决定哪些方法“挂钩”? –
first_validate只列出作为参数的方法之前调用,所以在这种情况下#do_this_method和#do_that方法 这是该方法的定义是什么样子,从SteveTurczyn偷:before_operations(before_method,*方法) 不那回答你的问题? – Trajanson
是的。我的道歉,我在移动,并没有足够的滚动来看第二个和第三个参数! –