Как проверить, откуда загружается модуль или класс во время выполнения? - PullRequest
4 голосов
/ 08 ноября 2011

У меня есть старое приложение rails с множеством забавных (бесполезных) модулей и классов в глобальном пространстве имен. Я хочу знать, из каких файлов или драгоценных камней они требовались, используя rails c.

Я знаю, что он существует для методов: .source_location, __line__, __file__ и объекта вызывающей стороны, но не имеет смысла определять происхождение класса или модуля.

Есть идеи? Спасибо!

Использование:

  • Рубин 1.9.2
  • монтировка
  • Рельсы 3.1.1

Ответы [ 2 ]

1 голос
/ 09 ноября 2011

Вы не можете найти это непосредственно для классов / модулей - но если вы посмотрите на методы, определенные в классе / модуле, вы можете узнать, где они определены --- что, по доверенности, также является тем, где класс /модуль определен.

В Прай вы можете перейти:

[3] (pry) main: 0> stat Set#initialize
Method Information:
--
Name: initialize
Owner: Set
Visibility: private
Type: Unbound
Arity: -1
Method Signature: initialize(enum=?, &block)
Source Location: /Users/john/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/set.rb:67

Посмотрите на последний элемент сверху.

1 голос
/ 08 ноября 2011

больше обходного пути, чем реальное решение (вы попросили метод), но я бы посоветовал использовать ri doc . Если Rdoc / Ri Doc был сгенерирован должным образом, в документе указывается исходный камень.

для перечисления всех классов, известных ri:

ri -l

чтобы получить документацию для определенного класса или модуля:

ri ClassName

чтобы получить информацию о методе:

ri ClassName#instance_method_name
ri ClassName#class_method_name

Если хотите, есть гем под названием ri_for , который позволяет вам проверять документ ri во время выполнения, который поможет вам в консоли. Пример вывода в сеансе irb:

>> require 'ri_for'
=> true
>> String.desc_class
begin RI
String < Object

------------------------------------------------------------------------------
Includes:
Diff::LCS (from gem diff-lcs-1.1.3)

(from gem diff-lcs-1.1.3)
------------------------------------------------------------------------------
Includes Diff::LCS into String.

------------------------------------------------------------------------------
(from gem rake-0.8.7)
------------------------------------------------------------------------------


User defined methods to be added to String.

------------------------------------------------------------------------------
Instance methods:

ext
pathmap
pathmap_explode
pathmap_partial
pathmap_replace

(from gem treetop-1.4.10)
------------------------------------------------------------------------------
Instance methods:

blank?
column_of
indent
line_of
tabto
treetop_camelize

end ri
String
non inherited methods:
%, *, +, <<, <=>, ==, ===, =~, [], []=, ascii_only?, blank?, bytes, bytesize, capitalize,    capitalize!, casecmp, center, chars, chomp, chomp!, chop, chop!, chr, clear, codepoints, column_of, concat, count, crypt, delete, delete!, downcase, downcase!, dump, each_byte, each_char, each_codepoint, each_line, empty?, encode, encode!, encoding, end_with?, eql?, force_encoding, getbyte, gsub, gsub!, hash, hex, include?, indent, index, insert, inspect, intern, length, line_of, lines, ljust, lstrip, lstrip!, match, next, next!, oct, ord, partition, replace, reverse, reverse!, rindex, rjust, rpartition, rstrip, rstrip!, scan, setbyte, size, slice, slice!, split, squeeze, squeeze!, start_with?, strip, strip!, sub, sub!, succ, succ!, sum, swapcase, swapcase!, tabto, to_c, to_f, to_i, to_r, to_s, to_str, to_sym, tr, tr!, tr_s, tr_s!, treetop_camelize, unpack, upcase, upcase!, upto, valid_encoding?
non inherited class methods:
try_convert
=> nil
...