How to make "attr_reader" or "attr_writer" for all class variables in one go?

I use Ruby on Rails 3, and since I have a declared class with a lot of variables, I would declare all the attr_reader or attr_writer attributes for these class variables in one go.

I tried

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

but it does not work.

+4
source share
6 answers
 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 
+3
source

I want to use:

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

This way you get the setter and receiver in just one step, but you still need to list all the variable names.

+2
source

Take a look at the Struct class:

 Persone = Struct.new :name, :surname, :address p = Persone.new 'John', 'Smith', '12 Street 345' puts p.address 
+1
source

The answer may be belated, 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 
+1
source
 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 
0
source

variable block instance had a typo in Chris Waters example ...

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

Source: https://habr.com/ru/post/1341260/


All Articles