Ruby“diff-lcs”diff输出的一般格式是什么?

时间:2012-08-28 20:30:57

标签: ruby diff lcs

Ruby diff-lcs library可以很好地生成从一个序列到另一个序列所需的变更集,但输出的格式对我来说有点混乱。我希望有一个更改列表,但输出始终是一个包含一个或两个更改列表的列表。拥有多个变更列表的含义/意图是什么?

考虑以下简单示例:

> Diff::LCS.diff('abc', 'a-c')
# => [[#<Diff::LCS::Change:0x01 @action="-", @position=1, @element="b">,
#      #<Diff::LCS::Change:0x02 @action="+", @position=1, @element="-">],
#     [#<Diff::LCS::Change:0x03 @action="-", @position=3, @element="">]]

忽略the last change is blank的事实,为什么有两个更改列表而不是一个?

1 个答案:

答案 0 :(得分:3)

你可能会有一个更好的例子。如果你这样做:

Diff::LCS.diff('ab cd', 'a- c_')

然后输出看起来像这样(去除了噪音):

[
  [
    <@action="-", @position=1, @element="b">,
    <@action="+", @position=1, @element="-">
  ], [
    <@action="-", @position=4, @element="d">,
    <@action="+", @position=4, @element="_">
  ]
]

如果我们查看Diff::LCS.diff('ab cd ef', 'a- c_ e+'),那么我们将得到三个内部数组而不是两个。

可能的原因是什么? diff中有三个操作:

  1. 添加字符串。
  2. 删除字符串。
  3. 更改字符串。
  4. 更改实际上只是删除和添加的组合所以我们只剩下删除添加作为基本操作;这些符合@action值非常好。但是,当人们看到差异时,我们希望看到更改作为一个独特的操作,我们希望看到b变为-,“删除{{1 },添加b“版本是一个实现细节。

    如果我们只有这个:

    -

    然后你必须弄清楚哪些[ <@action="-", @position=1, @element="b">, <@action="+", @position=1, @element="-">, <@action="-", @position=4, @element="d">, <@action="+", @position=4, @element="_"> ] 对确实发生了变化,哪些是单独的添加和删除。

    因此内部数组将两个基本操作( add remove )映射到三个操作( add remove < / em>,改变)人类想要看到的。

    您可能还想检查这些输出的结构:

    • +/-
    • Diff::LCS.diff('ab cd', 'a- x c_')
    • Diff::LCS.diff('ab', 'abx')

    我认为Diff::LCS.diff('ab', 'xbx')的显式更改 @action会更好,但至少内部数组允许您将各个添加和删除分组到更高级别的编辑中