En Dart, Symbol representa un identificador o nombre en tiempo de ejecución. Los símbolos permiten referirse a nombres de variables, métodos o propiedades en forma de cadena sin tener que mencionarlos directamente, lo cual es útil para hacer introspección (o "reflection") en el código, como invocar métodos dinámicamente o acceder a propiedades sin conocerlas en tiempo de compilación.
Un Symbol es un objeto que representa el nombre de una variable, función o propiedad. En Dart, los Symbol se crean usando el prefijo #, como #nombreDeMetodo. Este tipo de dato es útil en conjunto con la biblioteca dart:mirrors, que permite la introspección en Dart (aunque dart:mirrors no está soportado en Flutter). Los Symbol son una forma eficiente de representar nombres en tiempo de ejecución sin depender de strings, evitando colisiones de nombres.
Para crear un Symbol, simplemente usa el prefijo # antes del nombre:
Symbol simbolo = #miVariable;
En este ejemplo, #miVariable es un Symbol que representa el identificador miVariable.
Puedes crear símbolos para representar identificadores y compararlos.
void main() {
Symbol simbolo1 = #miVariable;
Symbol simbolo2 = #miVariable;
Symbol simbolo3 = #otraVariable;
print(simbolo1 == simbolo2); // Imprime: true
print(simbolo1 == simbolo3); // Imprime: false
}
En este ejemplo, simbolo1 y simbolo2 representan el mismo identificador y, por lo tanto, son iguales. simbolo3 representa un identificador diferente.
Aunque Symbol suele usarse con introspección, también es útil en estructuras de datos como mapas para acceder a propiedades de manera dinámica.
class Persona {
String nombre;
int edad;
Persona(this.nombre, this.edad);
}
void main() {
Persona persona = Persona("Carlos", 25);
Map<Symbol, dynamic> propiedades = {
#nombre: persona.nombre,
#edad: persona.edad,
};
print("Nombre: ${propiedades[#nombre]}"); // Imprime: Nombre: Carlos
print("Edad: ${propiedades[#edad]}"); // Imprime: Edad: 25
}
En este ejemplo, se utiliza Symbol como clave en un mapa para acceder a las propiedades de persona de manera dinámica.
dart:mirrors
Si tienes acceso a dart:mirrors (no disponible en Flutter), puedes usar Symbol para invocar métodos o acceder a propiedades de un objeto en tiempo de ejecución.
import 'dart:mirrors';
class Calculadora {
int sumar(int a, int b) => a + b;
}
void main() {
Calculadora calculadora = Calculadora();
Symbol metodo = #sumar;
InstanceMirror mirror = reflect(calculadora);
var resultado = mirror.invoke(metodo, [5, 3]).reflectee;
print("Resultado de la suma: $resultado"); // Imprime: Resultado de la suma: 8
}
Aquí, Symbol representa el nombre del método sumar y se usa con dart:mirrors para invocarlo dinámicamente.
Puedes convertir un Symbol a String utilizando su método toString(), aunque el resultado incluirá caracteres adicionales (Symbol("...")).
void main() {
Symbol simbolo = #miPropiedad;
String nombre = simbolo.toString();
print("Nombre del símbolo: $nombre"); // Imprime: Symbol("miPropiedad")
}
Symbol son únicos, lo que reduce la probabilidad de colisiones de nombres en estructuras de datos.
Para más detalles sobre Symbol, consulta la documentación oficial de Dart.
Jorge García
Fullstack developer