72 votes

Ruby héritage de classe: qu'est-Ce que `<<"(double moins)?

class << Awesomeness

Qu'est-ce que c' << ? J'ai cherché, mais les résultats ne me dites à propos de la concaténation de chaîne...

133voto

Rob Davis Points 7639

C'est vrai qu' class << something est la syntaxe pour une classe singleton, comme quelqu'un d'autre a dit, c'est le plus souvent utilisé pour définir les méthodes de la classe dans une définition de classe. Mais ces deux utilisations sont compatibles. Voici comment.

Ruby vous permet d'ajouter des méthodes à une quelconque instance en faisant ceci:

class << someinstance
  def foo
    "Hello."
  end
end

Cela ajoute une méthode foo de someinstance, pas à sa classe, mais à une instance particulière. (En fait, foo est ajouté à l'instance de la "classe singleton," mais c'est plus ou moins une mise en œuvre caprice.) Après le code ci-dessus s'exécute, vous pouvez envoyer la méthode foo à someinstance:

someinstance.foo   => "Hello."

mais vous ne pouvez pas envoyer de foo à d'autres instances de la même classe. C'est ce qu' << est nominalement. Mais les gens on tendance à utiliser cette fonctionnalité pour syntaxiques de la gymnastique comme ceci:

class Thing
  def do_something
  end

  class << self
    def foo
      puts "I am #{self}"
    end
  end
end

Lorsque ce code -- la définition de cette classe -- exécute, qu'est - self? C'est la classe Thing. Ce qui signifie class << self est la même chose que de dire "ajoutez les méthodes suivantes de la classe de Chose." C'est, foo est une méthode de classe. Après terminé, vous pouvez le faire:

t = Thing.new
t.do_something  => does something
t.class.foo     => "I am Thing"
t.foo           => NoMethodError: undefined method `foo'

Et quand vous pensez à ce qui << est en train de faire, tout fait sens. C'est une façon d'ajouter à une instance particulière, et dans la plupart des cas, l'instance étant annexée est une classe, de sorte que les méthodes à l'intérieur du bloc de devenir les méthodes de la classe.

En bref, c'est un laconique de façon à créer des méthodes de la classe au sein d'une classe de définition de bloc. Une autre solution serait de faire:

class Thing
  def self.foo
    # ...
  end
end

Même chose. Votre exemple est en fait une erreur de syntaxe, mais si vous comprenez comment << est utilisé avec les instances et le mot-clé class, vous saurez comment le corriger.

19voto

Zabba Points 26372

<< est la syntaxe pour "Singleton définition de la classe". Voici un exemple d'où/comment il est "généralement".

En a = "abc"; a << "xyz" c'est la syntaxe pour "ajouter des données" (string, array, etc.)

18voto

Andrew Grimm Points 22996

Si vous voulez héritage (en fonction de votre question titre), vous voulez qu'un seul <:

class Awesome < ParentAwesomeness

Le code que vous fournissez n'est pas valide ruby:

class Awesomeness
end

class Awesome << Awesomeness
end

SyntaxError: (irb):3: syntax error, unexpected tLSHFT, expecting '<' or ';' or '\n'

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