Рубиновый эквивалент Python "dir"? - PullRequest
49 голосов
/ 22 января 2009

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

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

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

Ответы [ 9 ]

53 голосов
/ 22 января 2009

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

object.methods.sort
20 голосов
/ 01 апреля 2009

Мне нравится иметь это в моем .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"]
4 голосов
/ 22 января 2009

Подсказка для «поиска» метода в 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, чтобы получить методы класса.

4 голосов
/ 22 января 2009

Вы можете взять модуль, такой как 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?"]
1 голос
/ 02 июня 2014

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

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

require 'irb/completion'

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

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

1 голос
/ 22 января 2009

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

y String.methods.sort

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

0 голосов
/ 23 января 2009

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

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

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

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

0 голосов
/ 22 января 2009

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

some_object.methods.sort - Object.new.methods

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

0 голосов
/ 22 января 2009

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

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

...