Ruby,了解if块

时间:2017-02-09 14:10:54

标签: 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
  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

问题:

  1. 声明到if块中的变量可以从if块外部访问,这是正确的吗?为什么它看起来与我相反?
  2. 为什么times阻止行为与if阻止不同?
  3. 我一直在阅读this documentation,但我没有看到if阻止案例。

2 个答案:

答案 0 :(得分:4)

在ruby中,类,模块,函数,块和过程都有自己的作用域,因此在它们之外定义的局部变量通常不会在它们之外访问。

在ruby中,逻辑语句如 if while for 没有自己的范围,因此在其中定义的变量仍然存在他们使用的类,模块,功能块或过程。

这是一个设计选择,是红宝石红宝石的一部分!它可能感觉反直觉,因为像c这样的语言具有单独的 if 语句和一些(但不是全部)解释语言模仿的范围。

答案 1 :(得分:2)

  1. 是的,if没有引入新范围,因此可以在
  2. 之外使用变量
  3. times占用一个块,一个块引入了一个新的范围。
  4. 要详细了解示波器门,请参阅this answer