Ruby:条件初始化

时间:2014-08-19 11:37:39

标签: ruby

我已经阅读过Ruby中的条件初始化和

obj1 ||= Class1.new   

相同
obj1 ||obj1 = Class1.new

因为Ruby是一个对象,我想知道为什么以下短语引发了“NameError:undefined方法或名称......”:

x || x = 10

但是

x ||= 10

是一个正确的陈述

3 个答案:

答案 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之前就开始了分配。