Что эквивалентно __file__ в python в ruby?

1

В python после импорта можно увидеть файл, который был загружен/откуда приходит модуль.

>>> import os
>>> os.__file__
'/Users/tm/lib/python2.6/os.pyc'

Что было бы эквивалентно рубину?

>> require 'xmlrpc/client'
=> true
>> ...
Теги:
module
path

3 ответа

1
Лучший ответ

Нет ничего эквивалентного.

Все файлы, которые были required, перечислены в $LOADED_FEATURES в порядке их require d. Итак, если вы хотите узнать, откуда появился файл сразу после того, как он был require d, вам просто нужно посмотреть на конец:

$LOADED_FEATURES.last if require 'yaml'
# => 'C:/Program Files/Ruby/lib/ruby/1.9.1/yaml.rb'

Однако, если вы не запишете каждый вызов require, будет сложно определить, какая запись соответствует какому вызову. Кроме того, если файл уже находится в $LOADED_FEATURES, он не будет загружен снова:

require 'yaml'
# => true
# true means: the file was loaded

$LOADED_FEATURES.last
# => 'C:/Program Files/Ruby/lib/ruby/1.9.1/yaml.rb'

require 'json'
$LOADED_FEATURES.last
# => 'C:/Program Files/Ruby/lib/ruby/1.9.1/json.rb'

require 'yaml'
# => false
# false means: the file wasn't loaded again, because it has already been loaded

$LOADED_FEATURES.last
# => 'C:/Program Files/Ruby/lib/ruby/1.9.1/json.rb'
# Last loaded feature is still JSON, because YAML wasn't actually loaded twice

Кроме того, многие библиотеки не содержатся в одном файле. Таким образом, файлы require d могут содержать вызовы require. В моем случае, например, require 'yaml' не только загружает yaml.rb, но и целую кучу файлов (точнее, 15):

  • C:/Program Files/Ruby/lib/ruby/1.9.1/i386-mingw32/stringio.so
  • C:/Program Files/Ruby/lib/ruby/1.9.1/i386-mingw32/syck.so
  • C:/Program Files/Ruby/lib/ruby/1.9.1/syck/error.rb
  • C:/Program Files/Ruby/lib/ruby/1.9.1/syck/basenode.rb
  • C:/Program Files/Ruby/lib/ruby/1.9.1/syck/syck.rb
  • C:/Program Files/Ruby/lib/ruby/1.9.1/syck/tag.rb
  • C:/Program Files/Ruby/lib/ruby/1.9.1/syck/stream.rb
  • C:/Program Files/Ruby/lib/ruby/1.9.1/syck/constants.rb
  • C:/Program Files/Ruby/lib/ruby/1.9.1/date/format.rb
  • C:/Program Files/Ruby/lib/ruby/1.9.1/date.rb
  • C:/Program Files/Ruby/lib/ruby/1.9.1/syck/rubytypes.rb
  • C:/Program Files/Ruby/lib/ruby/1.9.1/syck/types.rb
  • C:/Program Files/Ruby/lib/ruby/1.9.1/yaml/syck.rb
  • C:/Program Files/Ruby/lib/ruby/1.9.1/syck.rb
  • C:/Program Files/Ruby/lib/ruby/1.9.1/yaml.rb
1

Предполагая, что вы используете rubygems, вы можете узнать, какой файл он загружает, используя Gem.find_files(file).

например:.

>> puts Gem.find_files('active_record')
/Library/Ruby/Gems/1.8/gems/activerecord-3.0.0.beta2/lib/active_record.rb
/Library/Ruby/Gems/1.8/gems/activerecord-2.3.8/lib/active_record.rb
/Library/Ruby/Gems/1.8/gems/activerecord-2.3.5/lib/active_record.rb
/Library/Ruby/Gems/1.8/gems/activerecord-2.3.4/lib/active_record.rb
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record.rb
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.6/lib/active_record.rb

Первым элементом массива будет файл, загружаемый require 'active_record'.

Другой способ узнать, какой файл загружен require, - это вызвать $ gem which foo из командной строки.

1

Нет ничего такого точного совпадения. Легко найти его сами:

# Find where a path `p` was loaded from.
def locate(p)
  # Find the first path in your load-paths that contains a file matching `p`.
  $:.find { |l|
    File.exists?(File.join(l, p))
  }
end

ruby-1.9.1-p378 > locate('yaml')
 => "/home/johnf/.rvm/rubies/ruby-1.9.1-p378/lib/ruby/1.9.1" 
# --> This tells you that 'yaml.rb' was loaded from here.

ruby-1.9.1-p378 > locate('zzz')
 => nil
# --> There no matches for this library.

ruby-1.9.1-p378 > locate('haml')
 => "/home/johnf/.rvm/gems/ruby-1.9.1-p378@standard/gems/haml-3.0.12/bin" 
# --> Here a third-party library from my gems.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню