Есть ли способ в Ruby распечатать общедоступные методы объекта - PullRequest
2 голосов
/ 15 ноября 2011

... без учета всех открытых методов универсального объекта? Я имею в виду, кроме вычитания массива. Я просто хочу быстро просмотреть то, что мне доступно из объекта, иногда не заходя в документы.

Ответы [ 4 ]

10 голосов
/ 15 ноября 2011

methods, instance_methods, public_methods, private_methods и protected_methods все принимают логический параметр, чтобы определить, включены ли методы родителей вашего объекта.

Например:

ruby-1.9.2-p0 > class MyClass < Object; def my_method; return true; end; end;
ruby-1.9.2-p0 > MyClass.new.public_methods
 => [:my_method, :nil?, :===, :=~, :!~, :eql?, :hash, :<=>, :class, :singleton_class, :clone, :dup, :initialize_dup, :initialize_clone, :taint, :tainted?, :untaint, :untrust, :untrusted?, :trust, :freeze, :frozen?, :to_s, :inspect, :methods, :singleton_methods, :protected_methods, :private_methods, :public_methods, :instance_variables, :instance_variable_get, :instance_variable_set, :instance_variable_defined?, :instance_of?, :kind_of?, :is_a?, :tap, :send, :public_send, :respond_to?, :respond_to_missing?, :extend, :display, :method, :public_method, :define_singleton_method, :__id__, :object_id, :to_enum, :enum_for, :==, :equal?, :!, :!=, :instance_eval, :instance_exec, :__send__] 
ruby-1.9.2-p0 > MyClass.new.public_methods(false)
 => [:my_method]

Как отмечает @Marnen, методы, определенные динамически (например, с помощью method_missing), здесь не появятся. Ваша единственная ставка на это - надеяться, что используемые вами библиотеки хорошо документированы.

1 голос
/ 15 ноября 2011

Это результат, который вы искали?

class Foo
  def bar
    p "bar"
  end
end

p Foo.public_instance_methods(false) # => [:bar]

PS Я ожидаю, что это был не тот результат, который вы получили после:

p Foo.public_methods(false)          # => [:allocate, :new, :superclass]
0 голосов
/ 16 ноября 2011

Я начал пытаться задокументировать все эти методы проверки в одной точке в https://github.com/bf4/Notes/blob/master/code/ruby_inspection.rb

Как отмечено в других ответах:

class Foo; def bar; end; def self.baz; end; end

Во-первых, мне нравится сортировать методы

Foo.public_methods.sort # all public instance methods
Foo.public_methods(false).sort # public class methods defined in the class
Foo.new.public_methods.sort # all public instance methods
Foo.new.public_methods(false).sort # public instance methods defined in the class

Полезный совет Grep, чтобы узнать, какие у вас варианты

Foo.public_methods.sort.grep /methods/ # all public class methods matching /method/
# ["instance_methods", "methods", "private_instance_methods", "private_methods", "protected_instance_methods", "protected_methods", "public_instance_methods", "public_methods", "singleton_methods"]
Foo.new.public_methods.sort.grep /methods/
#  ["methods", "private_methods", "protected_methods", "public_methods", "singleton_methods"]

Также см. https://stackoverflow.com/questions/123494/whats-your-favourite-irb-trick

0 голосов
/ 15 ноября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...