我有一个复杂的ruby对象,如何显示其所有方法和变量?

时间:2014-03-26 21:06:22

标签: ruby

我有一个复杂的ruby对象,如何显示其所有方法和变量?

是否有某种元调用可以打印所有值,方法和变量?

2 个答案:

答案 0 :(得分:1)

执行以下操作:

object.class.instance_methods # => [:meth1, :meth2,...]
object.instance_variables # => [:@var1, :@var2,..]

现在,下面将给出对象的所有变量的值。

object.instance_variables.map { |var| object.instance_variable_get(var) }

文档是: -

答案 1 :(得分:0)

详细说明@Arup说的话:

  • 要获取为类或模块定义的所有常量,请使用MyClass.constants

  • 要获取所有类变量(例如@@ a),请使用my_class.class_variables

  • 要获取所有类instance_variables(例如@a),请使用my_class.instance_variables

  • 要获取所有课程方法,请使用my_class.singleton_class.instance_methods

  • 有时您只需要为特定类(或者对于方法,特定模块)定义的常量,实例方法,类方法,类变量,类实例变量或实例变量。要仅检索那些(即,排除由类或模块的祖先定义的那些),请使用my_class.instance_methods(false)my_object.instance_variables(false)等。

示例

module M
  M_constant = "M constant" 
  def m_method
    puts "M#m_instance_method"
  end
end

class C
  include M
  attr_accessor :c_instance_variable

  C_constant = "C constant"

  @@c_class_variable = 4

  def self.c_class_method1
    puts "c_class_method1"
  end

  def c_method
    @c_instance_variable = 0
    puts "c_instance_method"
  end

  class << self
    attr_accessor :c_class_instance_variable
    @c_class_instance_variable = 5
    def c_class_method1
      puts "c_class_method1"
    end
  end
end

class D < C
end

<强>物件

M.constants 
  #=> [:M_constant] 
C.constants
  #=> [:A, :C_constant, :M_constant] 
C.constants(false) 
  #=> [:A, :C_constant] 
D.constants 
  #=> [:A, :C_constant, :M_constant] 
D.constants(false) 
  #=> [] 

C.class_variables
  #=> [:@@c_class_variable] 
C.class_variables(false)
  #=> [:@@c_class_variable] 
D.class_variables
  #=> [:@@c_class_variable] 
D.class_variables(false)
  #=> []

C.new.instance_variables
  #=> [:@c_instance_variable]
D.new.instance_variables
  #=> []

M.instance_methods
  #=> [:m_instance_method]
C.instance_methods.size
  #=> 57 
C.instance_methods(false)
  #=> [:c_instance_variable, :c_instance_variable=, :c_method] 
D.instance_methods.size
  #=> 57 
D.instance_methods(false)
  #=> [] 

C.singleton_class.instance_methods.size
  #=> 102 
C.singleton_class.instance_methods(false)
  #=> [:c_class_method1, :c_class_instance_variable,
  #    :c_class_instance_variable=] 
D.singleton_class.instance_methods.size
  #=> 102 
D.singleton_class.instance_methods(false)
  #=> []