人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

rubyを最近勉強し始めた者です。
メール送信のサンプルプログラムをみたのですが
doブロックの中はこれはメンバ変数の初期化なのですか?
ハッシュの=>みたいなのは要らないんですか?

mail = Mail.new do
from 'from@aaa.aaa'
to 'to@bbb.bbb'
subject 'TEST MAIL'
body 'Hello'
end

よろしくお願いします。

●質問者: 匿名質問者
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

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の機能を使って実装されています。


匿名質問者さんのコメント
大変詳しく教えて頂きありがとうございました。

2 ● 匿名回答2号

Mailというクラスでは
newという関数が定義されています。

(普通はnewで呼び出すとinitializeが呼ばれるのですが
上書きされているようです。)

このnew関数はブロックを受け取るようになっています。
ブロックというのは「{」から「}」までの行の塊です。

そして受け取ったブロックを直接実行するという事をしています。

さらに、fromやtoという関数が内部で定義されているため、
ブロックを直接実行すると、
from('from@aaa.aaa')という関数が実行され、
その中で、変数に保存するようになっているようです。
(rubyでは関数の引数のカッコは省略できます。)

多分こんな動きのように読めました。いろんなテクニックが使われているので
少しずつ解き明かしていくのがいいと思います。
ブロックとかよくわからないですしね。


匿名質問者さんのコメント
回答ありがとうございました。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