Volver a la página principal
jueves 31 octubre 2024
8

Cómo usar Symbol en Dart

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.

¿Qué es Symbol en Dart?

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.

Sintaxis básica de Symbol

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.

Ejemplos de uso de Symbol en Dart

Crear y comparar símbolos

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.

Uso de Symbol con mapas para acceder a propiedades dinámicamente

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.

Symbol con introspección en 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.

Convertir Symbol a String

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")
}

Ventajas de usar Symbol en Dart

  • Introspección: Permite referirse a nombres en tiempo de ejecución para operaciones dinámicas.
  • Evita colisiones: Los Symbol son únicos, lo que reduce la probabilidad de colisiones de nombres en estructuras de datos.
  • Eficiencia: Representan nombres de forma más eficiente que las cadenas de texto en ciertos contextos.

Referencia oficial

Para más detalles sobre Symbol, consulta la documentación oficial de Dart.

Etiquetas:
dart
Compartir:
Creado por:
Author photo

Jorge García

Fullstack developer