2012-03-07 16 views

cevap

14

Böyle instance_variable_set kullanabilirsiniz:

params.each do |key, value| 
    self.instance_variable_set("@#{key}".to_sym, value) 
end 
6

basit tutabilmek için: Örneğin:

ben olsaydı

class Weekend 
    attr_accessor :start_date, :end_date, :title, :description, :location 

    def initialize(params) 
  @start_date = params[:start_date] # I don't really know the structure of params but you have the idea 
    @end_date = params[:end_date] 
    end 
end 

Sen metaprogramlama bir bükülme ile daha akıllı şeyler yapabileceğini ancak bu gerçekten gerekli mi?

+0

ve işaretlemeyi bkz İşte bir örnek şımarık ... – apneadiving

+2

Gereksiz metaproglardan sakınma arzusunu anlıyorum, fakat bu OP'nin sorduğu özlü kod değil. Her alan adını manuel olarak belirtmeniz gerekir. – Kelvin

2

Ben Ruby bazen basit korkutucu olabilir

class Weekend 
    @@available_attributes = [:start_date, :end_date, :title, :description, :location] 
    attr_accessor *@@available_attributes 

    def initialize(params) 
    params.each do |key,value| 
     self.send(:"#{key}=",value) if @@available_attributes.include?(key.to_sym) 
    end 
    end 
end 
+0

Sınıf değişkeni yerine "AVAILABLE_ATTRIBUTES" sabiti ne dersiniz? – jhirsch

1

düşündürmektedir. Görünürde döngü yok!

Weekend = Struct.new(:start_date, :end_date, :title, :description, :location) do 
    def initialize(params) 
    # same as above 
    end 
end 

Testi:

weekend = Weekend.new(
    :start_date => 'start_date value', 
    :end_date => 'end_date value', 
    :title => 'title value', 
    :description => 'description value', 
    :location => 'location value' 
) 

p [:start_date , weekend.start_date ] 
p [:end_date , weekend.end_date ] 
p [:title  , weekend.title  ] 
p [:description, weekend.description ] 
p [:location , weekend.location ] 

Not yapar değil - hatta miras kullanmayı gerekmez

class Weekend < Struct.new(:start_date, :end_date, :title, :description, :location) 
    # params: Hash with symbols as keys 
    def initialize(params) 
    # arg splatting to the rescue 
    super(* params.values_at(* self.class.members)) 
    end 
end 

Not yeni Struct oluşturulması sırasında özelleştirilebilir aslında örnek değişkenleri ayarlayın. Sınıfınız opak alıcılara ve ayarlayıcılara sahip olacak. Bunları ifşa etmeyi tercih ederseniz, etrafınızdaki başka bir sınıfa sarılabilirsin.

# this gives you more control over readers/writers 
require 'forwardable' 
class Weekend 
    MyStruct = ::Struct.new(:start_date, :end_date, :title, :description, :location) 
    extend Forwardable 
    # only set up readers 
    def_delegators :@struct, *MyStruct.members 

    # params: Hash with symbols as keys 
    def initialize(params) 
    # arg splatting to the rescue 
    @struct = MyStruct.new(* params.values_at(* MyStruct.members)) 
    end 
end 
+0

thx. Bu şeyler yapmak için yaygın bir yakut yolu nedir? – BKSpurgeon

+0

@BKSpurgeon Ne kadar yaygın olduğunu bilmiyorum. Bir takım projesinde kullanmayı düşünüyorsanız, takımdan rahat olup olmadığını sormanızı öneririm. – Kelvin

2

Ben sadece almayı düşünecek:

Weekend < Struct.new(:start_date, :end_date, :title, :description, :location) 

Sonra birlikte haftasonu sınıfına başka bir şey ekleyin: Ben iphone dan yanıtlayan nefret

class Weekend 
#whatever you need to add here 
end 
+1

İki yıl önce, bir yıl önce aklımda olan cevabı veren birini bulmak için iki yıl önce gördüğüm bu soruyu cevaplamak için geri döndüm. (ama ben hafta dersini tercih ederim nurettin

İlgili konular