演習内容
ミニツクの「Ruby演習コース」演習3
URL: http://www.minituku.net/courses/500228005/contents/820836204.html
解答と実行例
上記サイトより引用。モジュールの解答と問題文で提示されたclassなどは同じファイルにまとめる想定です。
##### 本問題では以下モジュールの中身を考える。 #####
module Mail
attr_reader :sender, :recipient, :text, :date ### 要点1 ###
def send
puts "#{@date = Time.now}: Sending a #{self.class} to #{self.recipient}." ### 要点2、4 ###
end
def write(text)
@text = text
end
def to_s ### 要点3 ###
"#{self.class} of #{@date}:\n\nDear #{@recipient},\n\n#{@text}\n\nSincerely,\n#{@sender}" ### 要点2 ###
end
end
##### 以下、問題文で提示されている。 #####
class Postcard
include Mail
def initialize(sender, recipient)
@sender, @recipient = sender, recipient
end
end
card = Postcard.new("Me", "Friend")
card.write("Did you forget my birthsday?")
card.send
puts "-" * 60
sleep(2)
puts card
出力例
Tue Mar 22 11:59:16 +0900 2011: Sending a Postcard to Friend.
------------------------------------------------------------
Postcard of Tue Mar 22 11:59:16 +0900 2011:
Dear Friend,
Did you forget my birthsday?
Sincerely,
Me
学んだことなど
解釈間違っていたらお教えください
要点1「attr_readerは不要?」
要点1の行を消しても動きました。
そもそもattr_readerとはインスタンス変数のゲッターを実現するものです。
参考:https://pikawaka.com/ruby/attr_reader
ただ演習3のコードでは、外部からインスタンス変数を呼び出したりしていないので、特になくても良いのかなと感じました。
要点2「ダックタイピング」
要点2はダックタイピングを使ってるようです。
モジュールの中にself.classやself.recipientなどはありませんが、「呼び出し元のPostcardクラスにはきっとあるだろう(言ってしまえば、self.classやself.recipientをもつクラスなら何でもよい)」と期待する書き方をしています。
ダックタイピングについては以下が非常に分かりやすかったです。
https://qiita.com/shimgo/items/9d9fbab1e3a7c4343f7b
要点3「Object#to_s」
各オブジェクトにはto_sメソッドがデフォルトで定義されており、それを再定義しているそう。
オブジェクトを文字列変換しています。puts card.to_sじゃなくputs cardで文字列を表示できるので少し違和感を感じます。
参考:https://qiita.com/tbpgr/items/19b42765a7b9cb292f44
要点4「puts内の式の展開」
・puts "#{@date = Time.now}~ とあるのですが、そういう書き方もあるんだな~といった感じでした。putsの上で @date = Time.now を書くとかさばるからまとめているんでしょうか。