2016-03-31 15 views
0

Bu iki kod satırı arasındaki fark nedir?Ruby 2.2.4 Bir koşulda öyküyü lexing

a = (b if (b = "test")) 
a = b if (b = "test") 

ilk çalışır ince ve test hem a ve b ayarlar ancak ikinci bir hata atar:

NameError: undefined local variable or method `b' for main:Object

Ben ikinci hat için, Yakut b = "test" ilk değerlendirmek olacağını farz olurdu, daha sonra if "test" ve son olarak a = b. Aslında neler oluyor?

(Yakut sürüm 2.2.4)

+1

(sadece olması gerektiği gibi) Ruby 2.3 bu işin ne de atamaları yapma. –

+0

Devon, her iki satır için [komut dizileri] 'ni (http://ruby-doc.org/core-2.2.2/RubyVM/InstructionSequence.html) inceleyebilir ve farkı kendiniz bulabilirsiniz. Kişisel olarak rahatsız olmazdım, çünkü bu kod asla kullanılmamalı ve en son yakutta yeniden üretilmiyor. –

+0

Yeniden üretilemez. – sawa

cevap

2

iki hat çalışmaz. Ve her iki çizgi de çalışır. Bu schrödinger ifadesidir :).

Yeni repl içinde iki kez çalıştırabilirsiniz: Yeni bir yenisi ile değiştirilmesini öngörmektedir açın

a = b if b = "test" 
#=> NameError: undefined local variable or method `b' for main:Object 
a = b if b = "test" 
#=> "test" 

en derin bakalım:

defined(b) 
#=> nil 
a = b if b = "test" 
#=> NameError: undefined local variable or method `b' for main:Object 
defined(b) 
#=> local-variable 
b 
#=> "test" 
a = b if b = "test" 
#=> "test" 

Yani aslında Yakut değerlendirmiş b = "test" kısım ve akım içinde bu değişkeni tanımlanmış kapsamı. Her iki ifade de a = b ve if b = "test" uygulanmıştır. İlk defa değerlendirildiğinde

c = p("assignment") && b if b = p("if") && "test" 
#=> "if" 
#=> "assignment" 
#=> NameError: undefined local variable or method `b' for main:Object 

Ama b değişken atama deyimi kapsamında tanımlanan edilmedi: deyim atama deyimi önce yürütüldüğünde, bunun ötesinde. Ve ikinci yaklaşımda zaten tanımlanmıştı, bu yüzden doğru sonuç aldınız.

Yani, bu şekilde

+0

Ah, cevap olabilir, evet. :) –

+0

Bu yüzden, bu konuyu test ederken göründüğüm gibi, her zaman bir yolu ve asla diğerini kullanmamanın talihsiz halini araştırdım. Teşekkürler! –