2012-08-13 33 views
5

tôi có phương pháp:Chấp nhận hoặc là một băm hoặc một mảng băm như các đối số đến một phương pháp của Ruby

def self.store(params) 
    params.each { } 
end 

Nó hoạt động hoàn hảo, nếu tôi vượt qua một mảng của Hashes:

params = [ { key: 'value' }, { key: 'value' } ] 

Tuy nhiên , Tôi có thể chỉ muốn chuyển một Hash duy nhất, thay vì một Array of Hashes:

params = { key: 'value' } 

Điều gì sẽ b e cách Ruby sạch nhất để chuyển đổi một Hash vào một mảng của Hashes?

Phương thức Array() là một loại đảm bảo, rằng mảng luôn được trả về, nhưng khi Hash được truyền, nó sẽ được chuyển đổi thành một mảng.

Array({ key: 'value' }) => [[:key, 'value']] 

Những gì tôi cần:

{ key: 'value' } => [ { key: 'value' } ] 

Có cách nào tốt đẹp để thực hiện điều này, hay tôi phải làm một kiểu thủ công kiểm tra với is_a (Array)?

Trả lời

6

Đối với tôi, giải pháp tốt nhất là thay đổi phương pháp để:

def self.store(*hashes) 
    params = hashes.flatten 
    puts params.inspect 
end 
  • Nếu bạn vượt qua một băm duy nhất, nó sẽ là một mảng
  • Nếu bạn vượt qua một mảng băm, nó vẫn giữ nguyên
  • Nếu bạn đặt N băm, nó sẽ nén tất cả các tham số thành một băm mảng chiều.

Bạn có thể chuyển bất kỳ thứ gì bạn muốn.

self.store({:key => 'value'}) # => [{:key => 'value'}] 
self.store({:key => 'value'}, {:foo => 'bar'}) # => [{:key => 'value'}, {:foo => 'bar'}] 
self.store([{:key => 'value'}, {:foo => 'bar'}]) # => [{:key => 'value'}, {:foo => 'bar'}] 
3

Hãy thử điều này

def self.store(params) 
    params = [params].flatten 
    ... 
end 
0

tôi sẽ làm điều đó như thế này:

def self.store(params) 
    (params.is_a?(Array) ? params : [params]).each {|single_hash| } 
end 
Các vấn đề liên quan