我遇到了两件事。这是我文件的结构。
class Person
#...
def self.class_name (object)
object.class.name
end
end
class Worker < Person
#...
end
class Client < Person
#...
end
c = Client.new("1", "2", "3", "4")
Person.class_name(c)
我想创建方法,其中作为参数我可以放置一些对象,它将检测它是什么类,并返回所有实例方法的列表,不需要任何参数。后来我需要以某种方式使用所有这些方法。
我发现了这个:
testObject.class.name
# returns name of class as a string
Class.instance_methods(false)
# returns list of instance method, which were defined in Class
第一个问题,是我不明白为什么我不能做像
这样的事情className = testObject.class.name
className.instance_methods(false)
我想,那是因为我只是一个类名,作为一个刺痛,而不是对该类的真正引用。我甚至创建了简单的class_name方法,它返回正确的类名,但我想知道如何使用instance_methods(false)
,一旦我有这个名字。还有一些选项可以只选择不需要任何参数的方法吗?
答案 0 :(得分:2)
我想创建方法,其中作为参数我可以放置一些对象 它会检测到它是什么类,并返回所有的列表 实例方法
class Person
def self.instance_methods(object)
object.class.instance_methods(false)
end
end
用法:
c = Client.new("1", "2", "3", "4")
Person.instance_methods(c)
#=> returns an array of all instance methods defined in Client class
还有一些选项可以选择不需要的方法 任何争论?
是的,你必须检查method
&#39; arity
并选择那些零:
class Person
def self.instance_methods_with_arity_zero(object)
object.class.instance_methods(false).map do |method|
object.method(method).arity.zero?
end
end
end
用法:
c = Client.new("1", "2", "3", "4")
Person.instance_methods_with_arity_zero(c)
#=> returns an array of instance methods which take no arguments defined in Client class
可以缩短后一种方法以使用第一种定义的方法:
def self.instance_methods_with_arity_zero(object)
# we are using the previously defined instance_methods method
instance_methods(object).map { |method| object.method(method).arity.zero? }
end
答案 1 :(得分:1)
您不必将其变成字符串:
klass = testObject.class
methods = klass.instance_methods(false)
如果你必须处理类名的字符串表示,那么首先将它转回一个类:
klass = "String".constantize
string_methods = klass.instance_methods(false)