Ruby,理解if块中的局部变量范围
我在Ruby,理解if块中的局部变量范围,ruby,binding,scope,Ruby,Binding,Scope,我在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 p
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}"
结果是:
局部变量:[:我的变量]
定义my_变量ini:
“if”块中的局部变量:[:my_variable]
“times”块中的局部变量:[:my_variable_2,:my_variable]
定义“times”块中的my_变量_2:局部变量
定义我的_变量_2结束:
定义my_变量结束:局部变量
my_变量:1
问题:
if
块中声明的变量可以从if
块外部访问,是否正确?为什么对我来说这看起来违反直觉时间
块行为与if
块不同我一直在阅读,但我没有看到
if
块的情况。在ruby中,类、模块、函数、块和过程都有自己的作用域,因此在它们内部定义的局部变量通常不会在它们之外被访问
在ruby中,逻辑语句(如if、while和for)没有自己的作用域,因此它们中定义的变量在使用它们的类、模块、函数块或过程中保持不变
这是一个设计选择,也是ruby的一部分!这可能会让人感觉不太直观,因为像c这样的语言对if语句有单独的作用域,而一些(但不是全部)解释语言也模仿了这一点
如果
没有引入新的作用域,那么变量可以在外部使用次
取一个块,一个块引入一个新范围