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

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

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

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

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

932閲覧

Rubyの引数(配列)の受け渡しについて

soheil

総合スコア12

Ruby

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

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/10/20 08:47

編集2020/10/20 08:48

現在CODEPREPというサイトでRubyの学習を行なっています。
(現在のブック:Ruby演習 配列・Hash・Class編)
現在の課題で書いたプログラムが以下のようになっていますがどこを直せば良いのかわかりません。
アドバイスをください。

演習内容
クラスを継承する
Arrayクラスを継承したMyArrayクラスを実装しましょう。
MyArrayクラスにはインスタンスメソッドmultiplyを実装しましょう。
-----実装内容-----
Arrayを継承したMyArrayを実装する
MyArrayにインスタンスメソッドmultiplyを実装する。
multiplyメソッドは引数に整数nをとり、MyArrayの全ての要素をn倍して返すメソッドです。

Ruby

1class Array 2end 3class MyArray < Array 4 def initialize(array) 5 @ary=array 6 end 7 def multiply(n) 8 s=@ary.map{|i|i*n} 9 return s 10 end 11 attr_accessor :ary 12end

実行例は以下のようになるそうです。

Ruby

1my_array = MyArray[1, 2, 3, 4] 2p my_array.class.superclass 3# => "Array" 4 5p my_array.multiply(5) 6# => [5, 10, 15, 20]

おそらく最初の@aryに配列を入れられない状態だと認識している?のですが
修正方法がわかりません。どなたかアドバイスをください、よろしくお願いします。

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

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

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

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

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

maisumakun

2020/10/20 08:57

現在のコードでは、どのようになるのですか?
soheil

2020/10/20 09:00 編集

実行例のコードを入力すると以下のようになります。 Array /root/codecheck/main.rb:8:in `multiply': undefined method `map' for nil:NilClass (NoMethodError) from /root/codecheck/main.rb:16:in `<top (required)>' from /usr/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require' from /usr/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require' from test.rb:1:in `<main>'
guest

回答1

0

ベストアンサー

おそらく最初の@aryに配列を入れられない状態だと認識している?のですが

別に@aryを作るのは適当ではありません。自分自身の持っているmapそのまま呼べばいいだけです。

ruby

1class MyArray < Array 2 def multiply(n) 3 map{|i|i*n} 4 end 5end

投稿2020/10/20 09:01

maisumakun

総合スコア146018

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

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

soheil

2020/10/20 09:11 編集

ありがとうございます!!上記の記述だけで無事動作しました! しかし、このプログラムの場合、インスタンス変数は必要ない(むしろ書かないほうが良い)のでしょうか? 書いた場合でも動作する方法はあるのでしょうか。(学習中にインスタンス変数を作成するところがあり、その流れから描くべきものなのかと思っていました)
maisumakun

2020/10/20 09:10

> インスタンス変数は必要ない(むしろ書かないほうが良い)のでしょうか? 書いてはいけません。本来の配列と別にデータを持つことになってしまい、Arrayを継承した意味の大半が失われます。
soheil

2020/10/20 09:13

なるほど、ありがとうございます!ちなみに書いたほうが良いケースはあるのですか?今の所どのような場合に書くべきなのかいまいち理解できていません。
maisumakun

2020/10/20 09:15

そもそも論として、「標準で存在するクラス」を継承すること自体が実用上はレアケース(多くの場合は、別な手段を取るのが適切)なので、あまり気にしなくて構いません。
soheil

2020/10/20 09:17

そうなんですね、わかりました。ご回答ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問