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

我不理解ruby本地作用域

  •  49
  • rebo  · 技术社区  · 15 年前

    def foo(x)
      if(x > 5)
        bar = 100
      end
      puts bar
    end
    

    则foo(6)输出:100 foo(3)不输出任何内容。

    但是如果我把定义改成

    def foo(x)
      if(x > 5)
        bar = 100
      end
      puts bob
    end
    

    我得到一个“未定义的局部变量或方法”错误。

    5 回复  |  直到 9 年前
        1
  •  55
  •   Todd    13 年前

    这里发生了一些事情。首先,在 if 块具有与方法顶层声明的变量相同的局部作用域,这就是为什么 bar 如果 . 第二,你犯这个错误是因为 bob 被直接引用了。Ruby解释器从未见过它,也从未见过它被初始化过。然而,它已经看到 酒吧 之前在if语句内初始化。所以当它到达酒吧,它知道它存在。把这两者结合起来,这就是你的答案。

        2
  •  15
  •   Jörg W Mittag    15 年前

    bob 是未初始化的,因为它不明确。很难说是变量还是方法。

    第一个示例可以工作,因为未初始化的局部变量(以及全局变量和实例变量)的计算结果为 nil puts bar 很好:在一个案例中 bar 100 结果是 100个 无 puts 电话 to_s 关于它的论点,定义为 (它只返回空字符串),所以一切都很好。

    In Ruby, why after starting irb, foo.nil? says undefined error, and @foo.nil? gives “true”, and @@wah.nil? gives error again?

        3
  •  4
  •   Matt Briggs    15 年前

    def foo
      bar = bar
      puts bar // nil, which gets coerced into ""
    end
    

    我不知道为什么,也不知道它是怎么工作的,但你已经知道了。

        4
  •  2
  •   Andrew Grimm Alex Wayne    14 年前

    foo(3) 不输出任何内容。它输出一个换行符。

    使用 inspect 会给你更多提示:

    def foo(x)
      if(x > 5)
        bar = 100
      end
      puts bar.inspect
    end
    
    foo(3)
    

    nil
    

    bar 是一个完全成熟的变量,刚好有一个值 nil

        5
  •  0
  •   Theo    15 年前

    我不知道你在问什么。跑步 foo(3) 第二个定义总是会给出一个错误,因为 bob

    推荐文章