Если вы используете ruby-1.9, вы можете использовать Object#public_send
, который делает то, что вы хотите.
Если вы используете ruby-1.8.7 или более раннюю версию, вы должны написать собственную Object#public_send
class Object
def public_send(name, *args)
unless public_methods.include?(name.to_s)
raise NoMethodError.new("undefined method `#{name}' for \"#{self.inspect}\":#{self.class}")
end
send(name, *args)
end
end
Или вы можете написать свой собственный Object#public_method
, который ведет себя как Object#method
, но только для открытых методов
class Object
def public_method(name)
unless public_methods.include?(name.to_s)
raise NameError.new("undefined method `#{name}' for class `#{self.class}'")
end
method(name)
end
end