這是編寫的代碼,不使用別名的方式。它包含一個類方法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
是的。我的道歉,我在移動,並沒有足夠的滾動來看第二個和第三個參數! –