繁体   English   中英

方法,返回实例方法列表

[英]Method, which return list of instance methods

我坚持两件事。 这是我的文件的结构。

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) ,一旦我有这个名字。 还有一些选项可以只选择方法,不需要任何参数吗?

我想创建方法,其中作为参数我可以放置一些对象,它将检测,它是什么类,并返回我所有实例方法的列表

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

还有一些选项可以只选择方法,不需要任何参数吗?

是的,你必须检查methodarity并选择那些有零的:

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

您不必将其变为字符串:

klass = testObject.class
methods = klass.instance_methods(false)

如果必须处理类名的字符串表示,请先将其转换为类:

klass = "String".constantize
string_methods = klass.instance_methods(false)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM