RubyのArray(配列)の使い方

morimorihogeです。そとがさむい。 たまには初心者向けの記事を書いてみようということで、Rubyの配列であるArrayクラスについて、基本的な部分に絞った内容を書いてみようと思います。PHP等の他言語からRubyを勉強している人なんかには参考になるのではないかと思います。 ※超初心者向けです。確認環境は2.4.0準拠ですが1.9.3以降のそこそこ最近のRubyであればほとんど問題なく利用できると思います。 基本的には公式のArrayドキュメント に書いてあることばかりですが、リファレンス形式だと読みにくい、という人はどうぞ。 なお、引用サンプルではpry の出力結果を出していますが、これはIRBでも同じことができます。手元で動かしてみたい方はrubyが入っていればとりあえずirbして以下を追いかけてもらうと良いでしょう。 Arrayの初期化 RubyにおけるArrayは、リテラルを使って初期化できます。空配列であれば arr_var = [] で良いですし、明示的にArray.newを使って arr_var = Array.new とすることもできます。 RubyのArrayはPHP等と同じように、中にどんなオブジェクトも要素として持つことができますので、 [1, “piyo”, nil, nil] といったArrayも定義可能です。また、Rubyらしい初期化方式だと、Array.newにブロックを渡して [3] pry(main)> Array.new(5) {|index| “hoge_#{index}”} => [“hoge_0”, “hoge_1”, “hoge_2”, “hoge_3”, “hoge_4”] みたいなこともできます。 Arrayの要素アクセス 要素へのアクセスは、他の言語でも一般的な添字を使った arr_var[1] といったアクセス(添字は0番目から始まる)もありますし、#fetchメソッドを使い arr_var.fetch(1) としても良いです。通常は添字アクセスだけ覚えていれば良いように思いますが、#fetchは第二引数に値が見つからなかった場合のデフォルト値指定ができるため、 [12] pry(main)> arr_var[10000] => nil [13] pry(main)> arr_var.fetch(10000, 0) => 0 という感じで指定した添字の値がない場合にnil以外を受け取りたい、といったときに覚えておくと便利です。 また、Rubyらしいアクセス方式として、添字にRangeオブジェクト(n..m)を渡すことによって部分Arrayを取り出せます。n番目の要素からm番目の要素まで取り出す感じですね。 [60] pry(main)> arr_var = [1,2,3,4,5] => [1, 2, 3, 4, 5] [61] pry(main)> arr_var[2..3] => [3, 4] Arrayの大きさ取得 #size #length Arrayの要素数を取得するには#sizeまたは#lengthを使います。最大の添字番号ではないので注意です。 [53] pry(main)> arr_var = [1,2,3] => [1, 2, 3] [54] pry(main)> arr_var.size => 3 [55] pry(main)> arr_var.length => 3 Arrayの要素に対する繰り返し どんな入門書にも必ず載っている#eachとブロックを使えば良いですね。Rubyではcollection(集合)オブジェクトの中身を順番に取り出したければ基本#eachだと思っていて良いです。 Rubyにfor文は構文としてはありますが、ほとんど使われません。他言語から来た人が一番違和感を覚える所かもしれませんが、ブロックを使った記法に慣れるためにもforは使わず#eachを使うようにしていくのが良いと思います。 中括弧を使ったブロックの書き方では arr_var.each{|val| puts “value: #{val}”} do-endを使った書き方であれば arr_var.each do |val| puts “value: #{val}” end とすれば良いです。上記二つは全く同じ意味になりますが、Ruby Style GuideというRubyの好ましい書き方まとめ に沿うのであれば、ブロックの中身が1行で終わるなら中括弧記法、2行以上あるならdo-end記法となります。 とりあえず動けばいいや、という話であればどちらでも構いませんが、よりRubyらしい書き方、美しい(他人が読みやすいとされる)コードを目指すのであれば少しずつ追いかけていくと良いと思います。 Arrayの要素削除 Arrayから特定の要素を削除したい場合には#deleteまたは#delete_atを使います。 #deleteは引数と==マッチする要素全てを削除します。添字番号を指定して削除するのは#delete_atです。間違えると悲しいことになるので気をつけましょう。 [14] pry(main)> arr_var = [1,2,3,4,5] => [1, 2, 3, 4, 5] [15] pry(main)> arr_var.delete(4) => 4 [16] pry(main)> arr_var => [1, 2, 3, 5] [17] pry(main)> arr_var = [1,2,3,4,5] => [1, 2, 3, 4, 5] [18] pry(main)> arr_var.delete_at(4) => 5 [19] pry(main)> arr_var => [1, 2, 3, 4] Ruby的なメソッドとしては#delete_ifがあります。これは要素を順番にブロック内で評価し、ブロックの評価結果(最後に評価された式)がtrueになった要素を削除します。 他の言語だとforやforeachループを書いて削除していく処理を、組み込みメソッドで書けるのがシンプルで良いですね。 [20] pry(main)> arr_var = [1,2,3,4,5] => [1, 2, 3, 4, 5] [21] … Continue reading RubyのArray(配列)の使い方