ruby如何跟踪变量

Rah*_*ali 5 ruby

我对Ruby跟踪变量的方式感到困惑.例如:

情况1:

    if true
       a
    end
Run Code Online (Sandbox Code Playgroud)

会给你一个错误的说法undefined local variable or method a.

案例2:

    if false
      a
    end
    a
Run Code Online (Sandbox Code Playgroud)

会给你第二个错误a,而不是第一个a.

案例3:

    if false
      a=2
    end
    a  #=> nil
    defined? a  #=> 'local-variable'
Run Code Online (Sandbox Code Playgroud)

如果比较案例2和案例3,则在案例2中它首先忽略错误a.我认为它因为ruby的执行路径而没有afalse条件而到达变量.当我在案例3中进行赋值时,它也是一样的.它给了我变量a定义但nil有价值.有人可以解释它的工作方式吗?

Aru*_*hit 3

在解析时,如果 Ruby 发现任何这样的赋值a=2,则此时会创建局部变量。是否放入任何false条件表达式内部并不重要。否则,如果您在使用运算符创建变量之前undefined local variable or method a尝试使用此处的变量,则会抛出合法错误。aassignment(=)

看看谬误内赋值操作的混淆if

  • 不存在解释型语言或编译型语言这样的东西。解释和编译是解释器和编译器的特征,而不是语言的特征。语言不是编译或解释的,语言只是“是”。Ruby 有许多不同的实现: MRI 是一个纯粹的解释器。YARV 是两阶段实现,首先将 Ruby 编译为 YARV 字节码,然后解释该字节码。Rubinius 是一个两阶段实现,其中第二阶段又是一个混合模式实现:首先它将 Ruby 编译为 Rubinius 字节码,然后该字节码要么...... (5认同)
  • 为什么会引发错误?该代码永远不会执行,因此不可能引发错误。 (4认同)
  • ...解释或编译为本机代码,具体取决于哪一种可以提供更好的性能。JRuby 要么解释 Ruby,要么将其编译为 JVM 字节码。IronRuby 要么解释 Ruby,要么将其编译为 CIL 字节码。MacRuby 总是编译为本机代码(我认为,自从我上次查看以来,他们可能已经更改了它。) (4认同)
  • 那么那些人就错了。所有现有的 Python 实现都有一个编译器。为什么Python会是一种解释性语言?C 有解释器。为什么 C 是编译语言?谈论编译语言的人不理解语言和语言实现之间的区别,或者更一般地说,他们不理解抽象和该抽象的具体实现之间的区别。换句话说:他们根本不理解抽象。 (4认同)