重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

Ruby初心者(オブジェクト指向はわかります)なのですが、メソッドについてわからないことがあって質問させていただきました。

Net::SMTP.start('smtp.example.com', 25) {|smtp|
smtp.send_message(<<-EndOfMail, 'from@example.com', 'to@example.net')
From: Your Name <from@example.com>
To: Dest Address <to@example.net>
Subject: test mail
Date: Sat, 23 Jun 2001 16:26:43 +0900
Message-Id: <unique.message.id.string@yourhost.example.com>

This is a test mail.
EndOfMail
}

このプログラムの意味を理解しようとしているのですが、どうもわかりません。
私の現在の認識を説明させていただくと、
1)NetクラスのインナークラスであるSMTPクラスのstartメソッドを呼び出している。
2)('smtp.example.com', 25)これはstartメソッドの引数である。
3)|smtp|よくわからない。このstartメソッドの戻り値?startメソッドの中なのに?
4)From: Your Name <from@example.com> ここもよくわからない。なぜ急に変数にも代入しない 文字列を書いたのか?

以上が私の現在の認識と疑問点です。

疑問点はもちろん、認識している点も誤って認識している点があればご指摘いただけると幸いです。

A 回答 (1件)

初心者というか、入門されてないようなので、書籍かサイトで、Rubyの文法を学ばれた方が良いかと思います。

Rubyの文法はルールが少なくて非常にシンプルです。
以下の説明は他の言語経験者のための説明でRuby的な厳密さは一部無視しています。

>1)NetクラスのインナークラスであるSMTPクラスのstartメソッドを呼び出している。

Rubyにはインナークラスという概念はありません。Netはモジュールで、他の言語で言うとパッケージに近いです(同じでは無いですが)。

>2)('smtp.example.com', 25)これはstartメソッドの引数である。

これはそう。

>3)|smtp|よくわからない。このstartメソッドの戻り値?startメソッドの中なのに?

startメソッドの引数はもう一つあって、 {|smtp| から 最後の } までが無名メソッド(ブロック)で、この無名メソッドを引数に渡して、startから呼び返して(コールバック)もらいます。

Rubyのメソッド呼び出しは、「ブロック付きメソッド呼び出し」という構文があって、あたかも言語構文のような形で最大一つの無名メソッドを呼び出し先メソッドに渡すことが出来ます。
簡単な例では、
(1..10).each { |i| puts i }
は、def foo(i); puts i; end というようなメソッドをeachにコールバック用として渡しています。

ということで|smtp|は、コールバックメソッドの引数です。
startメソッドはTCPコネクションを張って、そのコネクションを含んだSMTPクラスのオブジェクトを引数としてコールバックを呼び出します。

>4)From: Your Name <from@example.com> ここもよくわからない。なぜ急に変数にも代入しない 文字列を書いたのか?

これは、sh(Unixのシェル) 由来のヒアドキュメントという構文です。<<-EndOfMail がヒアドキュメントの開始。
複数行の文字列リテラルを書くときによく使われます。
<<-EndOfMail の部分が、次の行から EndOfMailの行の前までの文字列リテラルと置き換わります。
つまり、下記と同じ。

smtp.send_message(
"From: Your Name <from@example.com>
To: Dest Address <to@example.net>
Subject: test mail
Date: Sat, 23 Jun 2001 16:26:43 +0900
Message-Id: <unique.message.id.string@yourhost.example.com>

This is a test mail.
", 'from@example.com', 'to@example.net')

↑この書き方だと、第二引数以降がメソッド名から離れすぎてしまう。
    • good
    • 0
この回答へのお礼

お返事おそくなってすいません。

丁寧な回答ありがとうございます。たしかに入門サイトを勉強してらたいていのことはかいていました><。

また、ヒアドキュメントの部分は使い道がよくわかっていなかったので、とても参考になりました。ありがとうございます。

お礼日時:2011/10/30 01:46

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!