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

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

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

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

Q&A

解決済

1回答

265閲覧

コードの記述が理解できません。

learner_takashi

総合スコア21

Ruby

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

0グッド

0クリップ

投稿2019/05/07 09:50

class Library def initialize @books = [] end def <<(book) @books << book end def to_s puts "Library contents" @books.join("\n") end end class Book attr_accessor :tiltle, :author def initialize(arg) @title = arg[:title] @author = arg[:author] arg[:library] << self end def to_s "Title: " + @title + ", Author" + @author end end my_library = Library.new Book.new(:author => "Herman Melville", :title => "Moby-Dick", :library => my_library) Book.new(:author => "Hans Christian Andersen", :title => "The Ugly Duckling", :library => my_library) puts my_library #=>Library contents: #=>Title: Moby-Dick, Author: Herman Melville #=>Title: The Ugly Duckling, Author: Hans Christian Andersen

####コードが理解できません。
Bookクラスで作成したインスタンスをLibraryクラスの<<(class)メソッドで配列に格納していると思うのですが、この<<(book)メソッドの引数であるbookがどのような流れで引数に入っているのかがわかりません。
またBookクラスのinitializeの arg[:library] << self もどういう事なのか?この記述でどういう動きになっているのか、ざっくりとした質問で申し訳ありませんが解説をしていただきたいです。
よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

下記の説明では難しいでしょうか。

  1. arg[:library] << selfにより、my_library<<メソッドが呼ばれる。引数は自分自身(Bookクラスのインスタンス)
  2. @books << bookにより、my_library@books配列にbookが追加される

投稿2019/05/07 10:41

iwamot

総合スコア1154

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

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

learner_takashi

2019/05/07 12:52

お返事ありがとうございます。 恐らくそのとうりなのでしょうが、私の理解力がない為にまだわかりません。 1. arg[:library] << self とはBookクラスのインスタンスの引数である、my_libraryにselfを入れるということではないのでしょうか?ここでのselfとは何を指しているのでしょうか? 2. def <<(book)とはどういうことか?Bookクラスのto_sメソッドの文字列がどの時点またはどの記述でbookに格納されたのか教えていただきたいです。 Libraryクラスのdef «(book)とはどういうことか?Bookクラスのto_sメソッドの文字列がどの時点またはどの記述でbookに格納されたのか教えていただきたいです。 3.そもそも何故Libraryのインスタンスを出力しただけなのにLibraryクラスのto_sメソッドが呼び出されるのでしょうか?本来ならputs my_library.to_sとしなければいけないと思うのですが理解不足の為わかりません。 よろしくお願いいたします。
iwamot

2019/05/07 13:05

1. 「my_libraryにselfを入れる」ではなく「my_libraryの "<<" メソッドを呼ぶ」です。「arg[:library].<<(self)」と同じ意味で、ドットやカッコが省略されています。self はBookクラスのインスタンス自身です 2-1. "<<" メソッドの定義です 2-2. Bookクラスのto_sメソッドの文字列が「@title」や「@author」のことを指すのであれば、Book.newの際に呼ばれるinitializeメソッドで代入されています 3. putsメソッドがmy_libraryのto_sメソッドを暗黙的に呼び出しています
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問