
[code]

    ['a1', 'a2', 'a3', 'a4']
    
[/code]

このような配列を作りたいのですがどうやればいいのでしょうか。  
普通の数字やアルファベットだけやるときみたいに`[*1..4]`のように['a'*1..4]という感じでできないのでしょうか。


CC BY-SA 3.0
2015-09-29T08:33:26.353
17055
2015-09-30T03:03:09.227
10439
question
ruby
Rubyで文字付きの連番配列を作るには


`[*'a1'..'a4']` でできます。


CC BY-SA 3.0
2015-09-29T08:41:27.277
17056
2015-09-29T08:41:27.277
3249
17055
answer


Arrayのコンストラクタにブロックを渡せるので、以下のように書くのが一番素直なような気がします。

[code]

    Array.new(4) {|i| "a#{i + 1}" }
    
[/code]


CC BY-SA 3.0
2015-09-29T18:13:17.837
17074
2015-09-29T18:13:17.837
9608
17055
answer


こんなのはどうでしょう？

[code]

    (1..20).map{|i| "a#{i}"}
    => ["a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a11", "a12", "a13", "a14", "a15", "a16", "a17", "a18", "a19", "a20"]
    
[/code]

あとはこんなのとか

[code]

    ['a'].product([*1..20]).map(&:join)
    => ["a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a11", "a12", "a13", "a14", "a15", "a16", "a17", "a18", "a19", "a20"]
    
[/code]

おそらく`['a'*1..4]`のようなレベルで書くのは無理で、いくつかのメソッドを組み合わせる必要はあると思います。


CC BY-SA 3.0
2015-09-29T19:35:15.310
17075
2015-09-29T19:35:15.310
85
17055
answer


`[]`メソッドに`Range`を渡すとプレフィックスがついた連番を返すクラスを実装すると良いのではないでしょうか

[code]

    class PrefixedSequence
      def initialize(prefix)
        @prefix = prefix
      end
    
      def [](range)
        range.map {|x| "#{@prefix}#{x}"}
      end
    end
    
    a_seq = PrefixedSequence.new(?a)
    
    a_seq[1..10]
    
[/code]


CC BY-SA 3.0
2015-09-30T03:03:09.227
17083
2015-09-30T03:03:09.227
2599
17055
answer