Il s'agit de méthodes de classe ou de méthodes "singleton". L'une d'entre elles, attr_accessor, devrait vous être familière. Nous pouvons implémenter une méthode similaire dans une classe de test.
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">
Dans l'exemple ci-dessus, nous avons créé la méthode de classe avec 'def self.add_getter_and_setter' mais ce n'est pas la seule façon.
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
Utilisation de la méthode extend. Module#extend est une méthode qui étend une classe avec des méthodes de classe, de même que la méthode Module#include inclut une classe avec des méthodes d'instance.
class Klass
extend(Module.new do
def add_getter_and_setter(symbol)
..
end
end)
end
Si Klass a déjà été défini nous pouvons le rouvrir pour ajouter des méthodes de classe
class Klass
end
def Klass.add_getter_and_setter(symbol)
..
end
# or
class << Klass
def add_getter_and_setter(symbol)
..
end
end
Ce sont les quelques méthodes que je connais pour faire cela, donc si vous voyez différentes syntaxes, réalisez simplement qu'elles font toutes la même chose.
Remarque : dans les rails, une méthode de classe commune que nous utilisons tous est "find". Elle est exécutée directement à partir de la classe Model.
person = Person.find(1) # finds a person with id:1