Search

検索したいワードを入力してください

2019年03月07日

Rubyのto_aメソッド使い方とto_aryとの違いを解説

Rubyで使えるto_aメソッドは、リファレンスを読んだだけではわかりにくい部分もありますが、理解すれば、Rubyのプログラム開発において、配列の扱いが容易になります。本記事の解説も参考にto_aメソッドの使い方を習得しましょう。

Rubyのto_aメソッドとは

Rubyで使えるto_aメソッドは、配列や範囲オブジェクトの値を返してくれるメソッドです。数値変換したり文字列変換するメソッドに比べると、プログラミング初心者にとっては、リファレンスなどの説明を読んだだけでは、少しわかりづらいメソッドともいえます。

to_aメソッドは、「object.to_a」の形式で記述します。object部分には配列や、配列を返すメソッド、範囲オブジェクトなどが指定可能です。

to_aryメソッドとの違い

Rubyには、to_aメソッドと似たto_aryというメソッドがあります。どちらのメソッドもレシーバ自身を返すメソッドです。

to_aメソッドと異なる点は、to_aryはレシーバのクラスが配列(Array)のサブクラスであっても、レシーバ自身を返します。to_aryは暗黙的な変換に使われ、to_aは明示的な変換に使われます。to_aryは並列割当てには有効で、 to_aは実際の変換に適しています。

to_aメソッドの基本的な使い方

ここでは、実際にRubyのコードとして動かしながら、to_aメソッドの使い方を見ていきましょう。to_aは配列のほか、範囲オブジェクトの値も扱うことができます。

基本の「object.to_a」の形式で使用するオブジェクトの種類に応じ、どのような結果を得ることができるのか、個別に見てみましょう。

to_aメソッドを配列で使用する方法

まずは配列でto_aメソッドを使用する方法をご紹介します。ここでは3つの配列の結合をto_aメソッドを利用して行います。

【コード記述例】
array1 = [1, 2, 3]
array2 = [4, 5, 6]
array3 = [7, 8, 9]

def array_m(a1, a2)
a1.to_a + a2.to_a
end

p array_m(array1, array2)
p array_m(array1, array3)

実行結果(例)

このサンプルでは、メソッドarray_mでto_aメソッドを使用することで、与えられた配列を連結して返しています。メソッドに渡された2つ目の配列が、1つ目の配列に追加される形の配列となります。

【実行結果】
[1, 2, 3, 4, 5, 6]
[1, 2, 3, 7, 8, 9]

array1、array2、array3はいずれも要素が3の配列なので、結合結果となる配列は要素が6になっています。

to_aの検証

ここで使用したサンプルコードを少し変えて実行してみると、to_aメソッドの効果を確認することができます。

【コード記述抜粋部分】
def array_m(a1, a2)
a1.to_a + a2.to_a
end


この抜粋部分の「a1.to_a + a2.to_a」を変えて実行してみましょう。

・変更1:a1+ a2.to_a
・変更2:a1.to_a + a2

