86 votes

Que signifie << en Ruby ?

J'ai un code :

  def make_all_thumbs(source)
    sizes = ['1000','1100','1200','800','600']
    threads = []
    sizes.each do |s|
      threads << Thread.new(s) {
        create_thumbnail(source+'.png', source+'-'+s+'.png', s)
      }
    end
  end

que fait << C'est-à-dire ?

173voto

emboss Points 20708

Il peut avoir 3 significations distinctes :

'<<' comme une méthode ordinaire

Dans la plupart des cas, '<<' est une méthode définie comme les autres, dans votre cas, cela signifie "ajouter à la fin de ce tableau" (voir aussi aquí ).

C'est dans votre cas particulier, mais il y a aussi beaucoup d'autres occasions où vous rencontrerez la méthode "<<". Je ne l'appellerai pas 'opérateur' puisqu'il s'agit en réalité d'une méthode définie sur un objet qui peut être surchargée par vous ou implémentée pour vos propres objets. Autres cas de "<<

  • Concaténation de chaînes de caractères : "a" << "b"
  • Écriture de la sortie vers un IO : io << "Une ligne de texte". \n "
  • Écriture de données dans un condensé de message, un HMAC ou un chiffrement : sha << "Texte à hacher"
  • décalage à gauche d'un OpenSSL::BN : bn << 2
  • ...

Définition de la classe singleton

Ensuite, il y a le mystérieux déplacement de la portée actuelle (= changement de soi) dans le déroulement du programme :

class A
  class << self
    puts self # self is the singleton class of A
  end
end

a = A.new
class << a
  puts self # now it's the singleton class of object a
end

Le mystère class << self m'a fait m'interroger et enquêter sur les internes. Alors que dans tous les exemples que j'ai mentionnés << est en réalité une méthode définie dans une classe, à savoir

obj << stuff

est équivalent à

obj.<<(stuff)

le site class << self (ou tout autre objet à la place du soi) la construction est vraiment différente. Il s'agit d'une fonctionnalité intégrée au langage lui-même, dans CRuby, elle est définie dans la section parse.y comme

k_class tLSHFT expr

k_class est le mot-clé "classe", où tLSHFT est un jeton '<<' et expr est une expression arbitraire. C'est-à-dire que vous pouvez réellement écrire

class << <any expression>

et obtiendra décalé dans la classe singleton du résultat de l'expression. Le site tLSHFT sera analysée en tant qu'expression 'NODE_SCLASS', qui est appelée un Définition de la classe Singleton (cf. node.c)

case NODE_SCLASS:
    ANN("singleton class definition");
    ANN("format: class << [nd_recv]; [nd_body]; end");
    ANN("example: class << obj; ..; end");
    F_NODE(nd_recv, "receiver");
    LAST_NODE;
    F_NODE(nd_body, "singleton class definition");
    break; 

Documents ici

Documents ici utiliser "<<" d'une manière qui est encore une fois totalement différente. Vous pouvez définir une chaîne de caractères qui s'étend sur plusieurs lignes de manière pratique en déclarant

here_doc = <<_EOS_
The quick brown fox jumps over the lazy dog.
...
_EOS_

Pour distinguer l'opérateur "here doc", un délimiteur de chaîne arbitraire doit suivre immédiatement le "<<". Tout ce qui se trouve entre ce délimiteur initial et la deuxième occurrence de ce même délimiteur fera partie de la chaîne finale. Il est également possible d'utiliser '<<-', la différence étant que l'utilisation de ce dernier ignorera tout espace en tête ou en queue de chaîne.

31voto

shajin Points 1728

Principalement utilisé dans les tableaux pour ajouter la valeur à la fin du tableau.

a = ["orange"]
a << "apple"
puts a

donne ceci

  \["orange", "apple"\] résultat.

3 votes

Une autre utilisation de << est en héritage de la classe

7voto

shubham mishra Points 950

En ruby l'opérateur '<<' est essentiellement utilisé pour :

  1. Ajout d'une valeur dans le tableau (à la dernière position)

    [2, 4, 6] << 8 Cela donnera [2, 4, 6, 8]

  2. Il est également utilisé pour certaines opérations d'enregistrement actif dans ruby. Par exemple, nous avons un modèle Cart et LineItem associés comme cart has_many line_items. Cart.find(A).line_items retournera l'objet ActiveRecord::Associations avec les articles de ligne qui appartiennent au panier 'A'.

Maintenant, pour ajouter (ou dire associer) un autre article (X) au panier (A),

Cart.find(A).line_items << LineItem.find(X)
  1. Maintenant pour ajouter un autre LineItem au même panier 'A', mais cette fois-ci nous n'allons pas créer d'objet line_item (je veux dire que nous ne créerons pas d'objet activeecord manuellement).

    Cart.find(A).line_items << LineItem.new

Dans le code ci-dessus << va enregistrer l'objet et l'annexer au tableau d'association d'enregistrement actif de gauche.

Et beaucoup d'autres qui sont déjà couverts dans les réponses ci-dessus.

7voto

empo Points 12803

C'est l'opérateur qui vous permet de nourrir existant les tableaux, par ajout de nouveaux articles.

Dans l'exemple ci-dessus, vous ne faites que remplir le tableau vide. threads avec 5 nouveaux fils.

6voto

Jesus Gonzalez Points 117

En Ruby, il y a toujours plus d'une façon de faire les choses. Ainsi, Ruby a quelques raccourcis sympathiques pour les noms de méthodes communes. comme celui-ci est pour .push au lieu de taper le nom de la méthode .push, vous pouvez simplement utiliser <<, l'opérateur de concaténation. en fait dans certains cas vous pouvez utiliser n'importe lequel de ceux-ci pour la même opération .push et + avec <<.

Comme vous pouvez le voir dans cet exemple :

alphabet = ["a", "b", "c"]
alphabet << "d" # Update me!
alphabet.push("e") # Update me!
print alphabet 
caption = "the boy is surrounded by "
caption << "weezards!" # Me, too!
caption += " and more. " # Me, too!
# .push can no be uses for concatenate 
print caption

donc vous voyez que le résultat est :

["a", "b", "c", "d", "e"]
the boy is surrounded by weezards! and more.

vous pouvez utiliser l'opérateur << pour pousser un élément dans un tableau ou pour concaténer une chaîne à une autre.

Donc, ce que cela fait, c'est créer un nouvel élément/objet de type Thread et le pousser dans le tableau.

 threads << Thread.new(s) {
        create_thumbnail(source+'.png', source+'-'+s+'.png', s)
      }

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