Как найти константу в Ruby?

Используя pry, очень просто найти, где определен метод, и посмотреть источник с помощью команды edit-method. Однако для самого класса нет соответствия. Когда этот класс не имеет определенных методов, трудно найти источник через pry.

Классы - это константы, поэтому они эквивалентны запросу, где найти источник, в котором определена определенная константа Ruby. Большое вам спасибо.

Ответ 1

Используйте ack, иногда, если я достигаю пределов Pry (и Ruby), я прибегаю к его использованию. Самое замечательное в том, что вы можете вызывать его изнутри самого Pry, используя свои функции интеграции с оболочкой, обычно просто набрав .ack ClassName делает трюк, однако для этого требуется, чтобы класс был определен в файле в текущем каталоге.

В случае, если класс не определен в текущем каталоге, вы всегда можете прибегнуть к поиску одного из его методов, взять исходное местоположение оттуда, а затем использовать Pry cat, чтобы отобразить его (с подсветкой синтаксиса) или Pry edit для прямого перехода к его определению.

Случай, когда класс НЕ имеет определенных методов экземпляров, довольно редок - и такой класс обычно неинтересен:)

ИЗМЕНИТЬ

Самая последняя версия Pry (0.9.9) теперь может показать источник для модулей/классов, используя обычную команду show-source. Это требует, чтобы модуль/класс имел хотя бы один определенный метод, однако

Ответ 2

В рубине $" хранятся все имена файлов, которые загружаются через Kernel.load. Поэтому вы можете попробовать что-то вроде этого:

constant = User
$".detect{|load_path|
  load_path.include?(constant.to_s.underscore)
}

Примечание. Метод underscore является частью Rails/ActiveSupport

Ответ 3

Если константа, которую вы ищете, имеет методы (это класс или модуль), вы можете использовать класс Method для определения того, где она определена.

class Foo
  def bar
  end

  def self.baz
  end
end

Foo.instance_method(:bar).source_location
Foo.method(:baz).source_location

Немного взлома и не помогает с чистыми константами class Foo; BAHZ = 2; end, но это лучше, чем ничего.

Ответ 4

Ну, вы можете попробовать Module.constants(true), как указано здесь. Это может потребоваться немного больше, чем с помощью предложений pry, но это позволит вам заглянуть в Используемые модули