Como você chama o operador -> em Ruby?

205
  1. Como você chama o ->operador como a seguir?

    ->(...) do
      ...
    end
    
  2. Os seguintes trechos não são equivalentes?

    succ = ->(x) {x + 1}
    succ = lambda {|x| x + 1}
    
Matt - sanemat
fonte
70
É irritante que você não possa pesquisar no Google -> "- boa pergunta a ser feita!
Kevin
10
@ Kevin você pode, no entanto, usar de Stack Overflow built-in Elastic Pesquisar para procurar "->": title:"->" [ruby] is:question. A chave é usar as aspas.
8
Symbolhound também pode fazer isso: symbolhound.com/?q=-%3E+ruby
Andrew Grimm
7
irritante ou não irritante, mas pesquisar no pedido "ruby ->" fornece um link para essa pergunta como o primeiro resultado principal.
que você
6
@ Kevin talvez as coisas mudaram nos últimos 2 anos, mas googling ruby "->"é como eu encontrei este post :)
Nippysaurus

Respostas:

238

Na linguagem de programação Ruby ("Métodos, Procs, Lambdas e Closures"), um lambda definido usando ->é chamado literal lambda .

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

O código é equivalente ao seguinte.

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

Informalmente, ouvi dizer que é chamado de stabby lambda ou stabby literal .

kiamlaluno
fonte
127

=>== Hash Rocket

Separa as chaves dos valores em um literal de mapa de hash.


->== Dash Rocket

Usado para definir um literal lambda no Ruby 1.9.X (sem args) e Ruby 2.X (com args). Os exemplos que você dá ( ->(x) { x * 2 }& lambda { |x| x * 2 }) são de fato equivalentes.

Yarin
fonte
10
FYI Os dois estilos não são totalmente intercambiáveis ​​se você usar do/ enddevido a regras de precedência. Esta função imprime um lambda inspecionado: puts -> do 1 end. Isto passa do bloco para puts, roubar do lambda e causando um ArgumentError:puts lambda do 1 end
Kelvin
1
Além disso, os literais lambda do ruby ​​1.9.3 permitem argumentos.
Kelvin #
3
@ Kelvin isso seria porque Ruby tenta interpretar puts lambda do 1 endcomo puts(lambda) do 1 endao invés de puts(lambda do 1 end). De fato, o último funciona - Ruby apenas tenta passar o bloco para o putsmétodo, e não para o lambdamétodo, se não houver colchetes.
PJSCopeland
1
@PJSCopeland Não estou dizendo que você não pode fazê-los agir da mesma maneira. Estou dizendo que eles não são 100% intercambiáveis ​​em termos de sintaxe, ou seja, você não pode simplesmente fazer uma substituição em todos os casos (porque às vezes você precisa de parênteses extras lambda).
Kelvin
@rdurand Você fez a edição com o resumo "Lambdas stabby não podem aceitar argumentos no Ruby 1.9"? Isso não é exato, pelo menos para 1.9.3 - argumentos são permitidos.
Kelvin
3

->(x) { ... }é o mesmo que lambda { |x| ... }. Cria um lambda. Consulte Kernel # lambda Um lambda é um tipo de proc, que garante que o número de parâmetros passados ​​para ele esteja correto. Veja também Proc :: new e Kernel # proc .

Cary Swoveland
fonte