Почему этот геттер внутри функции выдает синтаксическую ошибку?

В Dart Editor build 27025 следующий код выдает синтаксическую ошибку в строке, объявляющей геттер get x:

main() {
  var _x;
  set x(x) => _x = x; // This is okay
  get x => _x;        // Syntax error here
}

Обратите внимание, что сеттер set x не выдает ошибку. Это ошибка Dart Editor или я что-то не так делаю?


person Ganymede    schedule 06.09.2013    source источник
comment
Dart определяет геттеры и сеттеры как функции, поэтому их следует объявлять внутри других функций. Вот соответствующая спецификация языка: Функции включают объявления функций, методы, геттеры, сеттеры и функциональные литералы. ... Геттеры — это функции, которые используются для извлечения значений свойств объекта. ... Сеттеры — это функции, которые используются для установки значений свойств объекта.   -  person Ganymede    schedule 07.09.2013


Ответы (3)


Как вы сказали, геттеры — это функции, которые используются для извлечения значений свойств объекта, а сеттеры — это функции, которые используются для установки значений свойств объекта. В вашем примере кода _x не является свойством объекта.

спецификация показывает, что getterSignature и setterSignature разрешены только в классах и на верхнем уровне библиотек.

Единственное, что меня удивляет, это то, что ваш set не выдает синтаксической ошибки.

person Darshan Rivka Whittle    schedule 06.09.2013
comment
Из любопытства, как бы вы использовали геттеры и сеттеры в других изолятах? При использовании spawnFunction() для создания Isolate весь код этого изолята помещается в одну функцию, верно? Значит, вы не можете использовать там геттеры или сеттеры? - person Ganymede; 07.09.2013
comment
@Ganymede У меня еще не было возможности поиграть с изолятами, но я понимаю, что spawnFunction() принимает любую функцию верхнего уровня в качестве аргумента и порождает новый изолят, который начинает выполнение с этой функции. Эта функция может вызывать другие функции, ссылаться на классы, использовать геттеры и сеттеры для объектов и т. д. Нет причин пытаться впихнуть все, что использует функция, в тело функции. - person Darshan Rivka Whittle; 07.09.2013
comment
Вы можете поместить геттеры и сеттеры в библиотеки верхнего уровня, FWIW. - person Seth Ladd; 07.09.2013
comment
Вне статического контекста набор токенов рассматривается как обычная переменная. В вашем случае синтаксический анализатор рассматривает его как тип возвращаемого значения (и, например, Set на самом деле очень распространенный тип возвращаемого значения). Редактор (или любой другой анализатор) должен жаловаться, что тип set не найден. - person Florian Loitsch; 07.09.2013

Это интересно. Я думаю, что ошибка может быть в том, что он не жалуется на сеттер. Если вы удалите геттер и просто используете сеттер, он фактически не запустится. Или даже разобрать. Что, я думаю, означает, что они не разрешены внутри функции, хотя мне не сразу понятно, почему.

person Alan Knight    schedule 06.09.2013

Участник проекта Dart ответил на мой отчет об ошибке, что «недопустимо объявлять геттер или сеттер внутри другого метода или функции. Это можно увидеть, следуя грамматике оператора от localFunctionDeclaration до functionSignature.

Тем не менее, это ошибка, заключающаяся в том, что для установщика не было синтаксической ошибки».

person Ganymede    schedule 06.09.2013