2012-11-09 16 views
18

Ruby'de bir yönteme girdi olarak bir karma seçeneği kullanmak istiyorum, ancak her biri tek tek ayarlamak yerine tüm adlarını (yani aynı ada sahip) hızla ayarlamanın bir yolu var mı?Örnek değişkenleri Ruby'de seçenekler karma ile hızlıca ayarlanıyor mu?

Yani yerine yapıyor şu: Aynı isimde değişkene karma her gelen seçeneği atar tek astar

class Connection 
    def initialize(opts={}) 
    @host  = opts[:host] 
    @user  = opts[:user] 
    @password = opts[:password] 
    @project = opts[:project] 
    # ad nauseum... 

var mı?

+0

olası yinelenen (http://stackoverflow.com/ sorular/9597249/ruby-can-i-otomatik-populate-instance-değişkenler-bir şekilde-in-the-initializ) – mydoghasworms

cevap

43
def initialize(opts={}) 
    opts.each { |k,v| instance_variable_set("@#{k}", v) } 
end 
+0

Teşekkürler, sadece şunu buldum: http://stackoverflow.com/questions/9597249/in- ruby-can-i-otomatik-populate-instance-variable-bir şekilde-in-the-initializ/10855962 tam olarak ne diyorsun. Sorumu bir kopya olarak kapatacağım, ama cevabınızı dile getireceğim. – mydoghasworms

+3

Anahtarların beyaz listeye eklenmesi iyi bir ek olacaktır, böylece beyaz listeyi kurmak için birkaç saniye sonra hata ayıklama saatlerini kaydedebilirsiniz ve arabirimi bir yan etki olarak belgelemeye yardımcı olabilirsiniz. –

3

Bu aradığınız ne vermelidir: Bu yardımcı olur

def initialize(opts={}) 
    opts.each_pair do |key, value| 
    send("#{key}=",value) 
    end 
end 
+1

Bu yalnızca “attr_accessor”, “attr_writer” veya “setter” yöntemleriyle “setter” yöntemleriniz varsa çalışır. – ptierno

1

sen ile yapabilirsiniz,

@host, @user, @password, @project = opts[:host], opts[:user], opts[:password], opts[:project] 

umut!

1

Casper'ın çözümü yanında, zucker mücevher kullanabilirsiniz: [? Ruby otomatik olarak initialize yönteminde nasılsa örnek değişkenleri doldurabilirsiniz] arasında

instance_variables_from(opts) 
İlgili konular