开发者

How to make 'attr_reader' or 'attr_writer' for all class variables at one time?

I am using Ruby on Rails 3 and, since I have a declared a class with a lot of variables, I would declare all 'attr_reader' or 'attr_开发者_如何学运维writer' for those class variables at one time.

I tryed

class Persone
  attr_reader :all

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

but that doesn't work.


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


I thing you should use:

attr_accesor :name, :surname, ...

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

This way you get a setter and a getter in only one step, but you still have to enum all that variable names.


Take a look at Struct class:

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

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


The answer may be late, but late is better than never:

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


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


the instance_variable block had a typo in Chris Wouters example...

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