假设我有一个类A
class A
attr_accessor :x, :y
def initialize(x,y)
@x, @y = x, y
end
end
在不知道x
和y
属性的确切命名方式的情况下,如何获取它们。
例如。
a = A.new(5,10)
a.attributes # => [5, 10]
发布于 2012-04-04 15:46:40
使用内省,卢克!
class A
attr_accessor :x, :y
def initialize(*args)
@x, @y = args
end
def attrs
instance_variables.map{|ivar| instance_variable_get ivar}
end
end
a = A.new(5,10)
a.x # => 5
a.y # => 10
a.attrs # => [5, 10]
发布于 2014-03-03 02:38:32
虽然Sergio的答案有所帮助,但它将返回所有实例变量,如果我正确理解了OP的问题,则不是所问的问题。
如果你只想返回有一个赋值函数的“属性”,你必须做一些稍微复杂一些的事情,比如:
attrs = Hash.new
instance_variables.each do |var|
str = var.to_s.gsub /^@/, ''
if respond_to? "#{str}="
attrs[str.to_sym] = instance_variable_get var
end
end
attrs
这只返回用attr_accessor (或手动创建的赋值函数)声明的属性,并隐藏内部实例变量。如果你想用attr_reader声明,你可以做一些类似的事情。
发布于 2016-08-11 15:12:22
class A
ATTRIBUTES = [:x, :y]
attr_accessor *ATTRIBUTES
def initialize(x,y)
@x, @y = x, y
end
def attributes
ATTRIBUTES.map{|attribute| self.send(attribute) }
end
end
这可能不是最简单的,但如果您只关心为一个类(而不是所有东西都继承自的基类)执行此操作,那么这应该是可行的。
https://stackoverflow.com/questions/10006889
复制相似问题