09. Vim : diccionarios II

Publicado por

En la nota anterior de esta serie te mostré qué son y cómo trabajar con diccionarios en Vimscript, en esta ocasión practicaremos algunas otras funcionalidades interesantes de estos.

Es posible recorrer el contenido de un diccionario, previa su conversión a lista. Para ello disponemos de tres funciones:

  • keys() devuelve las llaves del diccionario en forma de lista
  • values() devuelve los valores del diccionario en forma de lista
  • items() devuelve los elementos del diccionario en forma de lista

Digamos que tenemos un diccionario como el siguiente

:let usuario = {'nombre': 'Juan Pérez',
               \'apodo': 'juan',
               \'terminal': '/bin/bash',
               \'nacimiento': 2000}

Se puede iterar sobre las llaves:

:for propiedad in sort(keys(usuario))
:  echo propiedad . ': ' . usuario[propiedad]
:  endfor

Producirá una salida como esta:

apodo: juan
nacimiento: 2000
nombre: Juan Pérez
terminal: /bin/bash

En este caso, empleamos la función sort() para ordenar la lista de llaves obtenida con la función keys() para obtener una salida consistente. Recuerda que las llaves de un diccionario no conservan un orden en particular. En caso de que no te preocupe el orden, puedes omitir el ordenamiento. Una forma alternativa de iterar sobre el diccionario es utilizando la función items():

:for [propiedad, valor] in items(usuario)
:  echo propiedad . ': ' . valor
:  endfor

En este caso la función items() devuelve cada elemento del diccionario como una lista de dos elementos, el primer elemento corresponde a la llave y el segundo elemento al valor.

Si lo que quieres es solamente recuperar los valores del diccionario, la función que estás buscando es values()

:for valor in values(usuario)
:  echo 'valor: ' . valor
:  endfor

Ahora imagina que quieres actualizar algunos valores de un diccionario, por ejemplo, supongamos que hay que actualizar el nombre y terminal de nuestro usuario. Lo primero que se nos ocurre es hacer algo como esto:

:let usuario.nombre = 'Juan Pérez Pérez'
:let usuario.terminal = '/bin/zsh'

Sin embargo, esta solución aunque funciona, se vuelve poco práctica si necesitamos modificar un número más elevado de elementos del diccionario. Por fortuna, Vim nos proporciona la función extend() que nos ayuda a modificar y extender diccionarios:

:call extend(usuario, {'nombre': 'Juan Pérez Pérez', 'terminal': '/bin/zsh'})

Finalmente, y aunque no lo creas, es posible utilizar diccionarios para darle un toque orientado a objetos a tus scripts de Vim.

:function CalculaEdad() dict
:  let anio_actual = strftime('%Y')
:  return anio_actual - self.nacimiento
:  endfunction

Lo que hace diferente a la función CalculaEdad() es el atributo dict, y la referencia al diccionario: self. Cuando una función sea definida de esta forma, es posible utilizarla como método de un diccionario, simplemente agregando una referencia a esta en el diccionario.

:call extend(usuario, {'edad': function('CalculaEdad')})
:echo usuario.edad()
18

Nota como en lugar de utilizar el nombre de la función CalculaEdad, esta se invoca utilizando la llave con que está guardada la referencia en el diccionario.

Con esto, creo que ya tienes bastante material para jugar con los diccionarios, aplicando a estos lo que sepas de la programación orientada a objetos (tal vez no te esperabas eso). Ahora tal vez te estés preguntando: ¿qué es una referencia a función? Bueno, ese es un tema que me gustaría explicarte en la siguiente nota ¡Hasta entonces!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *