Ruby on rails 方法,它返回实例方法的列表

Ruby on rails 方法,它返回实例方法的列表,ruby-on-rails,ruby,reflection,Ruby On Rails,Ruby,Reflection,我有两件事要做。这是我文件的结构 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) 第一个问题是,我不明白为什么我不

我有两件事要做。这是我文件的结构

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)
第一个问题是,我不明白为什么我不能做这样的事情

className = testObject.class.name 
className.instance_methods(false)
我想,这是因为我只得到了类名,作为一个sting,而不是对该类的真正引用。我甚至创建了简单的class_name方法,它返回正确的类名,但我想知道,一旦我有了这个名称,如何使用
instance_methods(false)
。还有一些选项可以只选择不需要任何参数的方法吗

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

用法:

c = Client.new("1", "2", "3", "4")
Person.instance_methods(c)
#=> returns an array of all instance methods defined in Client class
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
还有一些选项可以只选择不需要 有争论吗

是的,您必须选中并选择那些为零的:

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(c)
#=> returns an array of all instance methods defined in Client class
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)

谢谢!你可能是我在任何论坛上见过的速度最快的人:D.@DanZawadzki不客气!这只是一个巧合,我在创建DEverything之后就注意到了你的问题:DEverything工作得很好,但我现在正在考虑如何“激活”这些方法。另外,你能给我一些关于ror的好信息资源吗?此时此刻,我的立足点是。还有什么我可以用的吗?@DanZawadzki你说的“激活”是什么意思?ruby-doc.org是非常好的源代码!如果你愿意阅读书籍推荐——
元编程Ruby 2
绝对是你应该读的东西。@DanZawadzki那么你想调用对象上返回的方法吗?您可以使用method-它将符号作为参数,并在接收方上调用此方法:
object.public\u send(:to_s)
。还有一种方法在某种程度上有所不同,它不关心该方法的可见性级别,也会调用私有方法,而
public\u send
如果您尝试使用它调用私有方法,则会抛出异常。非常感谢!我不明白,添加
.name
会将其转换为字符串。我一定记得!