String#split
などで配列を作成する場合、指定した長さより実際の長さが短いことがある。
長さ5の配列を作りたい
"a,b,c,d,e,f,g".split(',', 5)
#=> ["a", "b", "c", "d", "e,f,g"]
"a,b,c".split(',', 5)
#=> ["a", "b", "c"] # 足りない…
Array#[]
や #first
や #take
を使っても数を増やすことはできない。
ary = "a,b,c".split(',', 5)
ary[0...5]
#=> ["a", "b", "c"]
ary[0, 5]
#=> ["a", "b", "c"]
ary.first(5)
#=> ["a", "b", "c"]
ary.take(5)
#=> ["a", "b", "c"]
Array#values_at
なら増やせる。
"a,b,c".split(',', 5).values_at(0...5)
#=> ["a", "b", "c", nil, nil]
破壊的に拡張したいなら、 Array#[]=
で範囲外に代入する手がある。
"a,b,c".split(',', 5).tap { |a| a[5-1] = a[5-1] }
#=> ["a", "b", "c", nil, nil]
nil
でなくデフォルト値があるのなら、 #zip
でも良いかもしれない。
[*"1".."5"].zip("a,b,c".split(',', 5)).map { |v0,v| v || v0 }
#=> ["a", "b", "c", "4", "5"]
※ ||
を使う場合は、偽の値( nil
と false
)が既に入っていても書き換えてしまうので注意。