Ruby `(a | |=[])<&书信电报;1`对`(i | |=0)和"x2B;=1 `

Ruby `(a | |=[])<&书信电报;1`对`(i | |=0)和"x2B;=1 `,ruby,syntax,Ruby,Syntax,虽然我写Ruby已经有一段时间了,但我一直在寻找改进我风格的方法 我已经习惯了一种非常简短、简洁的实例化+附加到数组的方法: ruby-1.9.3-p194 :001 > (a ||= []) << 1 => [1] ruby-1.9.3-p194:001>(a | |=[])[1] 这种特殊的语法似乎只有在与数组结合使用时才有效,因为我尝试使用其他类型时会返回语法错误 ruby-1.9.3-p194 :002 > (i ||= 0) += 1 Syntax

虽然我写Ruby已经有一段时间了,但我一直在寻找改进我风格的方法

我已经习惯了一种非常简短、简洁的实例化+附加到数组的方法:

ruby-1.9.3-p194 :001 > (a ||= []) << 1
 => [1] 
ruby-1.9.3-p194:001>(a | |=[])[1]
这种特殊的语法似乎只有在与数组结合使用时才有效,因为我尝试使用其他类型时会返回语法错误

ruby-1.9.3-p194 :002 > (i ||= 0) += 1
SyntaxError: (irb):2: syntax error, unexpected tOP_ASGN, expecting $end

(i ||= 0) += 1
            ^
from /usr/local/rvm/rubies/ruby-1.9.3-p194/bin/irb:16:in `<main>'
ruby-1.9.3-p194:002>(i||=0)+=1
语法错误:(irb):2:语法错误,意外的tOP\u ASGN,应为$end
(i | |=0)+=1
^
from/usr/local/rvm/rubies/ruby-1.9.3-p194/bin/irb:16:in`'
而且,对于字符串,尽管我非常希望这在之前的实验中不起作用

ruby-1.9.3-p194 :003 > (s ||= '') += 'TEST'
SyntaxError: (irb):3: syntax error, unexpected tOP_ASGN, expecting $end

(s ||= '') += 'TEST'
             ^
from /usr/local/rvm/rubies/ruby-1.9.3-p194/bin/irb:16:in `<main>'
ruby-1.9.3-p194:003>(s | |='')+='TEST'
语法错误:(irb):3:语法错误,意外的tOP\u ASGN,应为$end
(s | |='')+='测试'
^
from/usr/local/rvm/rubies/ruby-1.9.3-p194/bin/irb:16:in`'

使用这种语法形式时,数组与其他类型的区别是什么?

在Ruby中,与大多数其他语言一样,缩写赋值只是扩展形式的语法糖,即

a += b
语法上的糖是什么

a = a + b
(i ||= 0) = (i ||= 0) + 1
所以

语法上的糖是什么

a = a + b
(i ||= 0) = (i ||= 0) + 1
这完全是违法的

这与数组完全无关,如您在此处所见:

(s ||= '') << 'TEST' # works

(a ||= []) += [1]    # doesn't work

(s | |='')左侧必须是一个变量。那么:

i = (i || 0) + 1


您可以将这些受保护的语句用于提供将更改变量状态的操作的任何内容,例如concat for String,
(i | |=0)
是否可能返回一个不被视为对
i
的引用的值,或者Ruby解释器是否真的是这样?如果
(i | |=0)+=1
(i||=0)=(i||=0)+1
的语法糖,为什么
i+=1
(如果
i
nil
)与
i|=0不一样;i+=1
?我觉得我还没有完全理解这段语法是如何解释的。
I+=1
将转换为
I=I+1
,如果
I
nil
a | |=b
被特殊处理,这是一个错误。它是唯一不遵循简单转换规则的缩写赋值运算符。我没有回答这个问题,因为它与你在问题中看到的问题无关,
1.9.2p290 :111 > s = nil
 => nil 
1.9.2p290 :112 > (s ||= '').concat 'test'
 => "test" 
1.9.2p290 :113 > (s ||= '').concat 'test'
 => "testtest" 
1.9.2p290 :130 > i = nil
 => nil 
1.9.2p290 :131 > (i || 0).succ
 => 1 
1.9.2p290 :132 > (i || 0).succ
 => 1 
1.9.2p290 :134 > i = nil
 => nil 
1.9.2p290 :135 > i = (i || 0) + 1
 => 1 
1.9.2p290 :136 > i = (i || 0) + 1
 => 2