2012-11-09 24 views
18

Tôi muốn sử dụng hàm băm tùy chọn làm đầu vào cho một phương thức trong Ruby, nhưng có cách nào để nhanh chóng đặt tất cả các biến cùng tên (nghĩa là có cùng tên) thay vì thiết lập riêng từng biến không?Đặt nhanh các biến mẫu bằng các tùy chọn băm trong Ruby?

Vì vậy, thay vì cách làm như sau:

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

là có một lớp lót sẽ gán mỗi tùy chọn đến trong băm vào biến có cùng tên?

+0

thể trùng lặp của (http://stackoverflow.com/ câu hỏi/9597249/in-ruby-can-i-tự động-populate-dụ-biến-bằng cách nào đó-in-the-initializ) – mydoghasworms

Trả lời

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

Cảm ơn, tôi chỉ tìm thấy điều này: http://stackoverflow.com/questions/9597249/in- ruby-can-i-tự động-populate-dụ-biến-bằng cách nào đó-in-the-initializ/10855962 đó là chính xác những gì bạn đang nói. Tôi sẽ đóng câu hỏi của tôi như là một bản sao, nhưng upvote câu trả lời của bạn. – mydoghasworms

+3

Làm trắng các phím sẽ là một bổ sung tốt, một vài giây để thiết lập danh sách trắng bây giờ có thể tiết kiệm thời gian của thời gian gỡ lỗi sau đó và giúp tài liệu giao diện như là một tác dụng phụ. –

3

này sẽ cung cấp cho bạn những gì bạn đang tìm kiếm:

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

Điều này chỉ hoạt động nếu bạn có phương thức 'setter' thông qua' attr_accessor', 'attr_writer' hoặc các phương thức' setter' được tạo thủ công – ptierno

1

bạn có thể làm điều này với,

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

hy vọng điều này giúp!

1

Bên cạnh giải pháp Casper, bạn cũng có thể sử dụng zucker đá quý: [? Trong Ruby tôi có thể tự động điền các biến dụ bằng cách nào đó trong phương thức khởi tạo]

instance_variables_from(opts) 
Các vấn đề liên quan