2016-09-22 46 views
9

http://guides.rubyonrails.org/layouts_and_rendering.html#avoiding-double-render-errors de Raylar rehber geçmekte iken, ben Ruby'nin && return sınamak için bir test programı yazdım ve bu garip davranışı var:Yakut: vs "return &&" "ve dönüş"

def test1 
    puts 'hello' && return 
    puts 'world' 
end 

def test2 
    puts 'hello' and return 
    puts 'world' 
end 

budur sonuç çıktısı:

irb(main):028:0> test1 
=> nil 
irb(main):029:0> test2 
hello 
world 
=> nil 

Aradaki fark nedir?

+0

Bu konu hakkında iyi bir tartışma: https://www.ruby-forum.com/topic/217700 – Yarin

cevap

16

the difference between and and &&'a bakın. Örneklerde, puts yöntemini argümanları etrafında parens olmadan çağırırsınız ve öncelik farkı, nasıl ayrıştırıldığını değiştirir. Test 1 &&, yöntem çağrısı daha yüksek önceliğe sahiptir

. Yani aslında neler oluyor puts('hello' && return). Argümanlar her zaman çağrıldıkları yöntemlerden önce değerlendirilir - bu yüzden önce 'hello' && return'u değerlendiririz. 'hello' gerçek olduğundan boole kısa devre yapmıyor ve return değerlendiriliyor. Geri döndüğümüzde, başka bir şey yapmadan yöntemden çıkıyoruz: bu yüzden hiçbir şey kaydedilmez ve ikinci satır çalışmaz.

Test 2'de and, yöntem çağrısından daha düşük bir önceliğe sahiptir. Yani ne olur puts('hello') and return. puts yöntemi, kendisine iletilenleri günlüğe kaydeder ve ardından nil değerini döndürür. nil bir falsey değeridir, bu nedenle and ifade kısa devreleri ve return ifadesi hiçbir zaman değerlendirilmez. Sadece puts 'world''un çalıştırıldığı ikinci satıra geçiyoruz.

+0

Teşekkür ederim! Sorunun ne olduğunu anladım ~ ama nerede olduğunu göremiyorum. http://phrogz.net/ProgrammingRuby/language.html#table_18.4 adresinde var, bunu ispatlayamıyorum ... – Spec