3

rubyのrequireメソッドは lib_path を検索し、必要に応じて見つかった最初の一致ファイルをロードします。ロードされるファイルへのパスを印刷する方法はありますか。私は、理想的には組み込みの、whichbash のコマンドに似た機能を探しており、それも簡単になることを望んでいます。ありがとう。

4

2 に答える 2

3

組み込みの機能はわかりませんが、独自の機能を定義するのは難しくありません。これがこの質問から適応された解決策です:

def which(string)
  $:.each do |p|
    if File.exist? File.join(p, string)
      puts File.join(p, string)
      break
    end
  end
end

which 'nokogiri'
#=> /opt/local/lib/ruby1.9/gems/1.9.1/gems/nokogiri-1.4.1/lib/nokogiri

説明:$:は事前定義された変数です。これは、ファイルを検索できる場所の配列loadですrequire。このwhichメソッドは、各パスを繰り返して、呼び出したファイルを探します。一致するものが見つかると、ファイルパスを返します。

requiredのように、出力をファイルの完全なファイルパスを示す1行にするだけでよいと想定していますwhich。ファイルがそれ自体をロードするファイルも確認したい場合requiredは、リンクされた質問の解決策のようなものがより適切かもしれません。

module Kernel
  def require_and_print(string)
    $:.each do |p|
      if File.exist? File.join(p, string)
        puts File.join(p, string)
        break
      end
    end
    require_original(string)
  end

  alias_method :require_original, :require
  alias_method :require, :require_and_print

end

require 'nokogiri'
#=>  /opt/local/lib/ruby1.9/gems/1.9.1/gems/nokogiri-1.4.1/lib/nokogiri
#    /opt/local/lib/ruby1.9/gems/1.9.1/gems/rubygems-update-1.3.5/lib/rbconfig
#    /opt/local/lib/ruby1.9/gems/1.9.1/gems/nokogiri-1.4.1/lib/nokogiri/xml
#    /opt/local/lib/ruby1.9/gems/1.9.1/gems/nokogiri-1.4.1/lib/nokogiri/xml/pp
#    /opt/local/lib/ruby1.9/gems/1.9.1/gems/nokogiri-1.4.1/lib/nokogiri/xml/sax
#    /opt/local/lib/ruby1.9/gems/1.9.1/gems/nokogiri-1.4.1/lib/nokogiri/xml/node
#    /opt/local/lib/ruby1.9/gems/1.9.1/gems/nokogiri-1.4.1/lib/nokogiri/xml/xpath
#    /opt/local/lib/ruby1.9/gems/1.9.1/gems/nokogiri-1.4.1/lib/nokogiri/xslt
#    /opt/local/lib/ruby1.9/gems/1.9.1/gems/nokogiri-1.4.1/lib/nokogiri/html
#    /opt/local/lib/ruby1.9/gems/1.9.1/gems/nokogiri-1.4.1/lib/nokogiri/css
#    /opt/local/lib/ruby1.9/1.9.1/racc/parser.rb  
于 2010-07-31T22:36:58.590 に答える
1

$ gem which filename # (no .rb suffix) は私が使用するものです...

于 2010-08-01T02:24:12.100 に答える