首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何获取通过attr_reader或attr_accessor定义的属性

如何获取通过attr_reader或attr_accessor定义的属性
EN

Stack Overflow用户
提问于 2012-04-04 15:43:56
回答 6查看 40.1K关注 0票数 23

假设我有一个类A

class A
  attr_accessor :x, :y

  def initialize(x,y)
    @x, @y = x, y
  end
end

在不知道xy属性的确切命名方式的情况下,如何获取它们。

例如。

a = A.new(5,10)
a.attributes # => [5, 10]
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 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]
票数 36
EN

Stack Overflow用户

发布于 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声明,你可以做一些类似的事情。

票数 16
EN

Stack Overflow用户

发布于 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

这可能不是最简单的,但如果您只关心为一个类(而不是所有东西都继承自的基类)执行此操作,那么这应该是可行的。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10006889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档