这是使用细化并具有bang方法和块支持的递归合并的更好解决方案。 该代码确实可以在纯Ruby上运行。

module HashRecursive

refine Hash do

def merge(other_hash, recursive=false, &block)

if recursive

block_actual = Proc.new {|key, oldval, newval|

newval = block.call(key, oldval, newval) if block_given?

[oldval, newval].all? {|v| v.is_a?(Hash)} ? oldval.merge(newval, &block_actual) : newval

}

self.merge(other_hash, &block_actual)

else

super(other_hash, &block)

end

end

def merge!(other_hash, recursive=false, &block)

if recursive

self.replace(self.merge(other_hash, recursive, &block))

else

super(other_hash, &block)

end

end

end

end

using HashRecursive

执行Hash::each后,您可以使用默认的Hash::each_pair和true,就好像它们没有被修改一样。 您可以像以前一样通过这些方法使用块。

新事物是,您可以将布尔值Hash::each(第二个参数)传递给这些修改的方法,它们将递归合并哈希。

在此答案中写有简单用法的示例。 这是一个高级示例。

这个问题中的示例很糟糕,因为它与递归合并无关。 下一行将遇到问题的示例:

a.merge!(b) {|k,v1,v2| [v1, v2].all? {|v| v.is_a?(Array)} ? v1+v2 : v2}

让我给您一个更好的示例,以展示上面代码的力量。 想象两个房间,每个房间都有一个书架。 每个书架上有3行,每个书架上目前有2本书。 码:

room1 = {

:shelf => {

:row1 => [

{

:title => "Hamlet",

:author => "William Shakespeare"

}

],

:row2 => [

{

:title => "Pride and Prejudice",

:author => "Jane Austen"

}

]

}

}

room2 = {

:shelf => {

:row2 => [

{

:title => "The Great Gatsby",

:author => "F. Scott Fitzgerald"

}

],

:row3 => [

{

:title => "Catastrophe Theory",

:author => "V. I. Arnol'd"

}

]

}

}

我们将把书从第二个房间的架子上移到第一个房间的架子上的同一行。 首先,我们将在不设置Hash::each标志的情况下执行此操作,即与未修改的Hash::each_pair标志相同:

room1.merge!(room2) {|k,v1,v2| [v1, v2].all? {|v| v.is_a?(Array)} ? v1+v2 : v2}

puts room1

输出将告诉我们第一个房间的架子看起来像这样:

room1 = {

:shelf => {

:row2 => [

{

:title => "The Great Gatsby",

:author => "F. Scott Fitzgerald"

}

],

:row3 => [

{

:title => "Catastrophe Theory",

:author => "V. I. Arnol'd"

}

]

}

}

如您所见,没有Hash::each迫使我们扔掉了珍贵的书。

现在,我们将做同样的事情,但是将Hash::each标志设置为true。 您可以将Hash::each_pair或仅true作为第二个参数传递:

room1.merge!(room2, true) {|k,v1,v2| [v1, v2].all? {|v| v.is_a?(Array)} ? v1+v2 : v2}

puts room1

现在输出将告诉我们我们实际上已经移动了书本:

room1 = {

:shelf => {

:row1 => [

{

:title => "Hamlet",

:author => "William Shakespeare"

}

],

:row2 => [

{

:title => "Pride and Prejudice",

:author => "Jane Austen"

},

{

:title => "The Great Gatsby",

:author => "F. Scott Fitzgerald"

}

],

:row3 => [

{

:title => "Catastrophe Theory",

:author => "V. I. Arnol'd"

}

]

}

}

最后的执行可以重写如下:

room1 = room1.merge(room2, recursive=true) do |k, v1, v2|

if v1.is_a?(Array) && v2.is_a?(Array)

v1+v2

else

v2

end

end

puts room1

要么

block = Proc.new {|k,v1,v2| [v1, v2].all? {|v| v.is_a?(Array)} ? v1+v2 : v2}

room1.merge!(room2, recursive=true, &block)

puts room1

而已。 还可以在这里查看我的Hash::each(Hash::each_pair)的递归版本。

