Je suppose que ma question est exactement ce que le sujet se représente, ce n':
class << self
faire en Ruby?
Je suppose que ma question est exactement ce que le sujet se représente, ce n':
class << self
faire en Ruby?
Tout d'abord, l' class << foo
de la syntaxe ouvre foo
'classe singleton (eigenclass). Cela vous permet de vous spécialiser le comportement des méthodes appelées sur cet objet spécifique.
a = 'foo'
class << a
def inspect
'"bar"'
end
end
a.inspect # => "bar"
a = 'foo' # new object, new singleton class
a.inspect # => "foo"
Maintenant, pour répondre à la question: class << self
ouvre self
'classe singleton, de sorte que les méthodes peuvent être redéfinis pour le courant self
objet (qui à l'intérieur d'une classe ou d'un module de corps est la classe ou le module lui-même). Habituellement, ce est utilisé pour définir la classe/module ("statique") méthodes:
class String
class << self
def value_of obj
obj.to_s
end
end
end
String.value_of 42 # => "42"
Cela peut aussi être écrit comme une abréviation:
class String
def self.value_of obj
obj.to_s
end
end
Ou encore plus court:
def String.value_of obj
obj.to_s
end
Quand à l'intérieur d'une définition de fonction, self
se réfère à l'objet dont la fonction est appelée. Dans ce cas, class << self
ouvre la classe singleton pour cet objet; une utilisation de ce est de mettre en œuvre un pauvre homme d'état de la machine:
class StateMachineExample
def process obj
process_hook obj
end
private
def process_state_1 obj
# ...
class << self
alias process_hook process_state_2
end
end
def process_state_2 obj
# ...
class << self
alias process_hook process_state_1
end
end
# Set up initial state
alias process_hook process_state_1
end
Ainsi, dans l'exemple ci-dessus, chaque instance d' StateMachineExample
a process_hook
alias process_state_1
, mais notez comment, dans le dernier cas, elle peut redéfinir process_hook
( self
seulement, ne pas affecter les autres StateMachineExample
des occurrences) process_state_2
. Donc, chaque fois qu'un correspondant appelle l' process
méthode (qui appelle redéfinissables process_hook
), les changements de comportement en fonction de quel état il est.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.