我已经阅读过Ruby中的条件初始化和
obj1 ||= Class1.new
与
相同obj1 ||obj1 = Class1.new
因为Ruby是一个对象,我想知道为什么以下短语引发了“NameError:undefined方法或名称......”:
x || x = 10
但是
x ||= 10
是一个正确的陈述
答案 0 :(得分:3)
在第一种形式中,首先独立引用x
。与第二种形式不同,x
需要先定义,否则会引发错误。
> x = nil
=> nil
> x || x = 10
=> 10
表单x ||= 10
同时将声明和测试结合在一起,因此,x
之前是否已经声明了它是否会产生错误。
答案 1 :(得分:1)
defined?(x) || something
在您的示例中,x不存在。所以你无法测试它的价值是什么。检查是否已定义。你可以走得更远:
defined?(x) && x.nil? || x = 10
这将检查是否定义了x。如果不是,则将x设置为10.如果定义了x,但是具有nil值(也没有用),则x也设置为10.
答案 2 :(得分:1)
我一直认为它等同于obj1 = obj1 || Class1.new
,而不是obj1 || obj1 = Class1.new
。这种解释更正确,因为它没有引发NameError
,并且与其他与=
结合的运算符的行为一致:
number = 1
number += 2 #=> 3
number -= 5 #=> -2
number *= 2 #=> -4
number /= 2 #=> -2
number **= 2 #=> 4
boolean = false
boolean ||= false #=> false
boolean ||= true #=> true
boolean &&= true #=> true
boolean &&= false #=> false
boolean &&= false #=> false
string = ""
string += "Hello" #=> "Hello"
string += ", world!" #=> "Hello, world!"
至于obj1 || obj1 = Class1.new
提出NameError
的原因,因为||
运算符之前的该语句部分试图在obj1
之前引用它{&1}} 39;定义。 obj1 = obj1 || Class1.new
没有这样做,因为它在引用obj1
之前就开始了分配。