相关疑难解决方法(0)

Ruby:If/else语句中定义的变量可以在if/else之外访问吗?

def foo
  #bar = nil
  if true
    bar = 1
  else
    bar = 2
  end
  bar #<-- shouldn't this refer to nil since the bar from the if statement is removed from the stack?
end

puts foo # prints "1"
Run Code Online (Sandbox Code Playgroud)

我一直认为你必须创建一个临时变量并将其定义为nil或初始值,以便在if/else语句中定义的变量将保持在if/else语句的范围之外而不会从堆栈中消失?为什么打印1而不是零?

ruby

19
推荐指数
1
解决办法
6043
查看次数

为什么我可以引用从未运行的if/unless/case语句之外的变量?

为什么以下代码不会抛出错误?

if false
  x = 0
end

x  #=> nil
Run Code Online (Sandbox Code Playgroud)

以下确实会引发错误:

y  # NameError: undefined local variable or method `y' for main:Object
Run Code Online (Sandbox Code Playgroud)

unless&casestatements 也会发生同样的事情.

ruby

17
推荐指数
1
解决办法
1530
查看次数

||的奇怪含义 和|| =在Ruby中(2.0,1.9.3,jruby 1.7.4)

从刚刚启动的会话中考虑以下irb片段:

irb:01> baz            # => NameError, baz is not defined
irb:02> baz || baz = 0 # => NameError, baz is not defined
irb:03> baz            # => nil
Run Code Online (Sandbox Code Playgroud)

baz是一个未定义的变量,试图评估它产生了一个NameError.然而,不知何故,在这个操作之后,baz被定义了,并且具有值nil.看起来,即使没有人(明确地)要求它,也将值nil赋给变量baz.是否存在潜在的语言原因,为什么这种行为是可取的?

解释此行为和其他类似混淆构造的规则是什么,例如:

irb:04> true if foo            # => NameError
irb:05> foo                    # => NameError; name still undefined
irb:06> foo = (true if foo)    # => nil
irb:07> foo                    # => nil; name defined as nil
irb:08> true || i = 0 …
Run Code Online (Sandbox Code Playgroud)

ruby jruby

10
推荐指数
1
解决办法
159
查看次数

if语句中的局部变量

我想知道,为什么a可见?

if true
  puts 'true'
else
  puts 'false'
  a = 123
end

puts a # no error

# or 
# my_hash = {key: a}
# puts my_hash # :key => nil
Run Code Online (Sandbox Code Playgroud)

但这会导致错误,即使显示"真实"

if true
  puts 'true'
else
  puts 'false'
  a = 123
end

puts a2 # boooooom
Run Code Online (Sandbox Code Playgroud)

ruby ruby-2.0

5
推荐指数
1
解决办法
2469
查看次数

为什么变量只在未执行的Ruby代码中出现时才被"定义"?

下面的Ruby代码会导致x被"定义"(即defined(x)返回"local-variable"哪怕是这个代码的执行之前,而且即使不进行分配未定义:

如果为假,则x = 1

具体来说,x局部变量将设置为nil.对于从未执行过的赋值while falseuntil false子句的赋值,行为类似.您可以在irb中运行或在某些代码片段上运行ruby来验证这一点.

我的问题是双重的:

  1. 这种行为记录在哪里吗?
  2. 在任何地方都记录了这种行为的理由吗?

ruby

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

标签 统计

ruby ×5

jruby ×1

ruby-2.0 ×1