Comment appelez-vous l'opérateur -> dans Ruby?

205
  1. Comment appelez-vous l' ->opérateur comme suit?

    ->(...) do
      ...
    end
  2. Les extraits suivants ne sont-ils pas équivalents?

    succ = ->(x) {x + 1}
    succ = lambda {|x| x + 1}
Matt - sanemat
la source
70
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.
8
Symbolhound peut également le faire: symbolhound.com/?q=-%3E+ruby
Andrew Grimm
7
ennuyeux ou pas ennuyeux, mais googler pour la demande "ruby ->" donne un lien vers cette question comme premier résultat supérieur.
fl-web
6
@Kevin peut-être que les choses ont changé au cours des 2 dernières années, mais googler ruby "->"est la façon dont j'ai trouvé ce post :)
Nippysaurus

Réponses:

238

Dans le langage de programmation Ruby ("Méthodes, Procs, Lambdas et fermetures"), un lambda défini à l'aide ->est appelé littéral lambda .

succ = ->(x){ x+1 }
succ.call(2)

Le code est équivalent au suivant.

succ = lambda { |x| x + 1 }
succ.call(2)

De façon informelle, je l'ai entendu s'appeler stabby lambda ou stabby littéral .

kiamlaluno
la source
127

=>== Hash Rocket

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.

Yarin
la source
10
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.
Kelvin
3

->(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 .

Cary Swoveland
la source