Как мне проанализировать вещи в Ruby?

Например, в Python я могу делать такие вещи, если хочу получить все атрибуты объекта:

>>> import sys
>>> dir(sys)
['__displayhook__', '__doc__', '__excepthook__', '__name__', '__package__', '__stderr__', '__stdin__', '__stdout__', '_clear_type_cache', '_current_frames', '_getframe', 'api_version', 'argv', 'builtin_module_names', 'byteorder', 'call_tracing', 'callstats', 'copyright', 'displayhook', 'dont_write_bytecode', 'exc_clear', 'exc_info', 'exc_type', 'excepthook', 'exec_prefix', 'executable', 'exit', 'flags', 'float_info', 'getcheckinterval', 'getdefaultencoding', 'getdlopenflags', 'getfilesystemencoding', 'getprofile', 'getrecursionlimit', 'getrefcount', 'getsizeof', 'gettrace', 'hexversion', 'maxint', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'ps1', 'ps2', 'py3kwarning', 'pydebug', 'setcheckinterval', 'setdlopenflags', 'setprofile', 'setrecursionlimit', 'settrace', 'stderr', 'stdin', 'stdout', 'subversion', 'version', 'version_info', 'warnoptions']

Или, если я хочу просмотреть документацию по чему-либо, я могу использовать функцию справки:

>>> help(str)

Есть ли способ делать подобные вещи в Ruby?


person Jason Baker    schedule 22.03.2010    source источник
comment
Обратите внимание на ответ, но для получения основной информации вы можете увидеть: ruby-doc.org/core   -  person Fabiano Soriani    schedule 22.03.2010
comment
Проверьте этот список khelll.com/blog/ruby/ruby-introspection   -  person khelll    schedule 31.03.2010


Ответы (4)


Конечно, это даже проще, чем в Python. В зависимости от того, какую информацию вы ищете, попробуйте:

obj.methods

и если вам нужны только методы, определенные для obj (в отличие от методов для Object)

obj.methods - Object.methods

Также интересно делать такие вещи, как:

obj.methods.grep /to_/

Чтобы получить переменные экземпляра, сделайте следующее:

obj.instance_variables

и для переменных класса:

obj.class_variables
person rfunduk    schedule 22.03.2010
comment
Что касается документации, это обычно делается через rdoc или аналогичный в оболочке, а не в интерпретаторе. - person rfunduk; 22.03.2010
comment
Но что, если я ищу больше, чем просто методы? Что, если мне нужны переменные экземпляра или класса? - person Jason Baker; 22.03.2010
comment
Также @thenduks - иногда я уже в irb и хочу узнать о чем-то. Немного больно выйти из него, прочитать rdoc, а затем вернуться в irb. - person Jason Baker; 22.03.2010
comment
@thenduks - Надеюсь, вы не против. Я нашел ответ на вопрос в своем первом комментарии и отредактировал ваше сообщение, чтобы включить его. :-) - person Jason Baker; 22.03.2010
comment
Вероятно, вам не нужны переменные экземпляра или переменные класса (за исключением очень особых обстоятельств), потому что они не являются частью общедоступного API класса. В Ruby все достигается методами. - person Ken Bloom; 22.03.2010
comment
@Jason RE: rdoc ... Я лично никогда не использую rdoc (я считаю, что Интернет - гораздо лучший источник документации, у меня даже есть --no-rdoc и --no-ri в моем gemrc), и я думаю, что это верно для большинства «рубистов» . Если вам действительно нужен rdoc, я бы посоветовал просто использовать его в другом терминале (который, вероятно, вам в любом случае понадобится для других целей :)). Как сказал Брэндон в другом ответе, в irb: _5 _... есть помощник ri, но он не работает для меня ... что просто подтверждает мою точку зрения о том, что он не является основным методом документации для рубистов :) - person rfunduk; 22.03.2010
comment
Я не понимаю, насколько несколько вызовов проще одного. - person dogeen; 11.10.2011
comment
Это то, что я искал (+1), но вопрос о том, проще ли это, чем в Python, остается спорным. Возможность использовать grep по строкам в свободном интерфейсе является большим преимуществом (например, просто вспомните предыдущую команду и введите в конце, а не переходите к началу, введите dir(, а затем перейдите в конец, чтобы добавить ). Может быть, есть новый соперник среди моих калькуляторов dektop (включая ipython, octave, мою собственную оболочку C ++, ...) - person Tomasz Gandor; 12.12.2013

Если вам нужны все методы, которые вы можете вызвать, чем используйте

>>> x.methods

Если вам нужна справочная информация, позвоните в справку перед ее классом

>>> help x.class

Help - это оболочка для ri внутри irb.

person Brandon Bodnar    schedule 22.03.2010

Если у вас есть объект и вы хотите знать, на какие методы он реагирует, вы можете запустить obj.methods (и все уловки, упомянутые thenduks для этого результата).

Если у вас есть класс, вы можете запустить klass.methods, чтобы узнать, какие методы класса доступны, или вы можете запустить klass.instance_methods, чтобы узнать, какие методы доступны в экземплярах этого класса. klass.instance_methods(false) полезен, потому что он сообщает вам, какие методы были определены классом, а не унаследованы.

Теперь есть способ получить текст справки для метода в Ruby, как это делает python.

person Ken Bloom    schedule 22.03.2010

Есть модуль под названием ObjectSpace, который включен в каждый объект, созданный в ruby. Он содержит все методы, которые помогут вам проанализировать текущий контекст процесса. В irb вы начинаете с Object:Main контекста, который является контекстом верхнего уровня для текущего сеанса irb. Затем вы могли бы сделать что-то вроде time = Time.now, а затем сделать irb time, который перенесет вас в контекст этого объекта, и вы могли бы проверить его изнутри, не вызывая ObjectSpace методы этого объекта.

person Eimantas    schedule 22.03.2010