匿名質問者

rubyを最近勉強し始めた者です。

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

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

よろしくお願いします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2014/07/27 00:33:15

ベストアンサー

匿名回答1号 No.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の機能を使って実装されています。

匿名質問者

大変詳しく教えて頂きありがとうございました。

2014/07/27 00:34:33

その他の回答1件)

匿名回答1号 No.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の機能を使って実装されています。

匿名質問者

大変詳しく教えて頂きありがとうございました。

2014/07/27 00:34:33
匿名回答2号 No.2

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

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

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

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

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

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

匿名質問者

回答ありがとうございました。

2014/07/27 00:34:49

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません