
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> ここもよくわからない。なぜ急に変数にも代入しない 文字列を書いたのか?
以上が私の現在の認識と疑問点です。
疑問点はもちろん、認識している点も誤って認識している点があればご指摘いただけると幸いです。
No.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')
↑この書き方だと、第二引数以降がメソッド名から離れすぎてしまう。
お返事おそくなってすいません。
丁寧な回答ありがとうございます。たしかに入門サイトを勉強してらたいていのことはかいていました><。
また、ヒアドキュメントの部分は使い道がよくわかっていなかったので、とても参考になりました。ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CSSのhtmlへの紐付けについ...
-
(再質問)エクセルのマクロボ...
-
ビーリアルのユーザー名を変え...
-
1、Rstudioで回帰直線を求める...
-
パソコンのスクリーンセーバー...
-
Ruby on railsをrails sで立ち...
-
Accessで文字列のバイト数読み込み
-
Ruby require ライブラリー
-
VBScriptでExcel(2019)上のデー...
-
ruby OpenURI::Meta
-
ruby while式
-
ruby loopメソッド 変数(再喝)
-
ruby 配列
-
ruby loopメソッド 変数
-
ruby クラス・オブジェクト・イ...
-
ルビー言語 ライブラリー 追記
-
ruby raise句
-
ruby begin句
-
ruby ensure句
-
ルビー言語 ライブラリー(再々...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
get() と find() の違いについて
-
エラー「メソッドまたはデータ...
-
教えてください。vb5.0
-
エクセルVBA オートフィルタで...
-
実行時エラー450:引数の数が一...
-
VBAで型が一致しないエラー(バ...
-
Csvファイルの最終行を取得する...
-
Ruby on Rails 「attr_accessor...
-
A1の値をファイル名に指定した...
-
Pythonで複数のメソッドをまと...
-
app kitを使ってのプログラミン...
-
メソッド定義の構文のdefって
-
モジュールのメリット、デメリ...
-
名前空間
-
COMコンポーネントの構造の本質...
-
C# MakeTransparent関数について
-
「arg」は何の略?
-
クラス名やモジュール名の競合...
-
HSTLやSSTL等のI/Oピン
-
What class are you in? には何...
おすすめ情報