Рубиновый эквивалент Python "dir"?

В Python мы можем "направить" модуль, например так:

>>> import re
>>> dir(re)

И это перечисляет все функции в модуле. Есть ли подобный способ сделать это в Ruby?

9 ответов

Насколько я знаю не совсем, но вы получите где-то с

object.methods.sort

Мне нравится иметь это в моем.irbrc:

class Object
  def local_methods
    (methods - Object.instance_methods).sort
  end
end

Поэтому, когда я в IRB:

>> Time.now.local_methods 
=> ["+", "-", "<", "<=", "<=>", ">", ">=", "_dump", "asctime", "between?", "ctime", "day", "dst?", "getgm", "getlocal", "getutc", "gmt?", "gmt_offset", "gmtime", "gmtoff", "hour", "isdst", "localtime", "mday", "min", "mon", "month", "sec", "strftime", "succ", "to_f", "to_i", "tv_sec", "tv_usec", "usec", "utc", "utc?", "utc_offset", "wday", "yday", "year", "zone"]

Или даже симпатичнее - с помощью grep:

>> Time.now.local_methods.grep /str/
=> ["strftime"]

Подсказка для "поиска" метода в irb:

"something".methods.select {|item| item =~ /query/ }

Совет для опробования методов на значении для сравнения:

value = "something"
[:upcase, :downcase, :capitalize].collect {|method| [method, value.send(method)] }

Также обратите внимание, что вы не получите всю ту же информацию, что и каталог Python с object.methods. Вы должны использовать комбинацию object.methods и class.constants, также class.singleton_methods, чтобы получить методы класса.

Вы можете взять модуль, такой как Enumerableи отправить methods метод, который перечисляет все методы, которые определяет модуль. Классы, которые включают этот модуль, будут отвечать на эти методы.

>> Enumerable.methods
=> ["inspect", "private_class_method", "const_missing", "clone", "method", "public_methods", "public_instance_methods", "instance_variable_defined?", "method_defined?", "equal?", "freeze", "included_modules", "const_get", "yaml_as", "methods", "respond_to?", "module_eval", "class_variables", "dup", "protected_instance_methods", "instance_variables", "public_method_defined?", "__id__", "object_id", "taguri", "yaml_tag_read_class", "eql?", "const_set", "id", "to_yaml", "taguri=", "singleton_methods", "send", "class_eval", "taint", "frozen?", "instance_variable_get", "include?", "private_instance_methods", "__send__", "instance_of?", "private_method_defined?", "to_a", "name", "to_yaml_style", "autoload", "type", "yaml_tag_class_name", "<", "protected_methods", "instance_eval", "<=>", "==", ">", "display", "===", "instance_method", "instance_variable_set", "to_yaml_properties", "kind_of?", "extend", "protected_method_defined?", "const_defined?", ">=", "ancestors", "to_s", "<=", "public_class_method", "hash", "class", "instance_methods", "tainted?", "=~", "private_methods", "class_variable_defined?", "nil?", "untaint", "constants", "autoload?", "is_a?"]

Я бы пошел на что-то вроде этого:

y String.methods.sort

Который даст вам yaml представление отсортированного массива методов. Обратите внимание, что это можно использовать для перечисления методов как классов, так и объектов.

Возможно, не отвечая на первоначальный вопрос (зависит от варианта использования), но для тех, кто ищет это для использования в irb только, вы можете использовать "двойной TAB" для автозаполнения. Который, по сути, может также перечислить (почти все) методы, доступные для данного объекта.

Вставьте следующую строку в ваш ~/.irbrc файл:

require 'irb/completion'

Теперь (пере) начать irb, начните вводить метод и дважды нажмите TAB - irb автоматически завершает ввод!

Я действительно узнал это здесь: http://drnicwilliams.com/2006/10/12/my-irbrc-for-consoleirb/

На самом деле, нет. Как и другие говорили, вы можете получить часть того, что вы хотите, перечислив методы экземпляра класса (например, String.instance_methods) но это не поможет вам, если открываемый вами файл снова откроет класс (если вы не проверили до и после).

Если вам не нужен программный доступ к списку методов, рассмотрите возможность проверки документации для класса, модуля или метода с помощью ri инструмент командной строки.

Я бы сделал это комментарием к ответу Джонелфа, но, видимо, мне не хватает представителя.

some_object.methods.sort - Object.new.methods

Это не совсем то, что вы спрашивали, как говорили другие, но это дает вам информацию, которую вы ищете.

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

  • класс
  • модуль
  • простой код

или любую комбинацию вышеперечисленного несколько раз. Таким образом, вы не можете напрямую запросить все методы в данном файле.

Если вы намеревались перечислить все методы данного модуля или класса, то другие ответы - это то, что вы ищете (в основном используя #methods метод имени модуля или класса).

Другие вопросы по тегам