Почему конкатенация строк, возвращаемых из функции, является пустой строкой - Groovy 1.7.4

У меня есть следующий код:

public class TestGr
{
  static String aaa = "wwww";

  public static void main(args)
  {
    println "["+getAAA()+"]";
    println "[" + getBBB() +"]";
  }

  static String getAAA()
  {
    return ""
    + "${aaa}"
  }

  static String getBBB()
  {
     return "" + "${aaa}" 
  }
}

Выход этого кода:

[]
[wwww]

Я не понимаю, почему при первом вызове я получаю пустую строку. Кто-нибудь знает, почему разрыв строки меняет вывод функции?

1 ответ

Решение

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

getAAA () анализируется как два оператора, например:

static String getAAA() {
    return "";
    +"${aaa}";
}

Хотя одинарный + оператор не имеет смысла со строковым аргументом, groovy не может его поймать из-за его динамической природы. Там может быть postive() мета-метод на строку, которая сделает его действительным.

РЕДАКТИРОВАТЬ:

Для лучшего представления о том, что происходит, начните groovyConsole и загрузите ваш скрипт. Выберите "Проверить AST" в меню "Сценарий". Вы увидите что-то вроде этого:

AST Browser Image

Другие вопросы по тегам