2011-12-07 4 views
12

Eğer bunu yaparsam:Bu neden bir sözdizimi hatası değil?

(false true) 

beklediğim gibi, bir sözdizimi hatası ile başarısız olur. Ama bunu yaparsak:

(false 
true) 

kod çalıştırıldığında ve ilk koşulu atıyor ve saniyede sonucunu döndürür.

Bu bir hata mı, yoksa bir özellik mi?

+8

'(false; true) –

+2

Basit bir açıklama olması gerektiğini biliyordum. Bunu gerçek bir cevap olarak göndermeli ve kendiniz için bir miktar kredi talep etmelisiniz. :-) – L2G

cevap

15

Çizgi sonları Dolayısıyla bu durumda, geri dönüş olarak yorumlamak ayrıştırıcı neden olan isteğe bağlıdır, şu: Bu yöntem olsaydı

(true) 

:

(false; true) 

sadece değerlendirdiği Aramalar her ikisi de değerlendirilecek, ancak sadece sonuncusu yayılacaktı. Örneğin:

x = (p "hello" 
p "world" 
2) 

çıktısı verir "Merhaba" ve "dünya" ve x 2

7

Parantez gruplama için kullanılır eşit olur, satır sonları ifade ayırıcı olarak kullanılır. Yani, burada sahip olduğunuz şey sadece iki ifadeden oluşan bir gruptur. Reddedecek bir şey yok. Bunun nedeni bu tanınmış deyim yararlıdır

: İsteğe bağlı bir argüman temin yapılmadığının anlamaya Ruby başka hiçbir yolu yok

def foo(bar = (bar_set = true; :baz)) 
    if bar_set 
    # optional argument was supplied 
    end 
end 

. Temel olarak, bu, örneğimde bir değişken atamak veya @ 32bitkid örneğindeki ekrana yazdırmak gibi, yan etkilerin varlığında ilginç hale gelir. Üste | Örneğinizde, hiçbir yan etkisi yoktur, bu yüzden aslında ne devam ettiğini göremediniz.

+0

Aslında, bu deyim benim için yeni, bu yüzden cevabını takdir ediyorum! – L2G

+0

@ L2G: Çok sık kullanılmaz, ancak isteğe bağlı bir argümanın sağlanıp sağlanmadığı arasında ayrım yapılması gereken bazı standart protokoller vardır. 'enjekte' bir örnektir. Genellikle C veya Java veya C# 'da, tercüman içsellerine ayrıcalıklı erişim ile uygulanır, bu da isteğe bağlı bir argümanın varlığını kontrol etmeyi kolaylaştırır. Fakat davranışını saf Ruby'de çoğaltmak istiyorsanız, bunun gibi numaralara başvurmalısınız. –

2

Eğer uyarılar varsa, Ruby size bir uyarı verebilir.

$VERBOSE = true 
def foo 
    (false 
    true) 
end 

hem Yakut 1.9.1 patchlevel 378 yılında size

(irb):3: warning: unused literal ignored 

verir ve Ruby 1.8.7 patchlevel 330.

bu uyarı ile tüm Yakut komut dosyalarını nasıl çalıştırılacağı için How can I run all Ruby scripts with warnings? bakınız.