C'est ennuyeux que vous ne puissiez pas google "->" - bonne question à poser!
Kevin
10
Vous pouvez @ Kevin, cependant, utiliser le débordement de pile de haut-élastique de recherche pour rechercher "->": title:"->" [ruby] is:question. La clé est d'utiliser les guillemets.
Sépare les clés des valeurs dans un littéral de carte de hachage.
->== Dash Rocket
Utilisé pour définir un littéral lambda dans Ruby 1.9.X (sans args) et Ruby 2.X (avec args). Les exemples que vous donnez ( ->(x) { x * 2 }& lambda { |x| x * 2 }) sont en fait équivalents.
FYI Les 2 styles ne sont pas entièrement interchangeables si vous utilisez do/ à endcause des règles de priorité. Imprime un lambda inspectée: puts -> do 1 end. Cela passe le bloc à puts, le volant de la lambda et provoquant une ArgumentError:puts lambda do 1 end
Kelvin
1
De plus, les littéraux lambda de ruby 1.9.3 autorisent les arguments.
Kelvin
3
@Kelvin ce serait parce que Ruby essaie d'interpréter puts lambda do 1 endcomme puts(lambda) do 1 endplutôt que puts(lambda do 1 end). Cette dernière fonctionne en fait - Ruby essaie simplement de passer le bloc à la putsméthode plutôt qu'à la lambdaméthode s'il n'y a pas de crochets.
PJSCopeland
1
@PJSCopeland Je ne dis pas que vous ne pouvez pas les amener à agir de la même manière. Je dis qu'ils ne sont pas 100% interchangeables au niveau de la syntaxe, c'est-à-dire que vous ne pouvez pas simplement faire un remplacement sans rendez-vous dans tous les cas (parce que parfois vous avez besoin de parenthèses supplémentaires pour lambda).
Kelvin
@rdurand Avez-vous effectué la modification avec un résumé "Les lambdas Stabby ne peuvent pas accepter les arguments dans Ruby 1.9"? Ce n'est pas exact, au moins pour 1.9.3 - les arguments sont autorisés.
->(x) { ... }est le même que lambda { |x| ... }. Il crée un lambda. Voir Kernel # lambda Un lambda est un type de proc qui garantit que le nombre de paramètres qui lui sont transmis est correct. Voir aussi Proc :: new et Kernel # proc .
"->"
:title:"->" [ruby] is:question
. La clé est d'utiliser les guillemets.ruby "->"
est la façon dont j'ai trouvé ce post :)Réponses:
Dans le langage de programmation Ruby ("Méthodes, Procs, Lambdas et fermetures"), un lambda défini à l'aide
->
est appelé littéral lambda .Le code est équivalent au suivant.
De façon informelle, je l'ai entendu s'appeler stabby lambda ou stabby littéral .
la source
=>
== Hash RocketSépare les clés des valeurs dans un littéral de carte de hachage.
->
== Dash RocketUtilisé pour définir un littéral lambda dans Ruby 1.9.X (sans args) et Ruby 2.X (avec args). Les exemples que vous donnez (
->(x) { x * 2 }
&lambda { |x| x * 2 }
) sont en fait équivalents.la source
do
/ àend
cause des règles de priorité. Imprime un lambda inspectée:puts -> do 1 end
. Cela passe le bloc àputs
, le volant de la lambda et provoquant une ArgumentError:puts lambda do 1 end
puts lambda do 1 end
commeputs(lambda) do 1 end
plutôt queputs(lambda do 1 end)
. Cette dernière fonctionne en fait - Ruby essaie simplement de passer le bloc à laputs
méthode plutôt qu'à lalambda
méthode s'il n'y a pas de crochets.lambda
).Fusée lambda
Je l'ai obtenu de cet article. Mais d'abord une recherche Google pour la sténographie ruby lambda http://ruby-journal.com/becareful-with-space-in-lambda-hash-rocket-syntax-between-ruby-1-dot-9-and-2-dot -0 /
la source
->(x) { ... }
est le même quelambda { |x| ... }
. Il crée un lambda. Voir Kernel # lambda Un lambda est un type de proc qui garantit que le nombre de paramètres qui lui sont transmis est correct. Voir aussi Proc :: new et Kernel # proc .la source