1からnまで数値を要素に持つ配列を返す create_array メソッドを実装
<実装内容>
create_arrayメソッドは引数に与えられた数nまで(nを含む)の数値を要素に持つ配列を返すメソッドです
nが0以下の場合はからの配列を返してください.
要素は1からnまで(nを含む)小さい順に並べてください.
この問題がわからないです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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
というモジュールは,何らかの意味で〈要素を一つ一つ取り出すことができる〉ようなクラスに対し,さまざまな機能を持ち込むためのものです。
Enumerable
の include
先であるクラスには,要素を一つ一つ取り出すための 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
には Enumerable
が include
されているので,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..n
の each
メソッドを呼び出しても,要素は一つも取り出されません。(エラーにもなりません)
このような場合,to_a
は空配列([]
)を返します。
ということは,とくに場合分けなどする必要もなく,n が 0 以下だろうが 1 以上だろうが
rb
1(1..n).to_a
と書けば目的の配列が得られる,ということです。ラッキー!
あとはこの式をメソッド定義に利用するだけですね。
簡単なコードですが,Ruby らしさが表れている例題だと思います。
「Enumerable を制するものは Ruby を制す」くらいに大げさに考えて勉強してください!
投稿2018/02/14 15:50
総合スコア2108
0
まずRubyに入門しましょう。
入門書を一冊読めばこれくらいの問題は楽勝です。いや、この問題だけなら、一冊全部読む必要も無くて1/3くらいでしょうか。
投稿2018/02/14 11:56
編集2018/02/14 12:08総合スコア84423
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。