Чтобы получить объекты метода из строки, вы можете использовать методы method
или instance_method
(где method
будет вызываться для объекта и instance_method
для класса). Единственная интересная информация, которую он дает вам, - это arity (в отличие от java, где также указываются типы возвращаемого значения и аргументы, что, конечно, невозможно в ruby).
Ваш заголовок предполагает, что вы хотите перебирать только методы, созданные attr_accessor
, но ваш код будет перебирать каждый метод, определенный в вашем классе, что может стать проблемой, если вы захотите добавить дополнительные методы без доступа к вашему класс.
Чтобы избавиться от этой проблемы и проблемы с id
, вы можете использовать свою собственную оболочку вокруг attr_accessor
, в которой хранятся переменные, для которых она создала средства доступа, например:
module MyAccessor
def my_attr_accessor *attrs
@attrs ||= []
@attrs << attrs
attr_accessor *attrs
end
def attrs
@attrs
end
end
class MyClass
extend MyAccessor
my_attr_accessor :id,:a,:b,:c
def to_s
MyClass.attrs.each do |attr|
do_something_with(attr, send(attr))
end
end
end
Для задачи 3 вы можете просто сделать
if item.is_a? Array
do_something
else
do_something_else
end