In Ruby, class declarations are just chunks of code, executed in order.
It's important to remember that inside a class definition, self
points to the class itself. validates
is a class method of ActiveRecord
. As the class is being defined, code in the definition is executed. The validates
method resolves to a class method of ActiveRecord
, so is called during class definition.
In your Person
example, it will only print once, because you only define the class once.
Consider the following:
class Foo
def self.validates_nothing(sym)
(@@syms ||= []) << sym
puts "!!! Here there be logic"
end
def validate
@@syms.each { |s| puts s }
end
end
This defines a class with a class method validates_nothing
, and an instance method, validate
. validates_nothing
just gathers whatever arguments are given it, validate
just dumps them out.
class Bar < Foo
validates_nothing :anything
validates_nothing :at_all
end
This defines a subclass. Note that when the class method validates_nothing
is called, it prints:
Here there be logic
Here there be logic
If we create a new bar and call validate, we get the expected output:
> Bar.new.validate
!!!anything
!!!at_all
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…