Bir const nesnesinin onu değiştiren bir işleve Dart'ta iletildiğini algılama

Aug 17 2020

Bu örneği ele alalım:

void modl(List<int> l) {
  l.add(90);
  print(l);
}

class Foo {
  final List<int> bar;
  const Foo(this.bar);

  @override
  String toString() => 'Foo{bar: $bar}';
}

void main() {
  var foo = const Foo([1,2,3,4]);
  modl(foo.bar);
  print (foo);
}

Bir yukarıdaki kod sonuçlarını Koşu çalışma zamanı Uncaught Error ama çıkarmadan constgelen

var foo = const Foo([1,2,3,4]);

çalışmasını sağlar.


Bu bana bir hata gibi geliyor çünkü const değişkeni değiştirilebiliyor ve dart bunu çalışma zamanında algılıyor, bu da bir const nesnesinin ne zaman değiştirildiğini algılayacak araçlara sahip olduğu anlamına geliyor, ancak bu, derleme zamanında tespit edilmemeli. const değişkenleri " derleme zamanı sabitleri " olarak adlandırılır .

Bu bir hata değilse, dartta bir constdeğişkenin bir işlem tarafından ne zaman değiştirilebileceğini derleme zamanında tespit etmemize izin veren herhangi bir şey var mı?

C ++ 'da, böyle bir şey yapmaya çalıştığımızda derleyici hata verir. Çalışma zamanında bu hatayla karşılaşmamak için Dart'ta yapabileceğimiz herhangi bir şey var mı?

Yanıtlar

3 lrn Aug 17 2020 at 04:53

Hayır. Dart const, nesne oluşturma ile ilgili bir derleme zamanı özelliğidir, ancak tür sistemine yansıtılmaz. Sabit olup olmadığını herhangi bir nesnenin türünden anlayamazsınız.

Genellikle bu bir problem değildir, çünkü const olabilen bir sınıfın bir örneği değiştirilemez. Derinlemesine değişmez olduğu garanti edilmez, ancak örneğin kendi alanları değiştirilemez.

Listeler, kümeler ve haritalar hem sabit hem de değiştirilebilir olabilir. Burada gördüğünüz şey bu. Liste değişkeni , listedeki değişmez değerdeki const Foo(const [1, 2, 3, 4])fazlalığı kaldırsanız bile sabittir const. Aynı soruna sahip olacaksınız new Foo(const [1, 2, 3, 4]), ki bu da değişmezdir foo.bar, ancak aksi takdirde ayırt edilemeyecektir new Foo([1, 2, 3, 4]). Tek gerçek fark, listenin değiştirilebilir olup olmadığıdır ve bunu tespit etmenin tek yolu onu değiştirmeye çalışmaktır.

Listeler, kümeler ve haritalar, denemek ve hatayı yakalamak dışında bunların değiştirilebilir olup olmadıklarını tespit etmek için herhangi bir yol sağlamaz.

C ++ ile karşılaştırıldığında, Dart'ın varlık kavramı constnesnenin bir özelliğidir veya gerçekten nesnenin yaratılma şeklidir. Bunun nesne için bazı sonuçları olabilir. Bir const Foo(..)sadece normal yaratır Foonesne, ancak yalnızca derinden iletmenin nesneleri oluşturabilir ve bunlar canonicalized edilir. A const [...]veya const {...}const olmayan değişmezden farklı türde bir liste / harita / küme oluşturur, ancak bu türden görünmez.

C ++ 'da varlık const, bir nesne referansının bir özelliğidir ve bu referansın nasıl kullanılabileceğini kısıtlar, ancak böyle sabit nesneler yoktur. Herhangi bir nesne constreferans olarak aktarılabilir .

İki kavram doğası gereği tamamen farklıdır ve sadece aynı adı kullanır (ve aynı zamanda her ikisi de JavaScript'ten farklıdır const).