相关疑难解决方法(0)

为什么Ruby似乎从case语句中提升变量声明,即使该代码路径没有被执行?

我们定义一个函数foo:

def foo(s)
  case s
  when'foo'
    x = 3
    puts x.inspect
  when 'bar'
    y = 4
    puts y.inspect
  end
  puts x.inspect
  puts y.inspect
end
Run Code Online (Sandbox Code Playgroud)

然后我们将其称为如下:

1.9.3p194 :017 > foo('foo')
in foo scope
3
in outer scope
3
nil
 => nil 

1.9.3p194 :018 > foo('bar')
in bar scope
3
in outer scope
nil
3
 => nil 
Run Code Online (Sandbox Code Playgroud)

为什么函数不会在任何一种情况下抛出关于未注册的局部变量的错误?在第一种情况下,变量y似乎不应该存在,所以你不能inspect在外部范围内调用它; 同为x在第二种情况下.

这是另一个类似的例子:

def test1
  x = 5 if false
  puts x.inspect
end

def test2
  puts x.inspect
end
Run Code Online (Sandbox Code Playgroud)

然后: …

ruby

25
推荐指数
1
解决办法
3830
查看次数

与错误的`if`块内的赋值操作混淆

我正在玩if积木中的任务操作,并发现了以下结果,这让我感到惊讶:

C:\>irb --simple-prompt
if false
x = 10
end
#=> nil
p x
nil
x.object_id
#=> 4
#=> nil
p y
NameError: undefined local variable or method `y' for main:Object
        from (irb):5
        from C:/Ruby193/bin/irb:12:in `<main>'
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,您可以看到x已创建局部变量,即使它仅被分配给falsy if块.我想看到的内容xp x这迫使我相信,分配却没有这样做,而是x变量存在.x.object_id也证明了这种情况.

现在我的问题是如何x创建局部变量,即使if块入口点是故意关闭的?

我期望输出p x类似于输出p y.但相反,我得到了一个惊人的答案p x.

有人可以向我解释这个概念是如何运作的吗?

编辑

不,这是另一个测试.仅local变量不是这种情况.同样的事情instanceclass变量也发生了.见下文:

class Foo
  def show
    @X …
Run Code Online (Sandbox Code Playgroud)

ruby if-statement nameerror

3
推荐指数
1
解决办法
314
查看次数

标签 统计

ruby ×2

if-statement ×1

nameerror ×1