2012-03-26 2 views
14

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

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

+1

Как насчет 'grep'? – Arsen7

+3

Не могли бы вы принять ответы на свои предыдущие вопросы? – Arsen7

+4

@ Arsen7 Огромное спасибо, что напомнил мне. Я совершенно новичок в этом сообществе. Я принял их сейчас. –

ответ

6

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

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

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

EDIT:

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

1

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

+0

Не похоже, что есть возможность найти исходное местоположение из этого. –

2

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

6

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

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

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

+0

Это отличное предложение! – sandstrom

+0

Отличный ответ. Я нашел, что 'underscore' недоступен для меня в String on Ruby 2.4.2. Я получил с помощью 'downcase', но если ваше имя класса несколько слов, вам нужно каким-то образом превратить его в случай с змеей. –

Смежные вопросы