2011-02-25 30 views
4

我正在使用Ruby on Rails 3,並且,由於我聲明瞭一個包含很多變量的類,因此我會一次性爲這些類變量聲明所有'attr_reader'或'attr_writer'如何一次爲所有類變量創建'attr_reader'或'attr_writer'?

我tryed

class Persone 
    attr_reader :all 

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

,但不起作用。

+0

我假設'Persone'繼承自ActiveRecord?既然你使用的是Rails,看起來它會,但是你的摘錄並不反映這一點。 – 2011-02-25 07:40:37

+0

不,在這種情況下,不會從ActiveRecord繼承。 – user502052 2011-02-25 07:47:22

回答

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

Struct類請看:

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

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

我的事情,你應該使用:

attr_accesor :name, :surname, ... 

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

這樣你得到一個setter和在只有一步一個getter,但你還是要枚舉所有變量名稱。

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 
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 
0

的instance_variable塊曾在克里斯沃特斯例如一個錯字...

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