Как мне найти, где константа определена в Ruby? - PullRequest
20 голосов
/ 26 марта 2012

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

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

Ответы [ 4 ]

12 голосов
/ 17 января 2015

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

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

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

8 голосов
/ 27 марта 2012

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

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

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

EDIT

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

4 голосов
/ 07 июля 2013

Если искомая константа имеет методы (это класс или модуль), вы можете использовать класс 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, но это лучше, чем ничего.

1 голос
/ 26 марта 2012

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

...