変更1:配列に配列.to_a追加変更2:配列.to_aに配列を追加
コード記述例p [1,2,3]+ [4,5,6].to_ap [1,2,3]+ [4,5,6].to_a
実行結果[1,2,3,4,5,6]NoMethodError: undefined method `+' for # <PseudoArray: xxxxxxxxx@value=6>

範囲オブジェクトで使用する方法

範囲オブジェクトでto_aメソッドを使ってみると、実行結果は配列で戻されます。イメージをつかむためにサンプルコードとその実行結果を見てみましょう。

以下の例では、1から10という数値範囲とaからzという文字範囲を扱います。

【コード記述例】
range1 = 1..10
range2 = 'a'..'z'

p range1.to_a
p range2.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"]

文字列で使用する方法

to_aメソッドは、直接文字列に対して使用することはできません。しかし、配列を返すメソッドを経由して使用することはできます。

言葉による説明よりも、実際のコード記述例と扱うデータの内容、サンプルコードの実行結果を参照した方がわかりやすいでしょう。以下のサンプルコードと実行結果を見てみましょう。

コード記述例

このコード記述例では、配列にしたい文字列を、指定した区切り文字で分割するsplitメソッドを介して配列にしています。

str ="Sun, Mon, Tue, Wed, Thurs, Fri, Sat"
p str.split(",").to_a


【実行結果】
["Sun", " Mon", " Tue", " Wed", " Thurs","Fri", "Sat"]

Rubyのto_aメソッドを使いこなす

to_aメソッドは、オブジェクトから配列を作るメソッドですが、この「オブジェクト」にはハッシュも含まれます。「ハッシュ.to_a」の形式で使うことで、ハッシュを二次元配列に変換して返してくれます。to_aメソッドからは、[キー, 値]を並べた配列の配列が返されます。

ハッシュを、to_aメソッドにより二次元配列に変換した結果として返されるデータの並び順は、使用するRubyのバージョンにより異なります。

コード記述例
scores = { "Sato" => 100, "Suzuki" => 55, "Tanaka" => 90, "Takahashi" => 40 } p scores.to_a
【実行結果例】
[["Sato", 100], ["Suzuki", 55], ["Tanaka", 90], ["Takahashi", 40]]

配列の要素数を取得する

プログラミング経験のある人にとっては、おなじみの構文ともいえますが、「object.to_a.size」とコード記述すれば、オブジェクトを配列にした際の要素数を取得することができます。プログラムの中で、要素数分の処理が必要でループさせる場合にも役立ちます。

コード記述例
【コード記述例】
range1 = 1..10
range2 = 'a'..'z'

p range1.to_a.size
p range2.to_a.size

【実行結果】
10
26

配列と範囲オブジェクトの結合

Rubyでプログラミングを行う中では、配列として取得したデータと、範囲オブジェクトとして取得したデータを連結して扱う必要のある局面もあります。

配列と範囲オブジェクトを結合して扱いたい場合も、to_aメソッドを使えば、同じ配列形式に揃えることができ、扱いが容易になります。

コード記述例
【コード記述例】
array1 = ["aaa" , "bbb" , "ccc" ]
range1 = 'a' .. 'c'

p array1.to_a + range1.to_a
【実行結果】
["aaa" , "bbb" , "ccc" , "a" , "b" , "c" ]

参考:to_aを使わないで結合できるか

配列と範囲オブジェクトの結合を、to_aメソッドを介さず、単純に結合させるとエラーになります。以下のコードを実行し、エラー結果も確認してみましょう。

【エラーとなるコード記述例】
array1 = ["aaa" , "bbb" , "ccc" ]
range1 = 'a' .. 'c'

p array1 + range1

【実行結果】
no implicit conversion of Range into Array (TypeError)

Rubyのto_aは配列を扱うときに便利!

Rubyのto_aは、プログラムで配列を扱う場合に、配列の操作が容易にできます。オブジェクトをto_aメソッドひとつで簡単に配列にできるので、Rubyで開発を行うなら、頭の片隅に置いておきたいメソッドです。

to_aを使うことの効果は、リファレンスを参照しただけでは、プログラミング初心者にはわかりにくい部分もありますが、本記事でご紹介したサンプルコードの実行結果も参考に、動作を理解しましょう。

【PR】多くの人がプログラミングを諦めてしまう理由をご存知ですか?



近年プログラミングを勉強する人が増えています。

プログラミング学習者の多くは独学から取り組もうとしますが、だいたい80%ほどは3ヶ月も続かずに諦めてしまいます。早い人は1日目で。

多くの人がプログラミングを独学しようとして諦める理由は、次の3つ。
●モチベーションが維持できない
●エラーの原因・解決方法が分からない
●どう学習すればよいか分からない

TechBoostというプログラミングスクールでは、みんなと一緒にプログラミングをするのでモチベーションの維持ができ、分からないことがあればマンツーマンで教えてくれ、徹底的に研究された初心者向けの教材が揃っています。

TechBoostを卒業後、実際にエンジニアとして転職した方もいるほど。

本気でプログラミングを学びたい方は、一度無料のカウンセリングでご相談ください。プログラミングを嫌いになる前に。

tech boostについて

オーダーメイド型の学習コンテンツを提供する「tech boost」 は、エンジニアのキャリア支援に特化したサービスを複数展開している株式会社Branding Engineerが運営しているプログラミングスクールです。最短3ヶ月間で、未経験から『プログラミングの基礎』、『実際に業務で必要となるスキル』、『今のトレンドとなっている知識』まで学べ、ご希望の方にはプロのキャリアアドバイザーによる就業支援を行うことができます。

tech boost卒業生インタビュー

tech boostの卒業生の声を聞きました。あなたがプログラミングを学びたい理由を、一度考えてみてください。
営業→Javaエンジニア→Rubyエンジニアと転向し、第一志望のFinTech企業で働く山下さん
元営業、ビジネスのわかるエンジニアを目指す菅原さん
サンフランシスコに交換留学し、シリコンバレーのVCでインターン中の梅本さん
予備校の営業から半年でエンジニア転職を果たした小田島さん

tech boostの口コミ



Related