2013-04-17 3 views
3

Я хочу команды цепи таким образом:Как вы связываете команды на нескольких строках?

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), 
} 

Что делать?

+2

Кажется, что автоматическая точка с запятой кусает вас здесь. Попробуйте вместо этого переместить точки в конец строки. – fuz

+3

http: //play.golang.org/p/PfKEIo3zlG <- вот так – fuz

+0

@FUZxxl, это прекрасно, спасибо! – Fabien

ответ

8

Как указал FUZxxl, ваша проблема заключается в автоматической вставке точек с запятой. Спецификация говорит:

Когда вход разбиваются на лексемы, точка с запятой автоматически вставляется в поток токенов в конце непустой строки, если конечный маркер в линии составляет

  • идентификатор
  • целого число с плавающей точкой, воображаемая, руну или строку буквальный
  • один из ключевых слов, перерыв, продолжить, проваливается, или вернуть
  • один из операторов и разделителей ++, -,),] или}

У вас есть вызов функции, которая подсчитывает для ) поэтому точка с запятой добавляется в конце строки ,

Чтобы обойти автоматическое преобразование точку с запятой, вы можете написать свои вызовы в одном из следующих способов:

Используйте . вместо запятой:

x. 
Method(p1,p2,p3) 

Перерыв после начала списка параметров вместо перед тем, function:

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) 

Я не думал достаточно с этим примером. f(...).f(...), конечно, невозможно, так как возвращаемое значение f не имеет ни одного члена f. Нужно переписать f. Таким образом, вы ничего не получаете от этого.

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), 
} 

Однако такие длинные селектор оператора сети не следует рассматривать в идиоматических код слишком часто. (Я считаю стандартную библиотеку неофициальным руководством по идиоматическому коду). Возможно, в этой конструкции/структуре кода может быть некоторая слабость.

+2

Хотя это работает, мне нравится версия, предложенная FUZxxl лучше. Цепочка используется в 'math.big' в стандартной библиотеке. – nemo

Смежные вопросы