4

私はしばらくの間Rubyを書いていますが、自分のスタイルを改善する方法を常に探しています。

私は、配列をインスタンス化して追加する、特に短く簡潔な方法に慣れてきました。

ruby-1.9.3-p194 :001 > (a ||= []) << 1
 => [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 :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>'

この構文形式を使用する場合、配列を他の型と区別するのはここで何ですか?

4

3 に答える 3

5

Rubyでは、他のほとんどの言語と同様に、省略された割り当ては、拡張された形式の単なる構文糖衣です。

a += b

のシンタックスシュガーです

a = a + b

それで、

(i ||= 0) += 1

のシンタックスシュガーです

(i ||= 0) = (i ||= 0) + 1

これは単に違法です。

あなたがここで見ることができるように、これは配列とは全く関係がありません:

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

(a ||= []) += [1]    # doesn't work
于 2012-10-14T04:11:13.573 に答える
0

これらの保護されたステートメントは、変数の状態を変更する操作を提供するすべてのものに使用できます。たとえば、Stringの場合はconcat、Arrayの場合は<<などです。

1.9.2p290 :111 > s = nil
 => nil 
1.9.2p290 :112 > (s ||= '').concat 'test'
 => "test" 
1.9.2p290 :113 > (s ||= '').concat 'test'
 => "testtest" 

FixNumなどの一部のタイプでは、割り当てなしでは状態を変更できないため、実際にはオプションがありません。そのため、最も近いものはsucですが、ご覧のとおり、保存された値は更新されません。

1.9.2p290 :130 > i = nil
 => nil 
1.9.2p290 :131 > (i || 0).succ
 => 1 
1.9.2p290 :132 > (i || 0).succ
 => 1 

そのようなタイプの場合は、JörgW Mittagの提案をお勧めします。これは、i = (i || 0) + 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 
于 2012-10-14T07:45:51.277 に答える
0

左辺は変数でなければなりません。どうですか:

i = (i || 0) + 1

また

i = i ? i + 1 : 1
于 2012-10-14T05:15:08.523 に答える