Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby,理解if块中的局部变量范围_Ruby_Binding_Scope - Fatal编程技术网

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语句有单独的作用域,而一些(但不是全部)解释语言也模仿了这一点

  • 是,
    如果
    没有引入新的作用域,那么变量可以在外部使用
  • 取一个块,一个块引入一个新范围
  • 要了解有关范围门的更多信息,请参阅