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?
'<<' 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 "<<"
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.
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"]
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.
'a << b' signifie ajouter b à la fin d'un
Dans Ruby '<<' opérateur est essentiellement utilisé pour:
Ajout d'une valeur dans le tableau (à la dernière position)
[2, 4, 6] << 8 Cela donnera [2, 4, 6, 8]
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)
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.
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)
}