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

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

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

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

Q&A

解決済

1回答

373閲覧

「<<()」というメソッドがある様なのですが調べても出てきません、、、。どういう風に機能しているのでしょうか?

baa

総合スコア13

Ruby

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

0グッド

2クリップ

投稿2019/01/16 13:44

「Rubyがミニツク」という学習サイトの演習問題1の解答が下記のコードとなっているのですが、<<(book)メソッドとなっているところがわかりません。
Arrayクラスの<<メソッドが関係しているのでしょうか?
この「<<()」メソッドにより "Bookオブジェクトを作るたびにLIBRARYへの関連を作る処理" と "Libraryクラス側では、Bookオブジェクトを受け取って登録する処理" が用意されると解説に書かれているのですがよく分かりません。
<<(book)メソッドによりBookクラスとLibraryクラスが結びつくのですか?
どなた教えてください。お願いします。
サイトのURLです。
リンク内容

コード例

ruby

1class Library 2 def initialize 3 @books = [] 4 end 5 6 def <<(book) 7 @books << book 8 end 9 10 def to_s 11 puts "Library contents:" 12 @books.join("\n") 13 end 14end 15 16class Book 17 attr_accessor :author, :title 18 def initialize(args) 19 @author = args[:author] 20 @title = args[:title] 21 args[:library] << self 22 end 23 24 def to_s 25 "Title: " + @title + ", Author: " + @author 26 end 27 28my_library = Library.new 29Book.new(:author => "Herman Melville", :title => "Moby-Dick", :library => my_library) 30Book.new(:author => "Hans Christian Andersen", :title => "The Ugly Duckling", :library => my_library) 31puts my_library

出力例
Library contents:
Title: Moby-Dick, Author: Herman Melville
Title: The Ugly Duckling, Author: Hans Christian Andersen

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

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

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

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

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

guest

回答1

0

ベストアンサー

<<(book)メソッドとなっているところがわかりません。

というと、

Ruby

1 def <<(book) 2 @books << book 3 end

の部分ですか?これは<<という名前のメソッド定義です。Arrayである@booksに引数を追加していきます。

args[:library] << selfが、Bookinitializeにあるので、Bookオブジェクトを作る度にその引数で指定したライブラリーに追加することになります。

#追記
演算子メソッドの定義がわかりにくいと言うことであれば、下記でも同じです。

Ruby

1class Library 2 def initialize 3 @books = [] 4 end 5 6 def add(book) 7 @books << book 8 end 9 10 def to_s 11 puts "Library contents:" 12 @books.join("\n") 13 end 14end 15 16class Book 17 attr_accessor :author, :title 18 def initialize(args) 19 @author = args[:author] 20 @title = args[:title] 21 args[:library].add(self) 22 end 23 24 def to_s 25 "Title: " + @title + ", Author: " + @author 26 end 27end 28 29my_library = Library.new 30Book.new(:author => "Herman Melville", :title => "Moby-Dick", :library => my_library) 31Book.new(:author => "Hans Christian Andersen", :title => "The Ugly Duckling", :library => my_library) 32puts my_library

投稿2019/01/16 14:37

編集2019/01/16 14:47
otn

総合スコア84423

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

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

baa

2019/01/17 05:18

追記の内容で理解することができました!ありがとうございます! 演算子をメソッド名に定義しているのがわかりにくかったみたいです・・・。あと、引数の()も省略できるとは知りませんでした・・・。 しかし、演算子でメソッド名を定義した場合はメソッドの呼び出し時にカンマを省略することができるのですか? それとまた別の質問なんですが、to_sメソッドの呼び出しがどこにもないのにそのメソッドが実行され上記のような出力になっているのが分かりません。このことについても教えていただければ嬉しいです。 初心者なものですみません。
otn

2019/01/17 06:32

引数の括弧は、よく省略されます。puts 123 とか。 > 演算子でメソッド名を定義した場合はメソッドの呼び出し時にカンマを省略することができるのですか? ピリオドの事ですかね?foo.+(bar) は、foo + bar と書けます。他の演算子も同じ。 もちろん、foo.+(bar) と書いてもちゃんと動きます。 to_sについては、puts にArrayでもStringでもない引数を与えた場合は、自動的にその引数にto_sを適用してその結果がStringならそれが表示されます。これは、puts 固有の機能です。リファレンスにその旨書いてあります。 https://docs.ruby-lang.org/ja/2.6.0/class/Kernel.html#M_PUTS
baa

2019/01/18 01:10

すいません!ピリオドのことです! 演算子の場合はピリオドなくても呼び出せるんですね。。。初心者の僕からすればそれくらいつけてくれ!と思いますが・・・じゃないとメソッドの呼び出しなんて気がつきません! to_sについては調べているうちに同じ疑問を持った方をみつけてその内容でなんとなく分かった様な分からない様な・・・ http://ihatov08.hatenablog.com/entry/2016/06/21/115637 " 自分でto_sメソッドを定義すると、to_sメソッドの機能を上書きできてしまう "という記述が僕的にはしっくりきた感じです。 ほかにもLibraryクラスのto_sメソッドではputsがあるが、Bookクラスのto_sメソッドではputsがない(メソッド内にputsなくても出力されるんじゃね?)とか、 puts my_library によってLibraryクラスのto_sが呼び出されるのは分かるんですけど、Bookクラスのto_sはいつどこで呼び出されているのか・・・?とか、 疑問が噴出なんですけど、お時間があるなら回答して頂きたいところですが、、、また自分でいろいろ調べていきたいと思います! 分からなかったらまた別に質問をあげようと思います。 僕のようなずぶの素人にも優しい丁寧な回答ありがとうございます!!
otn

2019/01/18 01:22

> じゃないとメソッドの呼び出しなんて気がつきません! ほとんどの演算子はメソッドです。メソッドじゃない演算子もありますが(制御構造になっている物)。 > Bookクラスのto_sはいつどこで呼び出されているのか・・・?とか、 @books.join("\n") から、メソッドのリファレンスを見ていけばわかります。 Library#to_sのputsはデバッグコーディングの消し忘れですかね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問