Pocket

どうもこんにちは,Rubyを使っていてハッシュみたいにある要素にアクセスしたときに値が存在しない場合のデフォルト値を設定できれば嬉しいなと思っていたのですが,どうもそういう機能がないようなので,0に初期化する方法を見つけました。

要は無限の要素に対して0で初期化したいわけです。

a = Array.new(,0)
5.times{|i| a[i] += 1}
p a => [1, 1, 1, 1, 1]

みたいなことがしたいわけです。
※もちろんこんな書き方はありません。

ぱっと考え付くのは,if文などを使って条件わけをすることですが,
そんなの全然スマートじゃない!

というわけで・・・
考えてみました。

今回注目したのは,
「nilに対して#to_iを行うと0になる」
という性質です。

これを使って,書くと

a = Array.new()
5.times{|i| a[i] = a[i].to_i + 1}
p a => [1, 1, 1, 1, 1]

みたいにワンラインで書くことができます。
※これはちゃんと動きます。

なので,if文とかで2行以上やりたくないときは使ってみてください。

まあ,2回目以降は数値に対して#to_iメソッドを使ってるのでエレガントではないですね・・・。

2015/9/19(土)追記
後で知ったのですが、Integer#to_iメソッドはselfを返すらしいので
この書き方はあながち間違ってないかもしいれないですね~。
http://docs.ruby-lang.org/ja/2.1.0/class/Integer.html#I_TO_I

Pocket