我对变量定义有好奇心。我知道变量定义,只是了解它的工作原理。如果没有定义,我们的想法是将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
的右侧可能是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的影响,但是赋值运算符在after()之后或者在compare运算符之后。你有好主意吗?我不想要其他代码,只是它为什么会这样。 谢谢。
答案 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在测试中被视为未定义。 左侧部分在右侧部分之前读取。