あなたはより良い例でより良い運を持っているかもしれません。これを行う場合:
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+')
、2つではなく3つの内部配列が得られます。
これにはどのような理由が考えられますか?差分には3つの操作があります。
- 文字列を追加します。
- 文字列を削除します。
- 文字列を変更します。
変更は、実際には削除と追加の単なる組み合わせであるため、基本的な操作として削除と追加だけが残ります。これらは@action
値と非常にうまく一致しています。ただし、人間が差分を見るときは、変更を別個の操作として見たいので、「削除、追加」バージョンが実装の詳細b
になっていることを確認したいと思います。-
b
-
私たちが持っていたのがこれだけだった場合:
[
<@action="-", @position=1, @element="b">,
<@action="+", @position=1, @element="-">,
<@action="-", @position=4, @element="d">,
<@action="+", @position=4, @element="_">
]
+/-
次に、どのペアが実際に変更され、どちらが個別の追加と削除であったかを把握する必要があります。
したがって、内部配列は、2つの基本的な操作(add、remove )を、人間が見たい3つの操作(add、remove、change )にマップします。
これらからの出力の構造も調べてください。
Diff::LCS.diff('ab cd', 'a- x c_')
Diff::LCS.diff('ab', 'abx')
Diff::LCS.diff('ab', 'xbx')
の明示的な変更 @action
の方が良いと思いますDiff::LCS::Change
が、少なくとも内部配列を使用すると、個々の追加と削除をより高いレベルの編集にグループ化できます。