В Ruby объявления классов - это просто фрагменты кода, выполняемые по порядку.
Важно помнить, что внутри определения класса self
указывает на сам класс. validates
- это метод класса ActiveRecord
. Поскольку класс определяется, код в определении выполняется. Метод validates
преобразуется в метод класса ActiveRecord
, поэтому он называется во время определения класса .
В вашем примере Person
он будет напечатан только один раз, потому что вы определяете класс только один раз.
Примите во внимание следующее:
class Foo
def self.validates_nothing(sym)
(@@syms ||= []) << sym
puts "!!! Here there be logic"
end
def validate
@@syms.each { |s| puts s }
end
end
Это определяет класс с методом класса validates_nothing
и методом экземпляра validate
. validates_nothing
просто собирает любые аргументы, которые ему даны, validate
просто выводит их.
class Bar < Foo
validates_nothing :anything
validates_nothing :at_all
end
Это определяет подкласс. Обратите внимание, что когда вызывается метод класса validates_nothing
, он печатает:
Here there be logic
Here there be logic
Если мы создадим новый бар и вызовем validate, мы получим ожидаемый результат:
> Bar.new.validate
!!!anything
!!!at_all