?:ruby和变量定义中的运算符

时间:2013-03-12 16:04:47

标签: ruby

我对变量定义有好奇心。我知道变量定义,只是了解它的工作原理。如果没有定义,我们的想法是将myvar设置为0。我不想使用false,因为false可以返回false或nil。

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)定义了两种可能性? myvar可能是nil,或者测试nil的右侧可能是nilnil)。

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

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的影响,但是赋值运算符在after()之后或者在compare运算符之后。你有好主意吗?我不想要其他代码,只是它为什么会这样。 谢谢。

3 个答案:

答案 0 :(得分:3)

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

myvar ||= 0

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

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

myvar = 0 unless myvar

同样,如果恰好是myvar值,所有这些都会重新分配false,而不仅仅是{n}。这是一个潜在的问题,但是,作为开发人员,我们应该处于控制之中并且应该知道变量在任何时刻都持有什么类型的值,所以它不应该是一个大问题。

答案 1 :(得分: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"

答案 2 :(得分:0)

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