Как я исследую вещи в 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?
Ответы
Ответ 1
Конечно, это даже проще, чем в Python. В зависимости от того, какую информацию вы ищете, попробуйте:
obj.methods
и если вам нужны только методы, определенные для obj (в отличие от методов на Object
)
obj.methods - Object.methods
Также интересно делать такие вещи, как:
obj.methods.grep /to_/
Чтобы получить переменные экземпляра, сделайте следующее:
obj.instance_variables
и для переменных класса:
obj.class_variables
Ответ 2
Если вы хотите использовать все методы, которые вы можете назвать чем-то, чем использовать
>>> x.methods
Если вы хотите получить некоторую справочную информацию, обратитесь за помощью к своему классу
>>> help x.class
Справка - это оболочка для ri внутри irb.
Ответ 3
Если у вас есть объект, и вы хотите знать, на какие методы он отвечает, вы можете запустить obj.methods
(и все трюки, которые были упомянуты в этом результате.)
Если у вас есть класс, вы можете запустить klass.methods
, чтобы узнать, какие методы класса доступны, или вы можете запустить klass.instance_methods
, чтобы узнать, какие методы доступны для экземпляров этого класса. klass.instance_methods(false)
полезен, потому что он говорит вам, какие методы были определены классом и не унаследованы.
Теперь можно получить текст справки для метода в Ruby, как это делает python.
Ответ 4
Там есть модуль под названием ObjectSpace
, который входит в каждый объект, созданный в ruby. Он содержит все методы, которые помогут вам проанализировать текущий контекст процесса. В irb вы начинаете с контекста Object:Main
, который является контекстом верхнего уровня для текущего сеанса irb. Затем вы можете сделать что-то вроде time = Time.now
, а затем сделать irb time
, который перенесет вас в этот контекст объекта, и вы можете проверить его изнутри, не вызывая методы ObjectSpace
для этого объекта.