2013-04-02 191 views
5

我想知道,为什么a可见?if语句中的局部变量

if true 
    puts 'true' 
else 
    puts 'false' 
    a = 123 
end 

puts a # no error 

# or 
# my_hash = {key: a} 
# puts my_hash # :key => nil 

但是这将导致一个错误,即使将有“真”所示

if true 
    puts 'true' 
else 
    puts 'false' 
    a = 123 
end 

puts a2 # boooooom 
+2

查看关于[此问题]的接受的答案(http://stackoverflow.com/questions/12928050/why-does-ruby-seem-to-hoist-variable-declarations-from-inside-a-case-statement- e?rq = 1#) –

回答

1

引用aif内部有声明为变量的效果如果不存在定义的方法a=为对象。

由于Ruby不需要使用与引用变量或赋值给变量的语法相同的语法来调用方法,因此需要对所讨论令牌的性质进行评估。如果它可能是一个方法调用,因为具有该名称的方法已被定义,那么它将被解释为这样。如果在编译源代码时不存在这样的方法,那么默认情况下它将是一个变量。

+1

“的值应该作用于'if块'?我不确定那是什么意思?变量是有作用域的,'a'不在'if'范围内。 –

+3

'if'没有块,只有有条件评估的子句。 “if”语句的子句不会创建新的范围。这不是C. – sfstewman

+0

我一直把'if'看作是作用域,但你说得对,看起来并不是这样。 C++习惯拒绝消失。变量的范围是它们在里面声明的方法,或者是在'irb'中的'main'上下文。 – tadman