2013-02-19 13 views
6

Uzun lafın kısası, bir seçenek argümanı içeren bir yöntem yazıyordum; anahtar için değer: true olarak değerlendirilirse. Yeni sözdizimi kullanılarak IRB karma çalışırken ben lRB bir yazım hatası var istemi kalır açmak:IRB - Ruby 1.9.x karma sözdizimi: {if: true} eşittir {: if => true}

1.9.3p374 :010 > {if: true} 
1.9.3p374 :011?> 

eski sözdizimi kullanarak, işleri gayet güzel:

1.9.3p374 :011 > {:if => true} 
=> {:if=>true} 

Tüm anahtar kelimeleri o Bir deyim başlatın, aynı davranışı sergileyin. Örneğin. def, do, module, ortada meydana case

Diğer ayrılmış kelime ve sadece iyi class eser: else, end

Sorum şu: Bu beklenen davranış, bir hata ya da bir sınırlama var mı?

+2

'irb' biraz kırılgandır ve oldukça fazla miktarda beyin hasarı vardır, muhtemelen bunlardan bazılarını görüyorsunuz. –

+0

@muistooshort bu oldukça asılsız görünüyor. echo, {if: true} .inspect '> test.rb; ruby test.rb' döndürür: 'test.rb: 1: sözdizimi hatası, beklenmedik ':'' Hangi moda 'irb' kırılgan? – nzifnab

+2

@nzifnab Irb, ifadeyi "son" 'a kadar yürütmeyi sürdürmelidir ve eğer bir kontrol operatörünü (burada olduğu gibi) yanlış yorumluyorsa, kendisine özgü ek sorunlar vardır. – coreyward

cevap

6

Her dilde bir şeyleri güvenilir bir şekilde ayrıştırmak zor. Bu, ayrılmış sözcükleri kullanmaya başladığınızda özellikle doğrudur. Ve irb bunun ötesine geçmeli ve ayrıştırıcının üstünde daha da zor olan etkileşimli bir model sunmalıdır. Şahsen ben böyle bir durum hakkında endişelenmede çok fazla değer olduğunu düşünmüyorum, ya dilin bir kullanıcısı ya da bakıcı olarak. Aklımda, neyin işe yaradığını ve mümkünse bu durumlara girmekten kaçınmak daha iyidir.

irb dışındaki düz Ruby'deki benzer davranışları görebilirsiniz. Örneğin:

puts({if: true}) # no problem, behaves as expected in Ruby 1.9.3. 
puts {if: true} # raises a syntax error in Ruby 1.9.3 

sorunuza gelince, "beklenen davranış, bir hata ya da bir sınırlama" olarak, ben size irb görmezden ve düz Ruby karşılaştırmak lazım der ve olur bunu yaparsanız, bunu iyi çalışıyor. Bu, bir irb hatası olması gerektiği anlamına gelir.

Çözülmesi mümkün veya değerli midir? @coreyward, yorumunda irb'un bir if karşılaştığı zaman çoğu durumda yürütmeyi ertelemek zorunda olduğu konusunda iyi bir noktaya işaret ediyor. Emin olmak için daha fazla bakmanız gerekecek, ancak bunun gibi tüm durumları açık bir şekilde yorumlayamayabilirsiniz.

Tavsiyem: Yapabildiğiniz takdirde bu yapıyı önleyin ve etiketler için ayrılmış sözcükleri kullanmayın!

Düz Ruby ile çalışabileceğiniz bir dosya (örn. MRI). Çalıştığını onaylamak için çıktıda {:if=>true} görmelisiniz.

{if: true} 
foo = {if: true} 
# if MRI is working, should be able to execute this file without trouble. 
p foo 
+1

Ayrıca, her şeyi atadığınız sürece beklediğiniz gibi çalışır. Örneğin.foo = {if: true}, MRI'da iyi değerlendirir (IRB yine de yükselir). – coreyward

+0

@coreyward: gerçekten. Bunu denedim. Netleştirmek için cevabım için bir kod bloğu ekleyeceğim. Teşekkürler! – Peter

+1

Hepsi çok ilginç. OP'nin örneği, bir ruby ​​senaryosunda mı yoksa IRB'de mi başarısız olur, ancak parantezin etrafına koyarsanız, o çalışır. Ne kadar kafa karıştırıcı! Neredeyse özel olarak hash roketle takılmayı diliyorum. Anlamak çok daha kolay ve daha az gotchas (ve daha sonra tüm sss'leri yerine, 'string'leri kullanarak roketleri kullanmanız bile aynıdır! Ayrılmış etiketler kullanan taşmaları kullanmanız gerekir! Semboller bazen etiket sözdizimini kullanmalıdır!) Ugh. – nzifnab