Rubyで範囲オブジェクトを配列にする方法
19/01/27 16:24:00 19/01/27 18:57:08
範囲オブジェクトと配列は似ていますが、簡単に変換することが可能です。具体的には、to_aメソッドを使用します。このページではto_aメソッドの使用方法について紹介しますが、それだけだと範囲オブジェクトと配列の違いや使い方についていまいちよくわからないかと思います。
配列については馴染みがあるかと思いますが、範囲オブジェクトの目的がよくわからないという方も多いでしょう。そこで、前半ではto_aメソッドの使い方について解説し、後半ではより理解が深まるよう範囲オブジェクトの意義や使い方について解説します。
目次
to_aメソッドとは
to_aメソッドは配列や範囲オブジェクトに対して使用できるメソッドで、戻り値は配列です。それでは、配列に使用した場合と範囲オブジェクトに使用した場合の具体例を見ていきましょう。どちらも同じように配列で返ってきます。
配列に対してto_aメソッドを使用した場合
まず配列に対してto_aメソッドを使用する場合についてです。以下がサンプルコードになります。
ar1 = [1, 2, 3]
ar2 = [4, 5, 6]
ar3 = [7, 8, 9]
def ar_m(a1, a2)
a1.to_a + a2.to_a
end
p ar_m(ar1, ar2)
p ar_m(ar1, ar3)
上記のコードを実行すると、以下のようにコンソール出力されます。
[1, 2, 3, 4, 5, 6]
[1, 2, 3, 7, 8, 9]
まず最初に配列を三つ用意しています。次に、配列を連結するメソッドを用意します。このメソッド内で、第一引数と第二引数の配列をto_aメソッドで連結するように指定しています。
そして、出力コードのところでメソッドを呼び出し、それぞれ第一引数と第二引数を指定しています。その結果、引数に指定した配列同士が連結して出力されました。一見すると何をやっているのかよくわからなかったかもしれませんが、一つ一つ分解して見ていくと処理内容はシンプルです。
ちなみに、引数や戻り値の概念がいまいちよくわからないという方はぜひ調べてみてください。
配列と範囲オブジェクトを連結する
次に、配列と範囲オブジェクトを連結する方法を紹介します。考え方は配列単体の場合と同じで、サンプルコードは以下です。
ar = [1, 2, 3]
ra = 4..6
def ar_m(a1, a2)
a1.to_a + a2.to_a
end
p ar_m(ar, ra)
まず配列と範囲オブジェクトをそれぞれ定義します。次に第一引数と第二引数を連結するメソッドを用意します。そして、出力コードの部分でメソッドを呼び出し、引数として配列と範囲オブジェクトを渡しました。戻り値は連結した結果であるため、以下のようにコンソール出力されます。
[1, 2, 3, 4, 5, 6]
配列だけに対してメソッドを使った場合とまったく同じ流れなので、to_aメソッドの使い方はシンプルです。範囲オブジェクトはなくなり、すべて配列になりました。
範囲オブジェクトを連結する
ここまでの流れから予測できる通り、範囲オブジェクトに対してto_aメソッドを使用すると配列で返ってきます。なので範囲オブジェクト同士を連結しても良いのですが、あえて範囲オブジェクト一つに対してto_aメソッドを使う使い方も一般的です。
本来to_aメソッドは二つ以上の配列を結合するものですが、配列として返ってくる特性のみを利用し、範囲オブジェクトを配列に変換するイメージです。サンプルコードは以下になります。
ra1 = 1..10
ra2 = 'a'..'z'
p ra1.to_a
p ra2.to_a
上記のソースコードを実行すると、以下のようにコンソール出力されます。
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[“a”, “b”, “c”, “d”, “e”, “f”, “g”, “h”, “i”, “j”, “k”, “l”, “m”, “n”, “o”, “p”, “q”, “r”, “s”, “t”, “u”, “v”, “w”, “x”, “y”, “z”]
範囲オブジェクトがそのまま配列に変換されました。この使い方は非常に便利で、コードの冗長さを防げます。たとえば1~10の数字やアルファベットがすべて入った配列を使用したい場合、すべての要素を記述するのは冗長です。
とはいえ範囲オブジェクトのままだと使えないので、コードのなかの必要な個所で範囲オブジェクトを配列に変換し、処理に使うということができます。
文字列を配列に変換する方法
ついでですが、to_aメソッドは文字列を配列に変換することも可能です。ただし文字列に対して直接的にto_aメソッドを使用することはできないので、いったんsplitメソッドでカンマ区切りにし、配列にするための準備を整えます。サンプルコードは以下です。
str = "January, February, March, April, May", "June", "July", "August", "September", "October", "November", "December"
p str.split(",").to_a
上記のコードを実行すると、以下のようにコンソール出力されます。
[“January, February, March, April, May”, “June”, “July”, “August”, “September”, “October”, “November”, “December”]
範囲オブジェクトとは
範囲オブジェクトを配列に変換する方法を紹介してきたので、すでに直感的に範囲オブジェクトが何かは把握されているかと思います。しかししっかりと理解しておいた方が今後応用が利くので、範囲オブジェクトについて解説しておきます。
範囲オブジェクトは範囲開始値と範囲終了値を指定することで、メモリ領域を節約しながら値を保持できるものです。たとえば以下のサンプルコードのように範囲オブジェクトを作って出力してみます。
ra = 1..10
p ra
このコードを出力すると、以下のようになります。
1..10
文字出力でも同様の結果になりますが、文字は連結のところでも扱ったのでここでは割愛します。範囲オブジェクトを出力しても、配列のようにはならずにそのまま範囲指定のまま出力されます。
処理に使用する際も範囲のままなので、上で解説したようにto_aメソッドで配列に変換するのです。上では配列に変換しましたが、配列に変換せずにループ処理で値を取り出して使用することも可能です。サンプルコードは以下です。
(1..5).each do |i|
p i
end
このコードを実行した結果は以下です。
1
2
3
4
5
このように、ループで範囲オブジェクトを処理することができます。配列に変換するのとどちらが良いかはケースバイケースですが、配列にしてループ処理をするなら直接範囲オブジェクトをループ処理した方がシンプルかもしれません。
また、eachメソッドと同じようにfor文で処理することもできます。範囲オブジェクトの使い方は他にもいろいろありますが、配列に変換する使い方と関連する部分は以上の通りです。
配列も範囲オブジェクトもto_aメソッドの使い方も特に難しい点はなかったかと思いますが、後はソースコードのなかでどのように活用するかの問題です。プログラミングは基本的に単一処理自体はどれほど大きいシステムでもシンプルです。
シンプルな処理が積み重なった結果複雑に見えているだけなので、ぜひ基本を押さえていき、ステップ数が大きくて一見すると複雑なコードを読み書きする際もコードを分解して混乱しないようにしてください。
Ruby関連記事
1, Rubyフリーランスの仕事や単価、ruby on railsの在宅案件まで
2, Rubyとは?学習方法や将来性、perlやphp、Pythonの比較はどう?
3, Ruby on RailsでMySQLを使用する際の接続手順
4, あるiOSアプリのエンジニアがRuby on Railsのプロジェクトに加わった話
5, 小学生でも数時間でアプリを作れたRuby on railsの入門書3選
6, 【決定版!】Rubyでできることとは?
7, Ruby開発の新卒採用している会社まとめ
8, Rubyで文字列から数値へ変換する方法まとめ
9, RubyのWebサーバ「puma」を使ってみた感想
10, Rubyでのmecabの使い方を徹底解説します
11, Rubyでハッシュに対する繰り返し処理を行うeachの3つのメソッドの使い方
12, Rubyのyardを使ってソースからドキュメントを生成する方法
13, Rubyでディレクトリ内のファイルを一覧出来るようにする方法
14, Rubyを使ってcsvファイルを読み込む・書き込む方法まとめ
15, MacでRubyの開発環境構築する方法をまとめました
16, サーバーサイド開発言語としてのRubyってどうなの?
17, (この記事)Rubyで範囲オブジェクトを配列にする方法
18, CentOSサーバにRubyをインストールする方法
19, Rubyを使ってやりたいことから逆引きで使える機能を解説します
20, Rubyでopen uriを使ってWeb上のデータを取得しよう
21, Rubyでハッシュをマージ(結合)する方法まとめ
22, Rubyのrakeの使い方をまとめました
23, Rubyでのtimeクラスの取扱に関してのまとめ
人気記事