前提・実現したいこと
とあるサイトでRubyを学習しています。
問題が解けず、回答をみたのですが、理解できない箇所がありました。
どうしてそうなるのか、教えていただきたいです。
回答にあったコードは以下です。
class Library def initialize @books = [] end def <<(book) @books << book end def to_s @books.join("\n") end end class Book attr_accessor :author, :title def initialize(args) @author = args[:author] @title = args[:title] args[: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
理解できないのソースコード1
以下のコードが何をしているのかわかりません。これはLibraryクラスのインスタンスメソッドを定義しているのでしょうか?それともLibraryクラスのクラスメソッドでしょうか?
Ruby
1 def <<(book) 2 @books << book 3 end
理解できないのソースコード2
以下の:libraryキーにLibrary.newのオブジェクトを紐づけていますが(正しい表現が分かりませんでした)、
Ruby
1Book.new(:author => "Herman Melville", :title => "Moby-Dick", :library => my_library)
とした後に、
Ruby
1args[:library] << self 2=> "{:author=>\"Herman Melville\", :title=>\"Moby-Dick\", :library=>#<Library:0x00007ff419820108 @books=[#<Book:0x00007ff41503bdd8 @author=\"Herman Melville\", @title=\"Moby-Dick\">]>}"
とすることで、
Ruby
1 def <<(book) 2 @books << book 3 end
が動きます。
自分の考えでは、:libraryにはLibrary.newを紐づけているのでLibraryクラスのinitializeが動くものと思ってました。
しかし、結果は上記のメソッド?がBookクラスで呼び出されています。
この1連のフローが理解できませんでした、教えていただければ思います。
また、このプログラムの結果が
Ruby
1Library contents: 2Title: Moby-Dick, Author: Herman Melville 3Title: The Ugly Duckling, Author: Hans Christian Andersen
となっています。
Libraryクラス、Bookクラスでto_sメソッドをオーバーライドしており、その処理内容がputsによって表示されている(putsの内部でto_sを呼び出しているからだと考えています)のですが、Libraryクラスのto_sがBookクラスのto_sで上書きされていないのは何故でしょうか?
コードの引用が不足しているため、意味不明の質問が多いです。
虚心に質問文を読み返してみて、必要十分な引用を行いましょう。なお、法律上、引用には引用元の明示が必要です。現時点では著作権侵害になっていると思われます。