代码之家  ›  专栏  ›  技术社区  ›  nonopolarity

为什么在Ruby中,当“a”未定义时,a | | 1会抛出错误,而a=a | | 1不会?

  •  7
  • nonopolarity  · 技术社区  · 14 年前

    什么时候? a 是未定义的,那么 a || 1 a = a || 1 不会的。这不是有点不一致吗?

    irb(main):001:0> a
    NameError: undefined local variable or method 'a' for main:Object
            from (irb):1
            from c:/ruby/bin/irb:12:in '<main>'
    
    irb(main):002:0> a || 1
    NameError: undefined local variable or method 'a' for main:Object
            from (irb):2
            from c:/ruby/bin/irb:12:in '<main>'
    
    irb(main):003:0> a = a || 1
    => 1
    
    3 回复  |  直到 14 年前
        1
  •  9
  •   Jörg W Mittag    14 年前
    a
    

    在这里,你正在评估 a

    a || 1
    

    给,你 仍然 确定布尔表达式的值。就像上面一样,

    a = a || 1
    

    在这里, 定义。它被定义为未初始化的局部变量。在Ruby中,未初始化的变量的计算结果是 nil nil || 1 其计算结果为 1 1 初始化为 1

    解析时间 运行时

     foo # => NameError: undefined local variable or method `foo' for main:Object
    

    foo 未定义。

    if false
      foo = 'This will never get executed'
    end
    

    在这一点上, 已定义,即使该行永远不会执行。这行永远不会被执行的事实是完全不相关的,因为解释器无论如何都与此无关:局部变量是由解析器定义的,解析器显然可以看到这行。

    foo # => nil
    

    没有错误,因为 已定义,其计算结果为 因为它是未初始化的。

        2
  •  1
  •   Cetra    14 年前

    当你这么做的时候 a || 1 ,你要求它寻找 a 这是未定义的。

    a = a || 1 你要求它寻找赋值的值

    所以,虽然很奇怪,但我不认为它前后矛盾。

        3
  •  0
  •   Peter Tillemans    14 年前

    你是这个意思吗?

    if !(defined? a) then
        a = 1
    end