ruby块中嵌套的命名参数解构

时间:2017-09-27 00:45:53

标签: ruby

我想仅使用块参数来构造嵌套数据结构。

数据(本例简化)如下:

response = [
  ["James", { species: "cat", age: "4" }],
  ["Sandy", { species: "dog", age: "7" }],
  ["Horse", { species: "man", age: "34" }]
]

我只能使用块参数找不到有效解构的语法。我想象可能是这样,将嵌套数组解构样式与命名关键字参数结合起来:

response.map do |name, (species:, age:)|
  "#{name}: #{species}, #{age}"
end

但是这会产生语法错误。

显然,有很多其他方法可以提取必要的数据,例如使用非嵌套关键字参数:

response.map do |name, data|
  proc { |species:, age:|
    "#{name}: #{species}, #{age}"        
  }.(data)
end

response.map do |name, data|
  species, age = data.values_at(:species, :age)
  "#{name}: #{species}, #{age}"        
end

或非常明显的

response.map do |name, data|
  "#{name}: #{data[:species]}, #{data[:age]}"
end

但是我喜欢在块参数中使用它,因为它吸引了我对优雅代码的感觉。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

|name, species:, age:|有效(因为处理关键字参数的方式)。它显然不适用于一般情况,但由于关键字参数的工作方式,最后一个元素是散列的数组干净地对应于参数列表。