925 votes

classe << auto langage Ruby

Je suppose que ma question est exactement ce que le sujet se représente, ce n':

class << self

faire en Ruby?

958voto

Chris Jester-Young Points 102876

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.com

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.

Powered by:

X