2017-09-27 46 views
1

我想仅使用块参数解构嵌套数据结构。在红宝石块中嵌套的命名参数解构

数据(简化本示例)是这样的:

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 

,但我喜欢有它在块参数,因为它呼吁我的优雅代码感。有任何想法吗?

回答

2

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

+0

我会离开一般案例让别人思考,谢谢! – inopinatus