2015-12-18 2 views
3

Использование Ruby 2.2.1, как перечислять все методы (предпочтительнее Array of String names) класса, который определен только в том классе/файле, где include и extend отфильтровываются. Я хочу также отличать методы класса и экземпляра.Как перечислить все методы класса (не расширенные и вложенные методы)

В настоящее время я могу получить все неисследованные методы, используя MyClass.methods(false), но это все еще включает в себя методы, которые являются частью модуля include.

Явное, скажем, у меня есть:

class MyClass < BaseClass 
    extend AnotherBaseClass 
    include MyModule 

    def foo 
    end 

    def bar 
    end 
end 

Я хочу получить:

somecodethatreturnssomething 
#=> ['foo', 'bar'] 
# Not including BaseClass, AnotherBaseClass, and ModuleClass methods 

UPDATE: ответ

@Wand Maker является правильным, когда я запускаю его в отдельная консоль irb. Тем не менее, у меня все еще есть проблема, что я включаю ActionView::Helpers::UrlHelper в MyClass. Я всегда получаю дополнительные методы: default_url_options?, default_url_options=, и default_url_options. Я думал, что include ведет себя одинаково независимо от Rails или нет, поэтому я не ставил этот вопрос в Rails.

Я даже добавил byebug в конце файла MyClass, чтобы я мог проверить класс и запустить MyClass.singleton_methods(false) или запустить MyClass.instance_methods(false). Но они все же включают эти три нежелательных метода.

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

UPDATE:

В 3 способа получить только добавлены в Rails 3 это казалось (проект я работаю), но не в Rails 4 (как я и @Wand Maker опробовал).

Это точный код (где я снял уже все, но по-прежнему получаю те же результаты/проблемы)

# lib/my_class.rb 
class MyClass 
    include ActionView::Helpers::UrlHelper 

    def welcome 
    puts 'Hello Jules!' 
    end 

    def farewell 
    puts 'Goodbye Jules!' 
    end 
end 

byebug 

Или я мог бы удалить этот файл: my_class.rb (и скопировать и вставить, что весь код rails console)

Но, все еще получая ту же проблему.

+0

FYI: Если я использую 'MyClass

+0

@WandMaker Я обновил вопрос с помощью точного усеченного кода, где я все еще получаю три метода. –

ответ

7

Вы можете сделать что-то, как показано ниже:

MyClass.instance_methods(false) 
#=> [:foo, :bar] 

Если вы хотите включить любые методы класса, определенные в MyClass, вы могли бы сделать:

MyClass.instance_methods(false) + MyClass.singleton_methods(false) 

Здесь работает пример со всеми классы/модули

class BaseClass 
    def moo 
    end 
end 

module AnotherBaseClass 
    def boo 
    end 
end 

module MyModule 
    def roo 
    end 
end 

class MyClass < BaseClass 
    extend AnotherBaseClass 
    include MyModule 

    def self.goo 
    end 

    def foo 
    end 

    def bar 
    end 
end 

p MyClass.instance_methods(false) + MyClass.singleton_methods(false) 
#=> [:foo, :bar, :goo] 

p RUBY_VERSION 
#=> "2.2.2" 
+0

Это все равно вернет методы, определенные в включенных модулях. – zwippie

+0

@zwippie я вижу. Я добавил полный пример, кажется, что он не делает то, что вы говорите. Дайте мне знать, если я что-то упустил. –

+0

Попробуйте 'Fixnum.instance_methods (false)' в 'pry'. – mudasobwa

Смежные вопросы