[解決済み] 実行時にメソッドが定義されている場所を見つけるには?
質問
最近、一連のコミットが行われた後、バックエンドプロセスの実行に失敗する問題が発生しました。そこで、私たちはいい子にしていて、バックエンドプロセスを実行するために
rake test
しかし、Railsのライブラリ読み込みに奇妙な点があったため、本番モードでMongrelから直接実行したときのみ、この現象が発生しました。
このバグを追跡したところ、新しいRails gemがStringクラスのメソッドを上書きしてしまい、実行時のRailsコードにある狭い範囲での使用を壊してしまったことが原因でした。
とにかく、長い話ですが、実行時に、あるメソッドがどこで定義されているかをRubyに問い合わせる方法はないでしょうか?例えば
whereami( :foo )
を返します。
/path/to/some/file.rb line #45
? この場合、Stringクラスで定義されていると言っても、それはどこかのライブラリでオーバーロードされているため、役に立たないでしょう。
ソースがプロジェクト内に存在することは保証できないので
'def foo'
があれば、必ずしも必要なものが得られるとは限りません。
多数
def foo
を使用しているため、実行時までどれを使用しているかわからないことがあります。
解決方法は?
本当に今更ですが、あるメソッドがどこで定義されているかを調べる方法を紹介します。
# How to find out where a method comes from.
# Learned this from Dave Thomas while teaching Advanced Ruby Studio
# Makes the case for separating method definitions into
# modules, especially when enhancing built-in classes.
module Perpetrator
def crime
end
end
class Fixnum
include Perpetrator
end
p 2.method(:crime) # The "2" here is an instance of Fixnum.
#<Method: Fixnum(Perpetrator)#crime>
Ruby 1.9以上なら
source_location
require 'csv'
p CSV.new('string').method(:flock)
# => #<Method: CSV#flock>
CSV.new('string').method(:flock).source_location
# => ["/path/to/ruby/1.9.2-p290/lib/ruby/1.9.1/forwardable.rb", 180]
この方法は、ネイティブコンパイルされたコードのように、すべてにおいてうまくいくわけではないことに注意してください。また メソッドクラス のような巧妙な関数もあります。 メソッド#オーナ これは、そのメソッドが定義されているファイルを返すものです。
EDIT: また
__file__
と
__line__
や、別解のREEの注意書きも便利ですよ。-- wg
関連
-
[解決済み] Rubyのswitch文の書き方
-
[解決済み] メソッドと関数の違いは何ですか?
-
[解決済み] Rubyで配列に値が存在するかどうかを確認する方法
-
[解決済み] Rubyからシェルコマンドを呼び出す方法
-
[解決済み] Rubyでnilとemptyとblankを理解する方法
-
[解決済み] Ruby on Railsで現在の絶対URLを取得するにはどうすればよいですか?
-
[解決済み] C#でメソッドをパラメータとして渡す
-
[解決済み] 変数が定義されているかどうかをチェックする?
-
[解決済み] ランタイムとコンパイルタイム
-
[解決済み】既存のオブジェクトインスタンスにメソッドを追加する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】bundle installが "Could not locate Gemfile "を返す。
-
[解決済み】Webpacker::Manifest::MissingEntryError【クローズド
-
[解決済み] デバイスを使用する現在のユーザーメソッド
-
[解決済み] RailsのRootディレクトリのパス?
-
[解決済み] 変更欄のRailsマイグレーション
-
[解決済み] rails erb フォームヘルパー options_for_select :selected
-
[解決済み] Ruby on rails アプリで ES6 (ES2015) を使用するにはどうすればよいですか?
-
[解決済み] railsでcheck_boxをcheckedにする方法は?
-
[解決済み] レイル 4 radio_button_tag default not selected
-
[解決済み] Heroku Error R14 (Memory quota exceeded): How do I solve this?