#ruby #reflection #irb
#ruby #отражение #irb
Вопрос:
Когда я захожу в irb и набираю несуществующую команду, я получаю сообщение об ошибке с указанием
"undefined local variable or method 'my_method' for main:Object (NameError)"
Есть ли способ просто получить список доступных локальных переменных или методов? Это было бы действительно полезно для изучения ruby.
Ответ №1:
Ищите методы в ядре, объекте и модуле: например, local_variables, instance_methods, instance_variables.
Там есть другие замечательные методы. инспектировать — это еще один вариант.
Комментарии:
1. @sawa, inspect также покажет instance_variables (т. Е., если только он не был переопределен для класса, чтобы показывать что-то другое вместо этого)
2. кто-нибудь может объяснить, как этот парень получает приглашение: «показать все доступные 152) методы?» youtube.com/watch?v=J_9H1WPV2Ws#t=0m15s
3. @lukemh, введите
[1,2].
вirb
и нажмитеTAB
дважды. Функция в общем случае называется завершением / автозаполнением .
Ответ №2:
Отличные ответы.
По мере изучения они будут в вашем распоряжении:
obj.private_methods
obj.public_methods
obj.protected_methods
obj.singleton_methods
и
MyClass.private_instance_methods
MyClass.protected_instance_methods
MyClass.public_instance_methods
Использование, подобное :
obj.public_methods.sort
Также может упростить просмотр.
Существуют некоторые особые случаи, такие как
String.instance_methods(false).sort
… предоставит вам только методы экземпляра, определенные в классе String, исключая классы, которые он унаследовал от любых предков. Как я полагаю, вы знаете, вы можете увидеть больше здесь:http://www.ruby-doc.org/docs/ProgrammingRuby / но это не так весело, как проверять и отражать в irb.
Приятного изучения —
Перри
Ответ №3:
Чтобы узнать переменные экземпляра, вы можете использовать Kernel#instance_variables
, как указал Zabba.
Для методов, доступных на объекте, я использую my_object.methods - Object.methods
, чтобы выяснить, какие неочевидные методы доступны для моего объекта. Это сужает список и значительно упрощает чтение.
Комментарии:
1. Вероятно, вам следует изменить это на
my_object.methods.sort - Object.new.methods
— в нынешнем виде вы вычитаете методы классаObject
из спискаmy_object
методов экземпляра.2. Верно. Однако в Ruby
Object.class
isClass
является экземпляром классаClass
, поэтому в нем все еще есть методы изObject.methods
.