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

Rubyの下記のソースの意図がわかりません。

(class<<self;self;end).module_eval do
define_method(:usage) do |msg|
puts op.to_s
puts "error: #{msg}" if msg
exit 1
end
end

引用元:
https://github.com/fluent/fluentd/blob/master/lib/fluent/command/cat.rb

グローバルに使える関数usageを定義しているのかなぁと推測していますが、
何故定義できるのかよく理解できていません。

質問は、
1. (class<<self;self;end).module_evalは何をしているのでしょうか
2. トップレベルにメソッド定義を記述するのと何が違うのでしょうか

教えて頂けないでしょうか。

●質問者: heboprog
●カテゴリ:コンピュータ
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● nuna
●100ポイント ベストアンサー

>1. (class<<self;self;end).module_evalは何をしているのでしょうか

このコードはトップレベルで実行されていますので、selfはmainオブジェクトです。
よって (class<<self;self;end) で main オブジェクトの特異クラスを得ています。

mainはObjectクラスのインスタンスですので、ほかのオブジェクトに影響を与えず、
mainにメソッド定義をするためにこうしているのでしょう。

>2. トップレベルにメソッド定義を記述するのと何が違うのでしょうか

ローカル変数 op を参照するためにdefine_methodを使っているのだと思います。
個人的にはやりたい事に対して手段が過剰な気がしますが……

def でメソッド定義をすると、メソッド内から外側のローカル変数は参照できません。
一方ブロックはそれが可能です。


heboprogさんのコメント
ありがとうございます。とても納得しました。
関連質問

●質問をもっと探す●



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