我在变量声明中检测到if
块中的意外行为:
puts "local_variables: #{local_variables}"
puts "defined? my_variable ini: #{defined? my_variable}"
if true
my_variable = 1
puts "local_variables in the 'if' block: #{local_variables}"
end
1.times do
my_variable_2 = 1
puts "local_variables in the 'times' block: #{local_variables}"
puts "defined? my_variable_2 in the 'times' block: #{defined? my_variable_2}"
end
puts "defined? my_variable_2 end: #{defined? my_variable_2}"
puts "defined? my_variable end: #{defined? my_variable}"
puts "my_variable: #{my_variable}"
结果是:
local_variables: [:my_variable]
defined? my_variable ini:
local_variables in the 'if' block: [:my_variable]
local_variables in the 'times' block: [:my_variable_2, :my_variable]
defined? my_variable_2 in the 'times' block: local-variable
defined? my_variable_2 end:
defined? my_variable end: local-variable
my_variable: 1
问题:
if
块中的变量可以从if
块外部访问,这是正确的吗?为什么它看起来与我相反?times
阻止行为与if
阻止不同?我一直在阅读this documentation,但我没有看到if
阻止案例。
答案 0 :(得分:4)
在ruby中,类,模块,函数,块和过程都有自己的作用域,因此在它们之外定义的局部变量通常不会在它们之外访问。
在ruby中,逻辑语句如 if , while 和 for 没有自己的范围,因此在其中定义的变量仍然存在他们使用的类,模块,功能块或过程。
这是一个设计选择,是红宝石红宝石的一部分!它可能感觉反直觉,因为像c这样的语言具有单独的 if 语句和一些(但不是全部)解释语言模仿的范围。
答案 1 :(得分:2)
if
没有引入新范围,因此可以在times
占用一个块,一个块引入了一个新的范围。要详细了解示波器门,请参阅this answer