Ruby:条件初始化

Ruby:条件初始化,ruby,Ruby,我读过Ruby和Linux中的条件初始化 obj1 ||= Class1.new 与 obj1 ||obj1 = Class1.new 由于Ruby是一个对象,我想知道为什么下面的短语会引发“NameError:未定义的方法或名称…”: 但是 是第一种形式的正确语句,x首先独立引用。与第二种形式不同,x需要先定义,否则会引发错误 > x = nil => nil > x || x = 10 => 10 表单x | |=10同时结合了声明和测试,因此无论x是否已

我读过Ruby和Linux中的条件初始化

obj1 ||= Class1.new   

obj1 ||obj1 = Class1.new
由于Ruby是一个对象,我想知道为什么下面的短语会引发“NameError:未定义的方法或名称…”:

但是


是第一种形式的正确语句,
x
首先独立引用。与第二种形式不同,
x
需要先定义,否则会引发错误

> x = nil
=> nil
> x || x = 10
=> 10

表单
x | |=10
同时结合了声明和测试,因此无论
x
是否已提前声明,它都不会生成错误。

在第一个表单中,首先独立引用
x
。与第二种形式不同,
x
需要先定义,否则会引发错误

> x = nil
=> nil
> x || x = 10
=> 10
defined?(x) || something
表单
x | |=10
同时结合了声明和测试,因此无论
x
是否已提前声明,它都不会生成错误

defined?(x) || something
在您的示例中,x不存在。所以你不能测试它的值是多少。检查是否已定义。你可以更进一步:

defined?(x) && x.nil? || x = 10
这将检查是否定义了x。如果不是,则将x设置为10。如果定义了x,但具有nil值(也不有用),则x也设置为10

在您的示例中,x不存在。所以你不能测试它的值是多少。检查是否已定义。你可以更进一步:

defined?(x) && x.nil? || x = 10

这将检查是否定义了x。如果不是,则将x设置为10。如果定义了x,但有一个nil值(也不有用),那么x也被设置为10。

我一直认为它等同于
obj1=obj1 | | Class1.new
,而不是
obj1 | obj1=Class1.new
。这种解释更为正确,因为它不会引发
名称错误
,并且与与
=
组合的其他运算符的行为一致:

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
会引发
namererror
,这是因为
|
运算符前面的语句部分试图在定义它之前引用
obj1
obj1=obj1 | | Class1.new
不会这样做,因为它在引用
obj1
之前开始赋值。我一直认为它等同于
obj1=obj1 | | Class1.new
,而不是
obj1 | obj1=Class1.new
。这种解释更为正确,因为它不会引发
名称错误
,并且与与
=
组合的其他运算符的行为一致:

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
会引发
namererror
,这是因为
|
运算符前面的语句部分试图在定义它之前引用
obj1
obj1=obj1 | | Class1。new
不会这样做,因为它会在引用
obj1
之前启动赋值?你是得到了一个错误,还是仅仅是一个你没有预料到的结果?在这种情况下,优先规则是关键。@JezC
x | | x=10
如果
x
未定义,而
x | |=10
未定义,则会引发一个
名称错误。我一直认为它大致相当于
obj1=obj1 | Class1。new
,除非
obj1
被允许为
nil
false
。什么使您认为是不正确的?你是得到了一个错误,还是仅仅是一个你没有预料到的结果?在这种情况下,优先规则是关键。@JezC
x | | x=10
如果
x
未定义,而
x | |=10
未定义,则会引发一个
名称错误。我一直认为它大致相当于
obj1=obj1 | Class1。new
,除非
obj1
允许为
nil
false