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