如何在ruby类中公开所有属性

时间:2015-04-01 08:48:03

标签: ruby class attributes

我有一个包含20多个属性的类,我希望每个属性都是公开可读的,如果没有那么公开。

我似乎无法找到与此相关的任何数据。有人可以帮我吗?

我想公开所有这些内容,而无需使用attr_reader输入所有20多个属性。

1 个答案:

答案 0 :(得分:1)

您可以使用method_missing执行此操作。只要有人试图调用您的课程不知道如何回应的方法,就会调用method_missing

class Foo

  def initialize
    @a = 1
    @b = 2
    @c = 3
  end

  def respond_to_missing?(name)
    super || has_attribute?(name)
  end

  def method_missing(name, *args)
    if has_attribute?(name)
      instance_variable_get("@#{name}")
    else   
      super
    end
  end

  private

  def has_attribute?(name)
    instance_variable_defined?("@#{name}")
  end

end

以下是您使用时的样子

foo = Foo.new
p foo.a    # => 1
p foo.b    # => 2
p foo.c    # => 3
p foo.d    # => method_missing error

注意:对于早于1.9.2的Ruby:Override respond_to? instead of respond_to_missing?