2013-09-06 6 views
1

В Dart Editor построить 27025, следующий код выдает ошибку синтаксиса на линии объявляющего геттер get x:Почему этот getter внутри функции создает синтаксическую ошибку?

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

Обратите внимание, что связующий set x не вызывает ошибку. Является ли это ошибкой в ​​редакторе Дарта или я делаю что-то неправильно здесь?

+0

Dart определяет геттеры и сеттеры как функции, поэтому они должны быть декларируемыми внутри других функций. Вот спецификация родственного языка: ** Функции включают объявления функций, методы, геттеры, сеттеры и литералы функций. ... Getters - это функции, которые используются для извлечения значений свойств объекта. ... Setters - это функции, которые используются для установки значений свойств объекта. ** – Ganymede

ответ

2

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

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

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

+0

Из любопытства, как бы вы использовали геттеры и сеттеры в других изолятах? При использовании 'spawnFunction()' для создания 'Isolate', все, что изолирует код, входит в одну функцию, правильно? Значит, вы не можете использовать геттеры или сеттеры? – Ganymede

+1

@Ganymede У меня еще не было возможности играть с изолятами, но я понимаю, что 'spawnFunction()' принимает любую функцию верхнего уровня в качестве своего аргумента и порождает новую изоляцию, которая начинает выполнение с этой функцией. Эта функция может вызывать другие функции, ссылаться на классы, использовать геттеры и сеттеры на объектах и ​​т. Д. Нет причин пытаться перерезать все функции, используемые в теле функции. –

+3

Вы можете поместить геттеры и сеттеры в библиотеки верхнего уровня, FWIW. –

0

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

0

Участник проекта Дарт ответил на мой отчет об ошибке: «Недействительно объявлять геттер или сеттер внутри другого метода или функции. Это можно увидеть, следуя грамматике для выражения для локального элемента FunctionDeclaration для функцииSignature

Тем не менее, это ошибка, из-за которой синтаксическая ошибка для сеттера. "