web-dev-qa-db-fra.com

Que signifie << en Ruby?

J'ai du 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

qu'est-ce que << signifier?

58
Vyacheslav Loginov

'<<' comme 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 ici ).

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" car c'est vraiment une méthode qui est définie sur un objet que vous pouvez remplacer ou implémenter pour vos propres objets. Autres cas de "<<"

  • Concaténation de chaînes: "a" << "b"
  • Écriture de la sortie sur un IO: io << "Une ligne de texte\n"
  • Écriture de données dans un résumé de message, HMAC ou chiffre: 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 changement de la portée actuelle (= changement de soi) dans le flux 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 me demander et enquêter sur les internes là-bas. Alors que dans tous les exemples que j'ai mentionnés << est vraiment une méthode définie dans une classe, c'est-à-dire.

obj << stuff

est équivalent à

obj.<<(stuff)

le class << self (ou tout objet à la place de soi) est vraiment différent. C'est vraiment une fonction intégrée du langage lui-même, dans CRuby, il est défini dans parse.y comme

k_class tLSHFT expr

où tLSHFT est un jeton "<<", k_class est le mot-clé "class" et expr est une expression arbitraire. Autrement dit, vous pouvez réellement écrire

class << <any expression>

et sera "décalé" dans la classe singleton du résultat de l'expression. La séquence tLSHFT sera analysée comme une expression 'NODE_SCLASS', qui est appelée une définition de 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

Et, comment pourrais-je les oublier, Voici les documents utilisez '<<' d'une manière qui est encore totalement différente. Vous pouvez définir facilement une chaîne qui s'étend sur plusieurs lignes en déclarant

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

Pour distinguer l'opérateur "ici doc", un délimiteur de chaîne arbitraire doit immédiatement suivre 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 est que l'utilisation de ce dernier ignorera tout espace blanc de début ou de fin.

107
emboss

Généralement utilisé dans les tableaux pour ajouter la valeur à la fin du tableau.

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

donne ceci

  ["orange", "Apple"] 
26
shajin

C'est l'opérateur qui vous permet d'alimenter existants tableaux, en en ajoutant de nouveaux éléments.

Dans l'exemple ci-dessus, vous remplissez simplement le tableau vide threads avec 5 nouveaux threads.

7
Emiliano Poggi

'a << b' signifie ajouter b à la fin d'un

6
Aditya Mukherji

Dans Ruby '<<' 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 actives dans Ruby. Par exemple, nous avons un modèle Cart et LineItem associé en tant que cart has_many line_items. Cart.find (A) .line_items renverra l'objet ActiveRecord :: Associations avec les éléments de ligne qui appartiennent au panier "A".

Maintenant, pour ajouter (ou dire associer) un autre line_item (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, nous n'allons pas créer d'objet line_item (je veux dire, ne créera pas manuellement un objet activerecord)

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

Dans le code ci-dessus << enregistrera l'objet et l'ajoutera au tableau d'association d'enregistrement actif du côté gauche.

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

4
shubham mishra

Dans Ruby vous avez toujours plus d'une façon de faire les choses. Donc, Ruby a quelques bons raccourcis pour les noms de méthode communs. 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 ces éléments 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

vous voyez donc 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 à un autre.

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

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