`(a || = [])<< 1`与`(i || = 0)+ = 1`

Ada*_*lin 4 ruby syntax

虽然我已经写了一段时间的Ruby,但我总是在寻找改善风格的方法.

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

ruby-1.9.3-p194 :001 > (a ||= []) << 1
 => [1] 
Run Code Online (Sandbox Code Playgroud)

此特定语法仅在与Arrays结合使用时才有效,因为我尝试使用其他类型返回语法错误.

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>'
Run Code Online (Sandbox Code Playgroud)

并且,还有字符串,虽然我非常期望这在先前的实验中不起作用.

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>'
Run Code Online (Sandbox Code Playgroud)

在使用此语法形式时,将Array与其他类型区分开来的是什么?

Jör*_*tag 5

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

a += b
Run Code Online (Sandbox Code Playgroud)

是语法糖

a = a + b
Run Code Online (Sandbox Code Playgroud)

所以,

(i ||= 0) += 1
Run Code Online (Sandbox Code Playgroud)

是语法糖

(i ||= 0) = (i ||= 0) + 1
Run Code Online (Sandbox Code Playgroud)

这完全是非法的.

这与数组完全无关,你可以在这里看到:

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

(a ||= []) += [1]    # doesn't work
Run Code Online (Sandbox Code Playgroud)