7

我有方法:

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

如果我传递一个哈希数组,它会完美运行:

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

但是,我可能只想传递一个散列,而不是散列数组:

params = { key: 'value' }

将哈希转换为哈希数组的最干净的 Ruby 方法是什么?

Array() 方法可以确保始终返回一个数组,但是当传递 Hash 时,它本身会转换为一个数组。

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

我需要的:

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

有什么好的方法来实现这个,还是我必须使用 is_a 进行手动类型检查?(数组)?

4

3 回答 3

8

对我来说,最好的解决方案是将方法更改为:

def self.store(*hashes)
  params = hashes.flatten
  puts params.inspect
end
  • 如果您传递单个哈希,它将是一个数组
  • 如果你传递一个哈希数组,它保持不变
  • 如果你传递 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'}]
于 2012-08-13T19:19:33.000 回答
3

试试这个

def self.store(params)
  params = [params].flatten
  ...
end
于 2012-08-13T17:48:58.293 回答
0

我会这样做:

def self.store(params)
  (params.is_a?(Array) ? params : [params]).each {|single_hash| }
end
于 2017-08-30T15:04:30.037 回答