Symbol în Dart

Un nume de identificator (metodă, câmp, parametru) păstrat ca valoare; se scrie #nume.

Sintaxă
const Symbol(String name)
// literal: #nume

Ce face Symbol

Un Symbol reprezintă numele unui membru din program, nu valoarea lui. Literalul #salveaza este simbolul pentru numele salveaza. Același simbol se poate crea și cu constructorul Symbol('salveaza'); cele două sunt egale.

Simbolurile apar în locurile în care Dart lucrează cu nume de membri ca date: parametrii numiți din Function.apply ({#rotunjit: true}) și Invocation.memberName din noSuchMethod.

Spre deosebire de texte, numele din simbolurile literale rămân corecte și după ce un compilator scurtează (minifică) numele din cod, de exemplu la compilarea pentru web. În codul de zi cu zi le folosești rar.

Parametri

Parametru Descriere
name Numele identificatorului.

Exemple

Exemplul 1: Literal și constructor

void main() {
  var s1 = #salveaza;
  const s2 = Symbol('salveaza');
  print(s1);
  print(s1 == s2);
  print(#salveaza == #sterge);
  print(s1.runtimeType);
}

Rezultat

Symbol("salveaza")
true
false
Symbol

Exemplul 2: Parametri numiți dați ca simboluri

String salut(String nume, {String limba = 'ro', bool formal = false}) {
  var baza = limba == 'ro' ? (formal ? 'Bună ziua' : 'Salut') : 'Hello';
  return '$baza, $nume!';
}

void main() {
  print(Function.apply(salut, ['Ana']));
  print(Function.apply(salut, ['domnule Popescu'], {#formal: true}));
  print(Function.apply(salut, ['Mihai'], {#limba: 'en'}));
}

Rezultat

Salut, Ana!
Bună ziua, domnule Popescu!
Hello, Mihai!

Greșeli frecvente

  • Folosești texte în loc de simboluri: Function.apply(f, [], {'formal': true}) nu compilează; cheile trebuie să fie Symbol: {#formal: true}.

Comenzi înrudite

  • Function.apply: Apelează o funcție cu argumente date ca listă (poziționale) și Map (numite), construite în timpul rulării.
  • Object.noSuchMethod: Metoda apelată când se cere unui obiect o metodă sau proprietate pe care nu o are (prin dynamic).