Это методы класса или «синглтон». Один из них, с которым вы должны быть знакомы, это attr_accessor. Мы можем реализовать что-то подобное в тестовом классе.
class Klass
def self.add_getter_and_setter(symbol)
module_eval "def #{symbol}; @#{symbol}; end"
module_eval "def #{symbol}=(val); @#{symbol} = val; end"
end
end
class Person < Klass
add_getter_and_setter :name
add_getter_and_setter :phone
end
person = Person.new
person.name = 'John Smith'
person.phone = '555-2344'
person # returns <Person:0x28744 @name="John Smith", @phone="555-2344">
В приведенном выше примере мы создали метод класса с помощью 'def self.add_getter_and_setter', но это не единственный способ.
class Klass
class << self # opens the singleton class
def add_getter_and_setter(symbol) # note we dont specify self as it is already within the context of the singleton class
..
end
end
end
Использование расширения. Модуль # extends - это метод, который расширяет класс методами класса, также как и метод Module # include включает класс с методами экземпляра.
class Klass
extend(Module.new do
def add_getter_and_setter(symbol)
..
end
end)
end
Если Klass уже определен, мы можем открыть его снова, чтобы добавить методы класса
class Klass
end
def Klass.add_getter_and_setter(symbol)
..
end
# or
class << Klass
def add_getter_and_setter(symbol)
..
end
end
Ну, вот несколько способов, которыми я знаю, как это сделать, поэтому, если вы видите другой синтаксис, просто поймите, что все это делает одно и то же.
Примечание: в rails распространенным методом класса, который мы все используем, является 'find'. Он запускается непосредственно из класса Model.
person = Person.find(1) # finds a person with id:1