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}
    

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 .


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.


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


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.