为什么ruby即使从不执行变量赋值代码,也要定义变量?

时间:2019-06-09 21:17:56

标签: ruby variable-assignment

给出以下代码:

df.query('INDICATOR == 1').groupby(gb_ID)['DateTime'].agg(['min', 'max']).diff(axis=1)

Out[362]:
          min      max
INDICATOR
2         NaT 00:15:00
4         NaT 00:10:00

我们得到以下结果:

a = true # let's assign `a` a value

# and let's test if calling `b`, an unassigned variable, throws an error
begin
  puts "The value of b is: #{b.inspect}"
rescue NameError => e
  puts "Caught an error: #{e}"
end

a || b = true # the assignment should never be executed because `a` is `true`

puts "The value of b is: #{b.inspect}" # will calling `b` still raise an error?

尽管我们期望第二次调用Caught an error: undefined local variable or method `b' for main:Object The value of b is: nil 也会引发错误,但是我们看到b实际上是b

那是为什么?为什么nil被分配了b?由于nil从未达到任务,我希望||保持未定义状态。如何定义但未分配值?

1 个答案:

答案 0 :(得分:5)

有些docs解释了如何创建变量;据我了解,这就是解析器的工作原理:

  

解析器遇到分配时而不是分配发生时创建本地变量:

a = 0 if false # does not assign to a
p local_variables # prints [:a]
p a # prints nil

您可以看到其他示例:

b = true if false # b is nil
"test" || c = true # c is nil

其他未分配的内容:

puts d if false # d generates a NameError