Ruby'de -> operatörü ne diyorsunuz?


205
  1. ->Aşağıdaki gibi operatöre ne diyorsunuz ?

    ->(...) do
      ...
    end
    
  2. Aşağıdaki snippet'ler eşdeğer değil mi?

    succ = ->(x) {x + 1}
    succ = lambda {|x| x + 1}
    

70
Google "->" - sormak iyi bir soru olamaz can sıkıcı!
Kevin

10
Eğer, bununla birlikte, yığın taşması yerleşik Elastik Ara aramak için kullanabilirsiniz @Kevin "->": title:"->" [ruby] is:question. Anahtar tırnak işaretlerini kullanmaktır.

8
Symbolhound ayrıca bunu yapabilir: symbolhound.com/?q=-%3E+ruby
Andrew Grimm

7
sinir bozucu veya sinir bozucu değil, ama "yakut ->" isteği için googling ilk en iyi sonuç olarak bu soruya bağlantı vermek.
fl-web

6
@Kevin belki de son 2 yılda işler değişti, ancak googling ruby "->"bu
yazıyı

Yanıtlar:


238

Gelen Dili Programlama Ruby ( "Methods, Yordamlara, Lambdas ve Kilitler"), bir lambda kullanılarak tanımlanır ->adlandırılır lambda değişmez .

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

Kod aşağıdakine eşdeğerdir.

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

Gayri resmi olarak, stabby lambda veya stabby literal olarak adlandırıldığını duydum .


127

=>== Karma Roket

Anahtarları karma harita değişmezindeki değerlerden ayırır.


->== Çizgi Roket

Ruby 1.9.X (argüman olmadan) ve Ruby 2.X (argüman ile) lambda değişmezini tanımlamak için kullanılır. Verdiğiniz ( ->(x) { x * 2 }& lambda { |x| x * 2 }) örnekler aslında eşdeğerdir.


10
FYI Öncelik kuralları nedeniyle do/ kullanırsanız, 2 stil birbirinin yerine kullanılamaz end. Bu teftiş lambda yazdırır: puts -> do 1 end. Bu, bloğa geçer puts, lambdadan çalar ve bir ArgumentError'a neden olur:puts lambda do 1 end
Kelvin

1
Ayrıca, yakut 1.9.3'ün lambda değişmezleri argümanlara izin verir.
Kelvin

3
Yakut yorumlamaya çalışır çünkü olurdu @Kelvin puts lambda do 1 endolarak puts(lambda) do 1 endyerine puts(lambda do 1 end). İkincisi aslında işe yarıyor - Ruby, parantez yoksa bloğu putsyönteme değil , yönteme geçirmeye çalışır lambda.
PJSCopeland

1
@PJSCopeland Aynı şekilde davranmalarını sağlayamayacağınızı söylemiyorum. % 100 değiştirilebilir sözdizimi açısından olmadığını söylüyorum, yani her durumda sadece bir yedek değiştirme yapamazsınız (çünkü bazen için fazladan parantez gerekir lambda).
Kelvin

@rdurand "Stabby lambdas Ruby 1.9'da argüman kabul edemez" özeti ile düzenleme yaptınız mı? Bu doğru değil, en azından 1.9.3 için - argümanlara izin verilir.
Kelvin


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.