请帮助我以同样的方式获取在类中声明的所有实例变量instance_methods
向我展示类中可用的所有方法。
class A
attr_accessor :ab, :ac
end
puts A.instance_methods #gives ab and ac
puts A.something #gives me @ab @ac...
答案 0 :(得分:64)
您可以使用instance_variables
:
A.instance_variables
但这可能不是您想要的,因为它获取类 A
中的实例变量,而不是该类的实例。所以你可能想要:
a = A.new
a.instance_variables
但请注意,仅调用attr_accessor
并不会定义任何实例变量(它只是定义方法),因此在您明确设置它们之前,实例中不会有任何实例变量。
a = A.new
a.instance_variables #=> []
a.ab = 'foo'
a.instance_variables #=> [:@ab]
答案 1 :(得分:8)
如果要获取所有实例变量值,可以尝试以下方法:
class A
attr_accessor :foo, :bar
def context
self.instance_variables.map do |attribute|
{ attribute => self.instance_variable_get(attribute) }
end
end
end
a = A.new
a.foo = "foo"
a.bar = 42
a.context #=> [{ :@foo => "foo" }, { :@bar => 42 }]
答案 2 :(得分:0)
这不是万无一失的-可以在类上定义与模式匹配的其他方法-但是我发现最适合自己需求的一种方法是
A.instance_methods.grep(/[a-z_]+=/).map{ |m| m.to_s.gsub(/^(.+)=$/, '@\1') }
答案 3 :(得分:0)
如果要以属性的方式获取所有实例变量的哈希,请按照Aschen的答案进行操作
class A
attr_accessor :foo, :bar
def attributes
self.instance_variables.map do |attribute|
key = attribute.to_s.gsub('@','')
[key, self.instance_variable_get(attribute)]
end.to_h
end
end
a = A.new
a.foo = "foo"
a.bar = 42
a.context #=> {'foo' => 'foo', 'bar' => 42}
答案 4 :(得分:0)
基于@Obromios的答案,我在类中添加了.to_h
和.to_s
,以实现愉快,灵活地转储适合最终用户显示的属性。
该特定类(不是ActiveRecord模型)将在不同情况下设置各种属性。在我打印myvar.to_s
时,只有那些具有值的属性才会出现。
class LocalError
attr_accessor :product_code, :event_description, :error_code, :error_column, :error_row
def to_h
instance_variables.map do |attribute|
key = attribute.to_s.gsub('@', '')
[key, self.instance_variable_get(attribute)]
end.to_h
end
def to_s
to_h.to_s
end
end
这使我可以将以下简单代码放入邮件模板:
Data error: <%= @data_error %>
它产生(例如):
Data error: {"event_description"=>"invalid date", "error_row"=>13}
这很好,因为以后将来更改LocalError属性时,不必更新邮件程序。