Когда const необязателен в Dart 2? - PullRequest
0 голосов
/ 30 сентября 2018

В Dart Object () конструктор объявлен как const , поэтому:

identical(const Object(), const Object()); //true

Я знаю, что в Dart 2 ключевое слово const является необязательным, и я подумалчто предыдущее утверждение было эквивалентно:

identical(Object(), Object()); //false

Но на самом деле оно, кажется, эквивалентно:

identical(new Object(), new Object()); //false

Теперь мои сомнения:

1) Когда const необязательное ключевое слово?

2) Есть ли способ обеспечить постоянство экземпляров моих классов без ключевого слова const ?Так что я могу получить:

indentical(MyClass(), MyClass()); //true (is it possible?)

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

Dart 2 позволяет вам пропустить new везде.Везде, где вы раньше писали new, теперь вы можете его опустить.

Dart 2 также позволяет вам пропустить const в позициях, где это подразумевается контекстом.Эти позиции:

  • Внутри const создания объекта, литерала карты или списка (const [1, [2, 3]]).
  • Внутри создания объекта const в метаданных (@Foo(Bar()))
  • В выражении инициализатора переменной const (const x = [1];).
  • В выражении регистра переключателя (case Foo(2):...).

Есть два других местоположениягде язык требует константных выражений, но которые не становятся автоматически постоянными (по разным причинам):

  1. Значения необязательного параметра по умолчанию
  2. выражения инициализатора конечных полей в классах с constКонструкторы

1 не сделаны константными, потому что мы хотим оставить возможность сделать так, чтобы эти выражения не были константами в будущем.2, потому что это нелокальное ограничение - нет ничего вокруг выражения, которое означает, что оно должно быть константным, поэтому слишком просто, например, удалить const из конструктора, не заметив, что оноизменяет поведение инициализатора поля.

0 голосов
/ 30 сентября 2018

const необязательно в const контексте .В основном, const context создается, когда выражение должно быть const, чтобы избежать ошибки компиляции.

В следующем фрагменте вы можете увидеть место, где const является необязательным:

class A {
  const A(o);
}

main(){
  // parameters of const constructors have to be const
  var a = const A(const A());
  var a = const A(A());

  // using const to create local variable 
  const b = const A();
  const b = A();

  // elements of const lists have to be const
  var c = const [const A()];
  var c = const [A()];

  // elements of const maps have to be const
  var d = const {'a': const A()};
  var d = const {'a': A()};
}

// metadatas are const
@A(const A())
@A(A())
class B {}

Более подробную информацию можно найти в Необязательный new / const и Неявное создание .

...