5

Rubydiff-lcsライブラリは、あるシーケンスから別のシーケンスに取得するために必要なチェンジセットを生成するという素晴らしい仕事をしますが、出力の形式は私には多少混乱します。変更のリストを期待しますが、代わりに、出力は常に1つまたは2つの変更のリストを含むリストになります。複数の変更リストを持つことの意味/意図は何ですか?

次の簡単な例を考えてみましょう。

> 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="">]]

最後の変更が空白であるという事実を無視すると、なぜ1つではなく2つの変更リストがあるのでしょうか。

4

1 に答える 1

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+')、2つではなく3つの内部配列が得られます。

これにはどのような理由が考えられますか?差分には3つの操作があります。

  1. 文字列を追加します。
  2. 文字列を削除します。
  3. 文字列を変更します。

変更は、実際には削除と追加の単なる組み合わせであるため、基本的な操作として削除追加だけが残ります。これらは@action値と非常にうまく一致しています。ただし、人間が差分を見るときは、変更を別個の操作として見たいので、「削除、追加」バージョンが実装の詳細bになっていることを確認したいと思います。-b-

私たちが持っていたのがこれだけだった場合:

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

+/-次に、どのペアが実際に変更され、どちらが個別の追加と削除であったかを把握する必要があります。

したがって、内部配列は、2つの基本的な操作(addremove )を、人間が見たい3つの操作(addremovechange )にマップします。

これらからの出力の構造も調べてください。

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

の明示的な変更 @actionの方が良いと思いますDiff::LCS::Changeが、少なくとも内部配列を使用すると、個々の追加と削除をより高いレベルの編集にグループ化できます。

于 2012-08-28T23:07:55.210 に答える