2013-07-23 12 views
31

Bu Ruby 2.0 kodunda sorun nedir?Beklenmedik Dönüş (LocalJumpError)

p (1..8).collect{|denom| 
    (1...denom).collect{|num| 
     r = Rational(num, denom) 
     if r > Rational(1, 3) and r < Rational(1, 2) 
      return 1 
     else 
      return 0 
     end 
    } 
}.flatten 

Hata, block (2 levels) in <main>': unexpected return (LocalJumpError) numaralı belgedir. n olanlar (ve diğer sıfırlar) içeren bir düz liste oluşturmak istiyorum n, 1/3 ve 1/2 arasında bulunan 8'in altındaki paydalarla rasyonel sayıların sayısıdır. (it's a Project Euler problem). Bu yüzden iç bloktan dönmeye çalışıyorum.

+2

Bir blokta 'return' kullanmayın. Sadece 'dönüş' 'nü kaldırın ve kodunuz iyi olacak. – oldergod

cevap

37

* bir bloğun içinde return yapamazsınız. Geçen deyimi dönüş değeri olur, böylece sadece sizin durumunuzda dönüş ifadeleri kaldırabilirsiniz:

p (1..8).collect{|denom| 
    (1...denom).collect{|num| 
     r = Rational(num, denom) 
     if r > Rational(1, 3) and r < Rational(1, 2) 
      1 
     else 
      0 
     end 
    } 
}.flatten 

*: İçinde lambda blok yapabilir: lambda { return "foo" }.call # => "foo". Kapsam belirleme ve tüm bunlar ile ilgilidir ve bu lambda blokları ve proc blokları arasındaki ana farklardan biridir. Yöntemlere ilettiğiniz "Normal" bloklar daha çok proc blok gibidir.

+55

Ruby'de bir bloğun içinde * dönüşü * kullanabilirsiniz *. Kapatma yönteminden dönecektir. Bu durumda, * hiçbir * kapalı yöntemdir, * bu neden bir hata var, bu * değil * çünkü bir blokta 'dönüş 'geçersizdir. –

+0

@ JörgWMittag Haklısınız, basitleştiriyordum. 'return', içinde bulunduğunuz en yakın metot * veya *' lambda' bloğunu döndürür. Eğer içinde değilseniz, bir "LocalJumpError" elde edersiniz. – henrikhodne

+0

@ JörgWMittag bu açıklayıcı beyanı için teşekkürler. Cevap, olduğu gibi kafa karıştırıcıydı ve açıklığa kavuştun. Şimdi anladığım kadarıyla bu hata irb’da neden kolayca ortaya çıkıyor. –