▽1
●
匿名回答1号 ベストアンサー |
ハッシュとは異なり、特にRubyにそういう機能があるというわけではありません。
気持ちとしては下記のように書くのと同じです(実際にこう書いても動くかどうかはライブラリによるので知りません)
mail = Mail.new mail.from = 'from@aaa.aaa' mail.to = 'to@bbb.bbb' mail.subject = 'TEST MAIL' mail.body = 'Hello'
ただ、mailライブラリが頑張って
mail = Mail.new do from 'from@aaa.aaa' to 'to@bbb.bbb' subject 'TEST MAIL' body 'Hello' end
という記法を受け付けるように適切なメソッドを定義しているのです。
おそらくははじめに書いたような記法よりもメールの設定部のくくりが分かりやすいし、何度も"mail."と繰り返すよりも簡潔な為でしょう。
Rubyライブラリではtk標準ライブラリを初めとして、よく見られるAPIデザインです。Martin Fowlerはこの種のデザインを内部DSLと呼んでいます
ライブラリ利用者としては「このライブラリはこういうAPIなのだ」という以上の理解をする必要は必ずしもありません。ただし、参考までに下記にRuby言語の観点からみた実装の仕組みを簡単に説明します。詳しくは『ThoughtWorksアンソロジー ―アジャイルとオブジェクト指向によるソフトウェアイノベーション』などで解説されています。
"to 'to@bbb.bbb'"というのは"to"というメソッドの呼び出しで、このメソッドが呼ばれると引数を宛先として設定するようにmailオブジェクトが定義されています。
また"mail.to"ではなく単に"to"と書けるのはObject#instance_evalの機能を使って実装されています。
Mailというクラスでは
newという関数が定義されています。
(普通はnewで呼び出すとinitializeが呼ばれるのですが
上書きされているようです。)
このnew関数はブロックを受け取るようになっています。
ブロックというのは「{」から「}」までの行の塊です。
そして受け取ったブロックを直接実行するという事をしています。
さらに、fromやtoという関数が内部で定義されているため、
ブロックを直接実行すると、
from('from@aaa.aaa')という関数が実行され、
その中で、変数に保存するようになっているようです。
(rubyでは関数の引数のカッコは省略できます。)
多分こんな動きのように読めました。いろんなテクニックが使われているので
少しずつ解き明かしていくのがいいと思います。
ブロックとかよくわからないですしね。