2009-09-09 3 views
1

J'ai une classe comme ceci:créer de nouveaux attributs de classe à partir d'informations en option sans specifiying les noms

class Item 
    attr_accessor :item_id, :name, :address, :description, :facilities, :ratings, :directions, :geo, :images, :video, :availability 

    def self.create options={} 
    item = Item.new 
    item.item_id = options[:item_id] 
    item.name = options[:name] 
    item.description = options[:desc] 
    item.ratings = options[:rating] 
    return item 
    end 

end 

Comment puis-je faire la méthode « créer » de telle manière à lire les options disponibles qui obtiennent passé et essayer de les créer sans avoir à spécifier leur nom explicitement?

ie. no item.name = options [: item_id] etc etc .... juste ... le cerveau de l'ordinateur pense "ah ... je vois l'option 'option [: nom], laissez-moi essayer de créer un attribut avec le même nom ! et cette valeur ... »

Répondre

1
class Item 
    attr_accessor :a, :b, :c 
    def initialize(options = {}) 
    options.each { 
     |k,v| 
     self.send("#{k.to_s}=".intern, v) 
    } 
    end 
end 

i = Item.new(:a => 1, :c => "dog") 
puts i.a 
# outputs: 1 
puts i.c 
# outputs: "dog" 

Si vous vous sentez particulièrement aventureux:

class Object 
    def metaclass; class << self; self; end; end 
end 

class Item 
    def initialize(options = {}) 
    options.each { 
     |k,v| 
     self.metaclass.send(:attr_accessor, k) 
     self.send("#{k.to_s}=".intern, v) 
    } 
    end 
end 

i = Item.new(:a => 1, :c => "dog") 
puts i.a 
# 1 
puts i.c 
# dog 

i2 = Item.new 
puts i2.a 
# ERROR 
+0

tu es mon meilleur ami! – holden

Questions connexes