0

我对变量定义很感兴趣。我知道变量定义,只是为了了解它是如何工作的。这个想法是如果未定义 myvar 则将其设置为 0。我不想使用 false,因为 false 或 nil 可能会返回 false。

def foo
  myvar=1000

  myvar = ((defined? myvar)==nil) ? 0 : myvar
  puts myvar
end

foo # => 1000

def foo
  # myvar=1000

  myvar = ((defined? myvar)==nil) ? 0 : myvar
  puts myvar
end

foo # => nil

def foo
  mybool = ((defined? myvar)==nil)
  myvar = mybool ? 0 : myvar
  puts myvar
end

foo # => 0 it rocks !

这就像布尔测试是否在评估最终测试之前影响到 myvar 。 ((defined? myvar)==nil)给出了定义的 2 种可能性?myvar 可能是nil,或者 test 的右侧nil可能是nil(it's nil)。

为了摆脱这个测试的 nil 部分,我尝试了这段代码:

def foo    
  mylocalvariable = 2 # it gives 'local-variable' and not nil
  puts ((defined? myvar) == (defined? mylocalvariable ))
  myvar = ((defined? myvar)!=(defined? mylocalvariable )) ?  0 : myvar
  puts myvar
end

foo # => nil

似乎测试的第一部分受到了 myvar 的影响,但是赋值运算符出现在 () 或比较运算符之后。你有想法吗?我不想要其他代码,只是为什么它会这样工作。谢谢你。

4

3 回答 3

3

您可能不想要其他代码,但您需要一些代码,因为您要走很长一段路才能完成一些简单的事情。如果要将未定义的变量设置为 0,请使用:

myvar ||= 0

它是如何工作的?||=是一个条件赋值运算符,它基本上查看左侧分配给的变量,如果它是 nil 或 false,则将右侧的值分配给它。这是在许多语言中发现的一个技巧。

三元 ( ?:) 语句对于小if/then/else语句很有用,但对于您想要做的事情来说并不是真正的正确选择。相反,如果您想使用除 之外的东西||=,请使用:

myvar = 0 unless myvar

同样,myvar如果它恰好是一个false值,所有这些都将重新分配,而不仅仅是它为零。这是一个潜在的问题,但是,作为开发人员,我们应该能够控制并且应该清楚地知道变量在任何时候持有什么类型的值,所以它不应该是那么大的问题。

于 2013-03-12T16:06:05.037 回答
0

嗨,这种运算符是三元运算符。

Example:
@x = 1
@y = 2
@x>2 ? puts "YES" : puts "NO"

您还可以检查它是否为 ActiveRecord

Example:
@x = User.find(:all, :conditions => ["id = ?", 1])
@x.nil? ? puts "Null" : puts "Not Null"
于 2013-03-13T03:47:52.653 回答
0

我知道为什么。当您编写 myvar= 并测试 defined?myvar 时,ruby 认为 myvar 已定义。如果您删除 myvar= ,则 myvar 在测试中被视为未定义。左侧部分在右侧部分之前读取。

于 2013-03-13T06:05:34.540 回答