質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

2回答

1783閲覧

rubyの配列の問題

aaa10

総合スコア13

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2018/02/14 11:18

1からnまで数値を要素に持つ配列を返す create_array メソッドを実装

<実装内容>
create_arrayメソッドは引数に与えられた数nまで(nを含む)の数値を要素に持つ配列を返すメソッドです
nが0以下の場合はからの配列を返してください.
要素は1からnまで(nを含む)小さい順に並べてください.

この問題がわからないです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

[1, 2, 3] のような配列を得る方法はいろいろあるのですが,範囲オブジェクトと呼ばれるものから配列に変換する方法を示します。

範囲オブジェクトは Range というクラスのインスタンスです。

1..3 と書けば「1 から 3 までの範囲」という Range オブジェクトが得られます。

この範囲オブジェクトの to_a というメソッドを呼び出すと配列オブジェクトになります。

rb

1(1..3).to_a #=> [1, 2, 3]

to_a というメソッド名は to array から来ているようです。

上の式で,1..3( ) を付けました。括弧を付けずに

rb

11..3.to_a

と書いちゃうと,3 に対して to_a しようとしてエラーになるからです。

また,上の式で,#=> [1, 2, 3] と書いたのは,式の評価結果が [1, 2, 3] になりますよ,という意味です。(そう書く習慣があります)

さて,これを利用すれば,1 以上の任意の整数 n に対して,

rb

1(1..n).to_a

で目的の配列が得られることがわかりますね。

n が 0 以下の整数の場合については後述します。

ところで,範囲オブジェクトに to_a して配列が得られることを理解するのは実はちょっと難しいです。

さわりだけ説明するので,これをヒントにしっかり勉強してくださいね。Ruby の基本的なクラスの本質に関わることです。

公式リファレンスマニュアルの class Range のところをみると,範囲オブジェクトで使えるメソッドの一覧が載っていますが,実はここには to_a というメソッドは掲載されていません。

いったい to_a は何者なのでしょうか。

上記のページの先頭のほうに

クラスの継承リスト: Range < Enumerable < Object < Kernel < BasicObject

という行があり,Range には Enumerable というものが継承されていることが分かります。

この情報からは読み取れないのですが,もう少し詳しくいうと,Range クラスには Enumerable モジュールが include されています。

Enumerable というモジュールは,何らかの意味で〈要素を一つ一つ取り出すことができる〉ようなクラスに対し,さまざまな機能を持ち込むためのものです。

Enumerableinclude 先であるクラスには,要素を一つ一つ取り出すための each というメソッドが定義されていることが仮定されています。

実際,Range クラスにも each メソッドが定義されています。

Range クラスの each メソッドのことを Range#each と書く習慣があるので,以後,そう書きます。

Range#each メソッドは,公式リファレンスマニュアルの Range#each に載っています。

これ自体,若干難しいのですが,次のコード例をみてください。

rb

1(3..5).each do |i| 2 puts i 3end

これで,3, 4, 5 が順に表示されます。

始点と終点が整数であるような範囲オブジェクトで,要素を一つ一つ取り出すとは,始点の値から終点の値まで 1 ずつ増やして得た整数を順に取り出すということです。

上のコード例を理解するには,ブロックというもの(do から end まで)を理解しないといけないのですが,割愛します。

さて,to_a に戻りましょう。

このメソッドは Range クラスでは定義されておらず,Enumerable モジュールで定義されています。

Range には Enumerableinclude されているので,Enumerable のメソッドが使えるわけです。

Enumerable#to_a というメソッドは,each によって順に取り出された要素をその順に並べた配列を生成して返すメソッドです。

だから (3..5).to_a[3, 4, 5] を返します。

さて,ここまででほぼ解答が得られました。

rb

1(1..n).to_a

で 1 から n までの整数を並べた配列が得られるわけですからね。

でもまだ n が 0 以下の場合を検討しなければなりません。

実は n が 0 以下の場合,1..neach メソッドを呼び出しても,要素は一つも取り出されません。(エラーにもなりません)

このような場合,to_a は空配列([])を返します。

ということは,とくに場合分けなどする必要もなく,n が 0 以下だろうが 1 以上だろうが

rb

1(1..n).to_a

と書けば目的の配列が得られる,ということです。ラッキー!

あとはこの式をメソッド定義に利用するだけですね。

簡単なコードですが,Ruby らしさが表れている例題だと思います。

「Enumerable を制するものは Ruby を制す」くらいに大げさに考えて勉強してください!

投稿2018/02/14 15:50

scivola

総合スコア2108

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

まずRubyに入門しましょう。
入門書を一冊読めばこれくらいの問題は楽勝です。いや、この問題だけなら、一冊全部読む必要も無くて1/3くらいでしょうか。

投稿2018/02/14 11:56

編集2018/02/14 12:08
otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問