hash ruby 定义 嵌套_Ruby:合并嵌套哈希相关推荐

  1. hash ruby 定义 嵌套_【译】rails的嵌套属性(Nested Attributes)使用

    一个member有一些post class Member < ActiveRecord::Base has_many :posts accepts_nested_attributes_for : ...

  2. sql 执行计划 嵌套循环_性能调优–嵌套和合并SQL循环与执行计划

    sql 执行计划 嵌套循环 In this article, we will explore Nested and Merge SQL Loops in the SQL Execution plan ...

  3. scala 函数中嵌套函数_Scala函数–声明,定义,调用和嵌套函数

    scala 函数中嵌套函数 A function is a set of statements combined together to perform a specific task. The co ...

  4. C语言嵌套函数封装替换,函数可以嵌套定义但不能嵌套调用吗,嵌套函数

    函数可以嵌套定义但不能嵌套调用吗一个函数可以被定义为嵌套的,但不能被称为嵌套的吗,不对,函数可以嵌套调用,但不能嵌套定义.在C语言中,所有函数都是并行的,即定义函数时相互独立,一个函数不从属于另一个函 ...

  5. GlobalPointer:用统一的方式处理嵌套和非嵌套NER

    ©PaperWeekly 原创 · 作者|苏剑林 单位|追一科技 研究方向|NLP.神经网络 本文将介绍一个称为 GlobalPointer 的设计,它利用全局归一化的思路来进行命名实体识别(NER) ...

  6. Android中RecyclerView嵌套RecyclerView或嵌套ListView

    Android中RecyclerView嵌套RecyclerView或嵌套ListView

  7. lingo 嵌套@for或嵌套@sum

    嵌套@for或嵌套@sum 对集合中的i单独求和,例如集合Xij,求Xi1+Xi2+Xi3-+Xin sets: r/1..5:y; c/1..5/:; link(r,c):x; endsets @f ...

  8. AJPFX实例集合嵌套之ArrayList嵌套ArrayList

    案例: package com.heima.list; import java.util.ArrayList; import java.util.Iterator; import com.heima. ...

  9. python多个if_Python之条件判断/if嵌套/如何写嵌套代码

    一.条件判断 条件判断是计算机沟通的逻辑,其作用就是明确地让计算机知道:在什么条件下,该去做什么.对于Python也是同样.Python之所以能完成自动化任务,比如自动抓取网页关键词,自动下载小电影等 ...

  10. Excel简单宏定义(快速合并多个表格,合并多个工作表,合并特定工作表)

    文章目录 前言 具体操作 总结 前言 Excel简单宏定义(快速合并多个表格,合并多个工作表,合并特定工作表) 具体操作 合并当前工作簿下的所有工作表 Sub 合并当前工作簿下的所有工作表() On ...

最新文章

  1. DEDE-Function ereg_replace() is deprecated in ..line 2
  2. php5.6 开二级域名,PHP二级域名session共享方案
  3. PLSQL_Database Link的基本概念和用法(概念)
  4. 3章-字符串类型操作
  5. 【渝粤教育】国家开放大学2019年春季 3896人文英语1 参考试题
  6. 前端学习(1132):正则表达式学习目标
  7. .NET的委托和匿名函数应用一例
  8. 风控中的企业与个人数据有哪些核验维度
  9. TelPhoneManager中的常用方法和状态获取
  10. Triangle Generative Adversarial Networks
  11. 对数几率回归(Logistic Regression)
  12. 小程序布局中class='container'的bug
  13. 飞桨2.0高层api教程——使用BERT实现自动写诗
  14. 考研 计算机 跨专业,考研跨专业计算机 你需要满足这些条件
  15. 无路可逃java攻略_《生化危机2:重制版》幽灵生还者无路可逃流程攻略
  16. 将py文件打包成可exe文件
  17. android unity 瘦身,unity/unity3d编译成android apk包瘦身方法
  18. facade 门面模式和mediator 调停者
  19. g++的英文版使用说明和选项
  20. 为ibus输入法框架制作新世纪五笔码表

热门文章

  1. Go的package学习
  2. 【SICP练习】31 练习1.37
  3. 寻找自己的道路——与技术同胞共勉 一种划分为七个阶段的道路:自信=意志=布局=切入点=团队=渠道=产品...
  4. 关于作者(《蓝调口琴指南》名作拙译)
  5. 3. wordpress 固定链接
  6. 57. mysqli 扩展库(4)
  7. 大气辐射示意简单图_地理笔记 | N21 自然地理——大气的组成与垂直分层
  8. css中的background的几个属性(background-attachment/background-origin,background-clip等)
  9. 文字在div中的垂直居中问题 div在页面中的水平垂直居中问题 vertical-align ??????
  10. 2018.07.09 顺序对齐(线性dp)