fLua

Lua 增量修改和合并库
授权协议 MIT
开发语言 C/C++ Lua
所属分类 开发工具、 程序调试工具
软件类型 开源软件
地区 国产
投 递 者 程瑞
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

fLua 是 Lua的增量修改和合并库,同时支持纯Lua和CPP。

使用

纯Lua使用

参考pure_lua_test.lua中的示例,运行方式:

lua pure_lua_test.lua

原始table为:

local src = {
    a = 1,
    b = "2",
    c = 3.3,
    d = true,
    sub = {
        a = 11,
        b = "22",
        c = 33.3,
        d = true,
    },
    array = { 1, 2, 3, 4 },
    obj_array = {
        { id = 1, a = 1, b = 2 },
        { id = 2, a = 3, b = 4 },
        { id = 3, a = 5, b = 6 },
        { id = 4, a = 7, b = 8 },
    }
}

新的table为:

local dst = {
    b = "2",
    c = 3.4,
    d = false,
    sub = {
        a = 12,
        b = "11",
    },
    array = { 2, 3 },
    obj_array = {
        { id = 2, a = 3, b = 4 },
        { id = 3, a = 5, b = 6 },
        { id = 4, a = 70, b = 80 },
    }
}

计算diff:

local diff = lua_diff(src, dst, get_id)

注意:这里的get_id,是用来针对obj_array中的每个元素,获取其唯一标识的函数。目的是为了尽量减少大Obj数组的diff差异。这里的示例中,我们假设obj_array中的每个元素都有一个id字段,用来唯一标识该元素,所以get_id函数就是:

local get_id = function(v)
    return v.id
end

当然,如果obj_array中的元素没有id字段,那么get_id函数就可以返回nil,这样就会对obj_array进行全量diff,这样的话,diff结果就会比较大。

最终的diff结果为:

{
    ['d'] = false,
    ['c'] = 3.4,
    ['sub'] = {
        ['b'] = '11',
        ['a'] = 12,
        ['__diff_lua_del'] = {
            [1] = 'd',
            [2] = 'c'
        }
    },
    ['obj_array'] = {
        [4] = {
            ['b'] = 80,
            ['a'] = 70
        },
        ['__diff_lua_array'] = true,
        ['__diff_lua_del'] = {
            [1] = 1
        }
    },
    ['array'] = {
        [1] = 2,
        [2] = 3,
        ['__diff_lua_del'] = {
            [1] = 3,
            [2] = 4
        }
    },
    ['__diff_lua_del'] = {
        [1] = 'a'
    }
}

然后可以将diff应用到原始table上,得到新的table:

local new_dst = lua_patch(src, diff, get_id)

最终新的table与dst是相等的,注意这里obj_array里的元素顺序不一定是完全一致的

{
	['b'] = '2',
	['d'] = false,
	['c'] = 3.4,
	['obj_array'] = {
		[1] = {
			['b'] = 4,
			['a'] = 3,
			['id'] = 2
		},
		[2] = {
			['b'] = 6,
			['a'] = 5,
			['id'] = 3
		},
		[3] = {
			['b'] = 80,
			['a'] = 70,
			['id'] = 4
		}
	},
	['array'] = {
		[1] = 2,
		[2] = 3
	},
	['sub'] = {
		['b'] = '11',
		['a'] = 12
	}
}

纯CPP使用

参考main.cpp中的pure_cpp_test函数,使用和算法与Lua版本一样。计算diff:

#include "diff_lua.h"

auto diff = CalDiff(src, dst, get_id, new_func);

输出结果diff与Lua一致,然后patch:

auto new_dst = PatchDiff(src, diff, get_id, new_func);

最终new_dst与dst是相等的

CPP+Lua混合使用

参考main.cpp中的mix_cpp_test函数和mix_cpp_test.lua,在Lua中调用CPP计算diff:

local libdifflua = require("libdifflua")
local diff = libdifflua.cal_diff(src, dst, _G.lua_get_id, _G.lua_new_func)

CPP会把Lua table转成内置数据结构,计算diff,然后再转回Lua Table。

Lua调用CPP进行patch:

lualocal new_dst = libdifflua.patch_diff(src, diff, _G.lua_get_id, _G.lua_new_func)

最终new_dst与dst是相等的

 相关资料
  • 我已经解决了如何合并两个XML文件并修改匹配的属性。 我现在正在努力解决如果file1中不存在file2节点,如何添加file2节点(基于属性名) 这是我拥有的xsl文件: 我找到了如何使用XSLT合并两个xml文件,但无法解决如何将提议解决方案应用于我的xsl。有人能帮忙吗?

  • 合并 在执行pull之后,进行下一次push之前,如果其他人进行了推送内容到远程数据库的话,那么你的push将被拒绝。 这种情况下,在读取别人push的变更并进行合并操作之前,你的push都将被拒绝。这是因为,如果不进行合并就试图覆盖已有的变更记录的话,其他人push的变更(图中的提交C)就会丢失。 合并的时候,Git会自动合并已有的变更点!不过,也存在不能自动合并的情况。在下一个页面,我们会为大

  • 1、从内部增加和修改类属性 来,我们先来温习一下类的结构。 看着这个结构,提一个问题,如何修改类属性,也就是类里面的变量? 从类结构来看,我们可以猜测,从类方法来修改,也就是从类内部来修改和增加类属性。 看下具体的实例: 这里还是强调一下,例子还是要自己多写,不要只看,自己运行, 看效果。多想。 2、从外部增加和修改类属性 我们刚刚看了通过类方法来修改类的属性,这时我们看下从外部如何修改和增加类属

  • 我正在从一个可观察的列表中设置一个ListView,该列表有另一个集合的输入(在本例中是一个链表)。因此,我在这个答案中找到了如何使列表视图的项从中移除(我不太确定它们是否也从ObservableList中移除),那么还有什么可能的方法可以在两个集合(即ObservableList和原始集合)中进行修改呢? 下面是一段代码:

  • 说明 用于对商品新增/修改操作 请求地址 http://api.dc78.cn/Api/mall_set_commodity 请求方式 POST 请求参数 GET参数 参数名称 必填 描述 范例 commodity_id 商品编号 新增时为空,修改时commodity_id,ext_code二选一 1123 ext_code 外部商品编码 新增时为空,修改时commodity_id,ext_cod

  • 问题内容: 我正在用Java创建一个多线程聊天。当用户u1向用户u2发送消息但未连接用户u2时,用户u1将消息发送至服务器,而用户u2一旦连接至服务器,便会收到该消息。未发送的消息将添加到ArrayList中。连接用户后,他会检查自己是否是未决邮件的收件人。如果是,则将邮件发送给他,然后将其从待处理邮件列表中删除。这是我的方法: 这就是我得到的: 我如何解决它?是因为我正在使用迭代器吗? 问题答案

  • 在线demo: https://codesandbox.io/s/el-table-he-bing-xing-de-hover-wen-t... 效果1:鼠标悬停在第一行的时候,跟悬停第二行一样,只高亮右侧(或者每一行都高亮合并行) 效果2:鼠标悬停在合并行的时候,触发所有行的高亮

  • 在 《教程 - 和别人分享改变》一节, 我们学会了如何与其他人共享变更. 但是因为(0.7 版本开始) Import" 不能正确的处理通过邮件发送的合并, 我们要演示如何从其他做了不兼容变更的仓库用拖合并。 首先, 我们必须创建合并的目标. 我们再次 Clone" my-hello的仓库: $ cd .. $ hg clone my-hello my-hello-desc 我们给 hello.c