2013-03-22 91 views
-3

根据我已阅读的有关Ruby中||=运算符的内容,我预计下面的代码行应将示例中的变量a(尚未分配的变量)分配给5红宝石测试和赋值变量

a |= "-----n-".index /n/ 

只是评估"-----n-".index /n/自身给你5

然而,执行上述行之后,a设为true

下套bfalse,而我预计b应该nil

b |= "-----n-".index /o/ 

能否请你这个解释一下吗?

+0

'|'是按位* *'或'运营商,而''||是*逻辑*'或'运营商。另一方面,'|| ='不是一个操作符。解析器会看到'a || = b'并将其视为'a = a || B'。你可以专注于'||'或'|'。 – oldergod 2013-03-22 05:06:13

+1

这是他的错误,是的。但是为什么按位OR在应用于未定义的变量时返回布尔值 - 这是一个难题! – 2013-03-22 05:08:00

+0

@SergioTulentsev它不是未定义的。解析器设置为'nil'所有'var = anything'变量。 – oldergod 2013-03-22 05:08:44

回答

1

||=|=是不同的运营商。你谈论一个,但使用另一个。请注意!

a ||= "-----n-".index(/n/) # => 5 
b ||= "-----n-".index(/o/) # => nil 

c |= "-----n-".index(/n/) # => true 
d |= "-----n-".index(/o/) # => false 
2

这是因为a |= expr被脱到a = a | expr。在右侧,a最初是nil

该表达式相当于a = nil | expr,如果参数非零(参见documentation on nil#|了解详细信息),则返回true。你可能打算写a ||= expr这是desugared a = a || expr

+0

对不起,我犯了一个错误,我们之间的混淆| =和|| =。嗯,我确实看到它的作用。 – mydoghasworms 2013-03-22 05:50:23

+0

'a || = expr' **不是同一个**,因为'a = a || expr'。它有时与'a ||相同a = expr',但并非总是如此。请参阅http://stackoverflow.com/a/2505285/421705 – 2013-03-22 08:43:55