2014-01-18 10 views
1

Say I загрузить код в irb как следующее:Как получить список ТОЛЬКО моих доступных методов в IRB?

class MyClass 
    def m 
    #... something 
    end 
    def a 
    #... something 
    end 
end 

Как я могу получить список только мои доступные методы? Если я забегу MyClass.new.methods, я вернусь все из доступных instance methods.

Я хотел бы просто увидеть: :m, :a

Кроме того, что, если мой methods не завернутые в class?

def x 
    #... something 
end 
def z 
    #... something 
end 

Как я могу узнать, что доступно? Вызов self.methods (работает: methods) даже не перечисляет мои методы.

ответ

1

ли, как показано ниже, используя Module#instance_methods:

Возвращает массив, содержащий имена государственных и защищенных методов, например, в приемнике. Для модуля это общедоступные и защищенные методы; для класса они являются экземплярами (не одноэлементными) методами. Без аргументов или с аргументом, который является ложным, возвращаются методы экземпляра в модуле, в противном случае возвращаются методы в суперклассах mod и mod.

class MyClass 
    def m 
    #... something 
    end 
    def a 
    #... something 
    end 
end 
MyClass.instance_methods(false) 
# => [:m, :a] 

Если вы определили методы верхнего уровня, как показано ниже, они станут частными методами экземпляра класса Object. Поэтому я бы использовал тогда Module#private_instance_methods

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

def x 
    #... something 
end 
def z 
    #... something 
end 

Object.private_instance_methods(false) 
# => [:x, :z] 
+0

Ницца! Как насчет без класса? – fyz

+1

Это фантастически +1, я действительно возвращаюсь '[: default_src_encoding,: irb_binding,: x,: z]' используя: 'Object.private_instance_methods (false)' возможно, из-за моего окна Windows? Повторится на моем Mac. Благодаря! – fyz

1

Это небольшой трюк, который я часто использую, особенно если я пытаюсь работать с объектом из библиотеки я не писал:

obj = MyClass.new 
obj.methods.sort - 0.methods # => [:a, :m] 

Число 0 имеет небольшой набор методов, которые в основном являются стандартными материалами Ruby, которые вы не хотите видеть. Вы могли бы сделать Object.new вместо 0, и это было бы лучше, потому что вы могли бы видеть такие методы, как succ, но это было бы больше набрав.

Преимущество этого над MyClass.instance_methods(false) заключается в том, что оно показывает методы, включенные в суперклассы, методы, входящие в состав модулей, и методы, которые были определены динамически. Кроме того, у вас обычно есть объект , который вы проверяете, а не класс.

+0

Отличное объяснение, спасибо много +1! 'MyClass.new.methods - Object.new.методы 'отлично работают, но как насчет прямого доступа к методам частных экземпляров, не охваченных классом? У вас есть альтернативное решение для @ Arup's: 'Object.private_instance_methods (false)'? – fyz

+0

Это не проблема: 'obj.class' –

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