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 listavalues()
devuelve los valores del diccionario en forma de listaitems()
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!