4

このようにコマンドをチェーンしたい:

var cmdGroups = []*commands.CmdGroup {
    commands.MakeCmdGroup("foo", cmd1, cmd2, cmd3).AddConstraint(cmd1, cmd2).AddConstraint(cmd2, cmd1, cmd3),
    commands.MakeCmdGroup("bar", cmd1, cmd4).AddConstraint(cmd1, cmd4),
}

列の長さを 80 にするためにチェーンを複数の行に分割したいのですが、Go ではこれをコンパイルできません。

var cmdGroups = []*commands.CmdGroup {
    commands.MakeCmdGroup("foo", cmd1, cmd2, cmd3)
            .AddConstraint(cmd1, cmd2)
            .AddConstraint(cmd2, cmd1, cmd3),
    commands.MakeCmdGroup("bar", cmd1, cmd4)
            .AddConstraint(cmd1, cmd4),
}

私に何ができる ?

4

2 に答える 2

9

FUZxxl が指摘したように、問題はセミコロンの自動挿入です。仕様は次のように述べています。

入力がトークンに分割されると、行の最後のトークンが

  • 識別子
  • 整数、浮動小数点、虚数、ルーン、または文字列リテラル
  • break、continue、fallthrough、return のいずれかのキーワード
  • 演算子と区切り記号 ++、--、)、]、または } のいずれか

関数呼び出しがある)ため、行末にセミコロンが追加されます。

自動セミコロン変換を回避するには、次のいずれかの方法で呼び出しを記述できます。

.セミコロンの代わりに使用します。

x.
Method(p1,p2,p3)

関数の前ではなく、パラメーター リストの先頭でブレークします。

x.Method(
   p1,p2,p3, // , at the end is important to prevent semicolon insertion
)

上記のメソッドが気に入らない場合は、(go1.1 の時点で) メソッドを第一級市民として扱い、より短いショートカットを一時的に作成できます。

f = x.Method
f(p1,p2,p3).f(p3,p4,p5)

この例では十分に考えていません。の戻り値には member がないためf(...).f(...)、もちろん不可能です。を再割り当てする必要があります。だからあなたはそれから何も得ません。fff

于 2013-04-17T20:28:12.040 に答える
1

私はおそらく次のいくつかの変形を書くでしょう:

var cmdGroups = []*commands.CmdGroup{
                commands.MakeCmdGroup(
                        "foo", cmd1, cmd2, cmd3,
                ).AddConstraint(
                        cmd1, cmd2,
                ).AddConstraint(
                        cmd2, cmd1, cmd3,
                ),
                commands.MakeCmdGroup(
                        "bar", cmd1, cmd4,
                ).AddConstraint(cmd1, cmd4),
}

ただし、このような長いセレクター演算子チェーンは、慣用的なコードではあまり見られません。(標準ライブラリは、慣用的なコードへの非公式なガイドだと考えています)。おそらく、このコードの設計/構造には弱点があるかもしれません。

于 2013-04-17T20:25:58.293 に答える