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

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

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

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

Q&A

解決済

2回答

1757閲覧

インスタンス変数の値の取得に関して

cheeeeeeese

総合スコア179

Ruby

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

0グッド

0クリップ

投稿2015/08/22 18:07

質問がございます。

下記コードにて、インスタンスmy_carに対して、name.colorメソッドを与えてその結果を出力しようとしました。

結果

initialize.rb::in `<main>': undefined method `color' for "プリウス":String (NoMethodError)

となってしまい、どうしてインスタンスmy_carに対して"二つのインスタンスメソッドが使えないのか"と疑問を持ったため質問いたします。

よろしくお願い申し上げます。

class Car def initialize(name, color) @name = name @color = color end def name @name end def color @color end end my_car = Car.new("プリウス", "白") puts my_car.name.color

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

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

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

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

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

guest

回答2

0

質問文のなかで定義されているメソッドは String をかえしています。
my_car.name の結果は String であり、 Car の color0 を呼び出すことはできません。

Car を返すメソッドを定義すれば、その呼び出し結果に対して、Car のメソッドを呼ぶことが可能になります。

↓に示すコードでは, oldModel() として Car を返すメソッドを追加しています。
colorMolde.color や、oldModel.oldModel のようにメソッドをつなげて呼ぶことができます。

ruby

1# coding: utf-8 2class Car 3 attr_reader :name, :color 4 def initialize(name, color) 5 @name = name 6 @color = color 7 end 8 9 def to_s 10 "#{@name} (#{@color})" 11 end 12 13 def oldModel 14 Car.new('前年のモデルの' + @name, @color) 15 end 16end 17 18my_car = Car.new('プリウス', '白') 19 20puts my_car.name # => 'プリウス' 21puts my_car.color # => '白' 22 23puts my_car.color.length # => 1 24 25puts my_car.oldModel.color # => 白 26puts my_car.oldModel.oldModel.color # => 白 27 28puts my_car # => プリウス (白) 29puts my_car.oldModel # => 前年のモデルのプリウス (白) 30puts my_car.oldModel.oldModel # => 前年のモデルの前年のモデルのプリウス (白)

投稿2015/08/22 23:13

katoy

総合スコア22324

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

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

0

ベストアンサー

こんにちは。

ruby

1puts my_car.name.color

で表示させようとしている

my_car.name.color

my_car のインスタンスメソッド nameを実行した結果に対して、colorメソッドを実行した結果

を表すコードになっており、my_car のインスタンスメソッド nameの実行結果は、
"プリウス"という文字列なので、"プリウス"という文字列に colorメソッドを実行
しようとして、質問にあるように

"プリウス"という文字列には color というメソッドはありません。

というエラーメッセージが表示されます。

my_carに対して"二つのインスタンスメソッドが使えないのか"

ということを確認するには、nameとcolorをそれぞれ別個に
my_carに対して指定して、以下のようなコードになります。

ruby

1class Car 2 3# 質問のコードと同じ 4 5end 6 7my_car = Car.new("プリウス", "白") 8 9puts my_car.name 10puts my_car.color

上記を実行すると

プリウス

と出力されます。

上記の回答で、疑問は解決されましたでしょうか?

お役に立てば幸いです。

投稿2015/08/22 20:00

jun68ykt

総合スコア9058

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

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

cheeeeeeese

2015/08/22 20:40 編集

ご回答ありがとうございます。 インスタンスmy_carに対してCarクラスのメソッドを複合して扱えるのか??という疑問が生じたため、上記の"my_car.name.color"を試したところできなかったため質問させていただきました。 今回はありがとうございます。 下記のような手段で個別にメソッドを定義して、表示させる方法以外には、一つのインスタンスに対して複数メソッドを定義することは、仕様上できないのでしょうか。 合わせてお答え頂ければと思います。 ``` class Car def initialize(name, color) @name = name @color = color end def name @name end def color @color end end my_car = Car.new("プリウス", "白") puts my_car.name.color puts my_car.color ```
jun68ykt

2015/08/22 21:02 編集

>インスタンスmy_carに対してCarクラスのメソッドを複合して扱えるのか?? とのことですが、 >メソッドを複合して扱える とは、どういうことが出来たらいいなと思っているのかの意図が 判然としませんので、以下、回答になっているかわかりませんが Carクラスに「1回のメソッド呼び出しで、nameとcolorの両方を取得する インスタンスメソッド」を追加したいのであれば、以下のメソッドの 追加ではダメでしょか? def name_and_color [@name, @color] end もし上記で回答になっていないとお感じであれば、 >インスタンスmy_carに対してCarクラスのメソッドを複合して扱えるのか?? の「メソッドを複合して扱える」の意図をもう少し分かりやすい言葉にして、 再度新たなご質問として投稿されたほうがよいかと思います。
cheeeeeeese

2015/08/22 23:26

ありがとうございます。 メソッドの"複合"に関する点ですが、1回のメソッド呼び出しで、nameとcolorの両方を取得するインスタンスメソッドを生成したいというのがわたしの意図でした。 今回はありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問