我有一个复杂的ruby对象,如何显示其所有方法和变量?
是否有某种元调用可以打印所有值,方法和变量?
答案 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)
#=> []