如何一次为所有类变量制作'attr_reader'或'attr_writer'?

时间:2011-02-25 06:42:08

标签: ruby-on-rails ruby class ruby-on-rails-3 variables

我正在使用Ruby on Rails 3,因为我声明了一个包含大量变量的类,所以我会一次为那些类变量声明所有'attr_reader'或'attr_writer'

我试过

class Persone
  attr_reader :all

  def initialize(name, surname, ...)
    @name = name
    @surname = surname
    ... # A lot of variables!
  end
end

但这不起作用。

6 个答案:

答案 0 :(得分:3)

class Persone
  INSTANCE_VARS = [:name,:surname]
  attr_reader *INSTANCE_VARS

  def initialize(*params)
    params.each_with_index do |param,index|
      instance_variable_set("@"+INSTANCE_VARS[index].to_s,param)
    end
  end
end

答案 1 :(得分:2)

我应该使用的东西:

attr_accesor :name, :surname, ...

def initialize(name, surname, ...)
  @name = name
  @surname = surname
  ...
end

这样你只需要一步就能得到一个setter和一个getter,但你仍然需要枚举所有变量名。

答案 2 :(得分:1)

看一下Struct课程:

Persone = Struct.new :name, :surname, :address

p = Persone.new 'John', 'Smith', '12 Street 345'
puts p.address

答案 3 :(得分:1)

答案可能会迟到,但迟到总比没有好:

class Persone    
  def initialize(name, surname, ...)
    @name = name
    @surname = surname
    ... # A lot of variables!

    instance_variables.each do |var|
        eval "def #{var.to_s.sub('@', '')}; #{i}; end"
    end
  end
end

答案 4 :(得分:0)

class Persone

  VARS = [:name, :surname, ...]

  VARS.each{|var|
    attr_reader var
  }

  def initialize(params)
    params.each_pair{|key,value|
       self.instance_variable_set("@#{key}".to_sym, value
    }
  end
 end

答案 5 :(得分:0)

在Chris Wouters示例中,instance_variable块有一个拼写错误...

instance_variables.each do |var|
    eval "def #{var.to_s.sub('@', '')}\n #{var}; end"
  end