Como faço uma introspecção das coisas em Ruby?
-
21-09-2019 - |
Pergunta
Por exemplo, em Python, posso fazer coisas assim se quiser obter todos os atributos de um objeto:
>>> 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']
Ou se eu quiser ver a documentação de algo, posso usar a função de ajuda:
>>> help(str)
Existe alguma maneira de fazer coisas semelhantes em Ruby?
Solução
Claro, é ainda mais simples do que em Python.Dependendo das informações que você procura, tente:
obj.methods
e se você quiser apenas os métodos definidos para obj (em vez de obter métodos Object
também)
obj.methods - Object.methods
Também interessante é fazer coisas como:
obj.methods.grep /to_/
Para obter variáveis de instância, faça o seguinte:
obj.instance_variables
e para variáveis de classe:
obj.class_variables
Outras dicas
Se você deseja todos os métodos que você pode chamar de algo do que usar
>>> x.methods
Se você quiser algumas informações de ajuda, ligue para a ajuda antes de sua aula
>>> help x.class
A ajuda é um invólucro para o RI no IRB.
Se você tem um objeto e deseja saber quais métodos ele responde, você pode executar obj.methods
(E todos os truques que Thenduks mencionou sobre esse resultado.)
Se você tem uma aula, você pode correr klass.methods
Para ver quais métodos de classe estão disponíveis ou você pode executar klass.instance_methods
Para saber quais métodos estão disponíveis nas instâncias dessa classe. klass.instance_methods(false)
é útil, porque ele informa quais métodos foram definidos pela classe e não herdados.
Agora, há uma maneira de obter o texto de ajuda para um método dentro de Ruby da maneira que Python faz.
Há um módulo chamado ObjectSpace
que é incluído em cada objeto criado em Ruby. Ele mantém todos os métodos que ajudam a introduzir o contexto atual do processo. Em IRB você começa em Object:Main
contexto que é o contexto de nível superior para a sessão atual do IRB. Então você poderia fazer algo como time = Time.now
e então faça irb time
o que o levaria ao contexto desse objeto e você poderia inspecioná -lo por dentro sem ligar ObjectSpace
métodos nesse objeto.