if语句中的局部变量

Ala*_*ano 5 ruby ruby-2.0

我想知道,为什么a可见?

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

puts a # no error

# or 
# my_hash = {key: a}
# puts my_hash # :key => nil
Run Code Online (Sandbox Code Playgroud)

但这会导致错误,即使显示"真实"

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

puts a2 # boooooom
Run Code Online (Sandbox Code Playgroud)

tad*_*man 1

如果没有为该对象定义方法,则a在 内部引用具有将其声明为变量的效果。ifa=

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

  • `if` 没有块,只有条件评估的子句。`if` 语句的子句不会创建新的作用域。这不是C。 (4认同)