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}
    

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 .


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.


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


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.