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

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

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

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

Q&A

2回答

696閲覧

とあるサイトでRubyを学習しています。 問題が解けず、回答をみたのですが、理解できない箇所がありました。教えていただきたいです。

bonbonbonx316

総合スコア0

Ruby

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

0グッド

0クリップ

投稿2021/07/17 13:18

前提・実現したいこと

とあるサイトで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で上書きされていないのは何故でしょうか?

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

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

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

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

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

otn

2021/07/17 14:09 編集

コードの引用が不足しているため、意味不明の質問が多いです。 虚心に質問文を読み返してみて、必要十分な引用を行いましょう。なお、法律上、引用には引用元の明示が必要です。現時点では著作権侵害になっていると思われます。
guest

回答2

0

理解できないのソースコード2

args[:library] は 既に Library.new された my_library が代入されています。Libraryクラスのinitialize が済んだ インスタンスが代入されています、ですから args[:library] << selfmy_library << self と言うことです。
def <<(book) は libraryインスタンスに本を追加登録する ということです。公開methodですから、誰がいつでもどこからでも追加することができます。
Book.new(でやるのが最適かどうかちょっと引っかかりますが)したときにそれをbook自身が行っている、ということです。

Libraryクラスのto_sがBookクラスのto_sで上書きされていない

それらはクラスのインスタンスメソッドですから、クラス毎に独立です。

投稿2021/07/17 21:34

winterboum

総合スコア23567

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

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

0

理解できないのソースコード1

これは、<<という名前のインスタンスメソッドの定義です。

:libraryにはLibrary.newを紐づけているので

どういう意味でしょうか?

投稿2021/07/17 13:33

maisumakun

総合スコア146018

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問