Apa yang Anda sebut -> operator di Ruby?

205
  1. Apa yang Anda sebut ->sebagai operator sebagai berikut?

    ->(...) do
      ...
    end
    
  2. Bukankah cuplikan berikut ini setara?

    succ = ->(x) {x + 1}
    succ = lambda {|x| x + 1}
    
Matt - sanemat
sumber
70
Sangat menyebalkan bahwa Anda tidak dapat google "->" - pertanyaan yang bagus untuk ditanyakan!
Kevin
10
@ Kevin Anda bisa, bagaimanapun, menggunakan Stack Overflow built-in elastis pencarian untuk mencari "->": title:"->" [ruby] is:question. Kuncinya adalah menggunakan tanda kutip.
8
Symbolhound juga dapat melakukan ini: symbolhound.com/?q=-%3E+ruby
Andrew Grimm
7
menjengkelkan atau tidak mengganggu, tetapi googling untuk permintaan "ruby ->" berikan tautan ke pertanyaan ini sebagai hasil teratas pertama.
fl-web
6
@Kevin mungkin banyak hal telah berubah dalam 2 tahun terakhir, tetapi googling ruby "->"adalah bagaimana saya menemukan posting ini :)
Nippysaurus

Jawaban:

238

Dalam Bahasa Pemrograman Ruby ("Metode, Procs, Lambdas, dan Penutupan"), lambda yang didefinisikan menggunakan ->disebut lambda literal .

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

Kode ini setara dengan yang berikut ini.

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

Secara informal, saya telah mendengarnya disebut lambda lamban atau lusuh harfiah .

kiamlaluno
sumber
127

=>== Hash Rocket

Memisahkan kunci dari nilai dalam literal peta hash.


->== Dash Rocket

Digunakan untuk mendefinisikan lambda literal dalam Ruby 1.9.X (tanpa args) dan Ruby 2.X (dengan args). Contoh yang Anda berikan ( ->(x) { x * 2 }& lambda { |x| x * 2 }) sebenarnya setara.

Yarin
sumber
10
FYI 2 gaya tidak sepenuhnya dapat dipertukarkan jika Anda menggunakan do/ endkarena aturan diutamakan. Ini mencetak sebuah lambda Diperiksa: puts -> do 1 end. Ini melewati blok ke puts, mencuri dari lambda dan menyebabkan ArgumentError:puts lambda do 1 end
Kelvin
1
Juga, ruby ​​1.9.3's lambda literals memungkinkan argumen.
Kelvin
3
@Kelvin yang akan karena Ruby mencoba untuk menafsirkan puts lambda do 1 endsebagai puts(lambda) do 1 endbukan puts(lambda do 1 end). Yang terakhir sebenarnya bekerja - Ruby hanya mencoba untuk meneruskan blok ke putsmetode daripada lambdametode jika tidak ada tanda kurung.
PJSCopeland
1
@ PJSCopeland Saya tidak mengatakan Anda tidak bisa membuat mereka bertindak sama. Saya mengatakan bahwa itu bukan 100% sintaks yang dapat dipertukarkan, yaitu Anda tidak bisa hanya melakukan penggantian drop-in dalam semua kasus (karena kadang-kadang Anda membutuhkan tanda kurung tambahan untuk lambda).
Kelvin
@rdurand Apakah Anda melakukan edit dengan ringkasan "Stabby lambdas tidak dapat menerima argumen di Ruby 1.9"? Ini tidak akurat, setidaknya untuk 1.9.3 - argumen diperbolehkan.
Kelvin
3

->(x) { ... }sama dengan lambda { |x| ... }. Itu menciptakan lambda. Lihat Kernel # lambda A lambda adalah jenis proc, yang memastikan jumlah parameter yang dilewatinya benar. Lihat juga Proc :: new dan Kernel # proc .

Cary Swoveland
sumber