接受散列或哈希数组作为Ruby方法的参数

krn*_*krn 7 ruby ruby-on-rails

我有方法:

def self.store(params)
  params.each { }
end
Run Code Online (Sandbox Code Playgroud)

如果我传递一个哈希数组,它可以很好地工作:

params = [ { key: 'value' }, { key: 'value' } ]
Run Code Online (Sandbox Code Playgroud)

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

params = { key: 'value' }
Run Code Online (Sandbox Code Playgroud)

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

Array()方法是一种确保始终返回数组的方法,但是当传递Hash时,它会被转换为数组本身.

Array({ key: 'value' }) => [[:key, 'value']]
Run Code Online (Sandbox Code Playgroud)

我需要的:

 { key: 'value' } => [ { key: 'value' } ]
Run Code Online (Sandbox Code Playgroud)

有没有很好的方法来实现它,或者我是否必须使用is_a?(Array)进行手动类型检查?

mig*_*mba 8

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

def self.store(*hashes)
  params = hashes.flatten
  puts params.inspect
end
Run Code Online (Sandbox Code Playgroud)
  • 如果传递单个哈希,它将是一个数组
  • 如果传递一组哈希值,它将保持不变
  • 如果您使用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'}]
Run Code Online (Sandbox Code Playgroud)