Как перечислить все методы, определенные в top self Object в Ruby? - PullRequest
2 голосов
/ 12 июня 2019

В Ruby у нас есть простые способы получить все локальные переменные, глобальные переменные с помощью local_variables и global_variables метода.

Мы можем перечислить константы с помощью Object.constants

Но есть ли встроенный способ перечисления всех методов Object?

Примерно так:

def foo() end
def bar() end
def baz() end

# As `Array.new.methods' or `Array.instance_methods` returns all the methods of an Array object...

# Code to return all the methods defined above    # => [:foo, :bar, :baz]

В IRB я могу написать:

def foo() end
p [self.methods.include?(:foo), self.respond_to?(:foo)]

И вывод [true, true] в IRB, но в файле вывод на стандартный вывод [false, false]

Аналогично, если я запускаю следующий код:

def foo() end
puts Object.new.methods.include?(:foo)

В IRB я получаю true, и если он сохраняется в файле, я получаю false

Вот ссылка , которая не сильно помогла:

Как перечислить все методы для объекта в Ruby?

Просто потому, что в нем говорится о получении методов класса или модуля. Но я хочу перечислить методы, определенные в самом верхнем объекте self.

Ответы [ 2 ]

3 голосов
/ 12 июня 2019

Самое близкое, что я мог найти, - это вызвать private_methods для объекта main, с false в качестве аргумента

Возвращает список частных методов, доступных дляOBJ.Если для параметра all задано значение false, будут перечислены только те методы в получателе.

def foo
  "foo"
end

def bar
  "bar"
end

def baz
  "baz"
end

p private_methods(false)
# [:include, :using, :public, :private, :define_method, :DelegateClass, :foo, :bar, :baz]

Если вы опустите аргумент, вы также получите все частные методы, определенные в Kernel или BasicObject.

Для дальнейшего уточнения списка вы можете выбрать методы, определенные для Object:

p private_methods(false).select{|m| method(m).owner == Object}
#=> [:DelegateClass, :foo, :bar, :baz]

Осталось только :DelegateClass, поскольку оно определено в области верхнего уровня, как :foo, :bar и :baz.

1 голос
/ 12 июня 2019

Вы получаете false, потому что методы, определенные в контексте верхнего уровня, по умолчанию являются закрытыми.

def foo; end

p self.private_methods.include?(:foo)
# => true

Я не уверен, документировано ли это где-либо.

Для того, чтобы получить все методы, включая частные, вам нужно сделать, например ::

all_methods = self.methods | self.private_methods

Попробуйте на repl.it: https://repl.it/@jrunning/DutifulPolishedCell

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