Direcci€n de par„metros
Un m•todo en Vala puede recibir cero o m‚s par‚metros. El comportamiento por defecto cuando se llama a un Un m•todo en Vala puede recibir cero o m‚s par‚metros. El comportamiento por defecto cuando se llama a un m•todo es el siguiente:
m•todo es el siguiente:
‡‡‡‡ CualqCualquier par‚muier par‚metro que sea un tipo pasaetro que sea un tipo pasado por valor se copia a una diredo por valor se copia a una direcci€n loccci€n local al m•todo cuaal al m•todo cuando se ejecundo se ejecuta.ta. ‡‡‡‡ CualqCualquier par‚uier par‚metro de timetro de tipo referpo referencia no se coencia no se copia, en lupia, en lugar de esto se pagar de esto se pasa una refesa una referencia arencia al m•todo qul m•todo que see se
ejecuta. ejecuta.
Este comportamiento se puede modificar utilizando para ello los modificadores de par‚metros
Este comportamiento se puede modificar utilizando para ello los modificadores de par‚metros refref yy outout. Hay cuatro. Hay cuatro combinaciones posibles dependiendo de si el programador utiliza estos modificadores en la llamada al m•todo o en combinaciones posibles dependiendo de si el programador utiliza estos modificadores en la llamada al m•todo o en la definici€n del mismo:
la definici€n del mismo:
‡‡ outout utilizado en la llamada al m•todo: se pasar‚ una variable no inicializada al m•todo y se puede esperar que est•utilizado en la llamada al m•todo: se pasar‚ una variable no inicializada al m•todo y se puede esperar que est• inicializada despu•s de que el m•todo finalice la ejecuci€n.
inicializada despu•s de que el m•todo finalice la ejecuci€n.
‡‡ outout utilizado en la definici€n del m•todo: el par‚metro se considera no inicializado y el programador tendr‚ queutilizado en la definici€n del m•todo: el par‚metro se considera no inicializado y el programador tendr‚ que inicializarlo.
inicializarlo.
‡‡ refref utilizado en la llamada al m•todo: la variable que se pasa al m•todo tiene que ser inicializada y puede serutilizado en la llamada al m•todo: la variable que se pasa al m•todo tiene que ser inicializada y puede ser modificada dentro del m•todo.
‡‡ refref utilizado en la definici€n del m•todo: el par‚metro se considera que est‚ inicializado y puede ser modificadoutilizado en la definici€n del m•todo: el par‚metro se considera que est‚ inicializado y puede ser modificado dentro del m•todo.
dentro del m•todo. Ejemplo:
Ejemplo:
void
void method_1method_1((intint a, a, outout intint b, b, refref intint c) { ... } c) { ... } void
void method_2method_2(Object o,(Object o, outout Object p, Object p, refref Object q) { ... } Object q) { ... }
Estos m•todos definidos en el ejemplo de arriba podr‚n ser llamados de las siguientes formas: Estos m•todos definidos en el ejemplo de arriba podr‚n ser llamados de las siguientes formas:
int
int a = a = 11;; int
int b; b; int
int c = c = 33;; method_1(a,
method_1(a, outout b, b, refref c); c);
Object o =
Object o = newnew Object(); Object(); Object p;
Object p; Object q =
Object q = newnew Object(); Object(); method_2(o,
method_2(o, outout p, p, refref q); q);
El tratamiento que se les va a dar a las variables ser‚ el siguiente: El tratamiento que se les va a dar a las variables ser‚ el siguiente:
‡‡‡‡ La variabLa variable "a" es de tiple "a" es de tipo valor. El vao valor. El valor ser‚ coplor ser‚ copiado a una poiado a una posici€n de msici€n de memoria nemoria nueva y locaueva y local al m•todol al m•todo, y por, y por lo tanto los cambios realizados dentro del m•todo no afectar‚n al valor original de la misma.
lo tanto los cambios realizados dentro del m•todo no afectar‚n al valor original de la misma.
‡‡ La variaLa variable "b" eble "b" es de tipo vs de tipo valor tamalor tambi•n, pbi•n, pero se ha pero se ha pasado masado medianediante el modte el modificadificadoror outout. En este caso, el valor no. En este caso, el valor no es copiado, en lugar de esto se pasa una referencia (puntero) al valor original, y por lo tanto cualquier cambio de es copiado, en lugar de esto se pasa una referencia (puntero) al valor original, y por lo tanto cualquier cambio de la variable en el m•todo se reflejar‚ en el valor original.
la variable en el m•todo se reflejar‚ en el valor original.
‡‡‡‡ La variabLa variable "c" se tratle "c" se trata de la misma foa de la misma forma que "b"rma que "b", con la †nica sa, con la †nica salvedalvedad de que se ha se ha se„ad de que se ha se ha se„alado clalado claramentramentee en el m•todo.
en el m•todo.
‡‡‡‡ La variabLa variable "o" es de tiple "o" es de tipo refereno referencia. El m•tcia. El m•todo reciodo recibe una refebe una referencirencia con el mismo oba con el mismo objeto que cjeto que cuando se reuando se realizaaliza la llamada. El m•todo puede cambiar el objeto, pero el cambio no ser‚ visible para el c€digo que ha llamado al la llamada. El m•todo puede cambiar el objeto, pero el cambio no ser‚ visible para el c€digo que ha llamado al m•todo.
m•todo.
‡‡ La variaLa variable "p" eble "p" es de tipo rs de tipo refereneferencia, pecia, pero pasadro pasada mediaa mediante el monte el modificadificadordor outout. Esto significa que el m•todo. Esto significa que el m•todo recibir‚ un puntero a la referencia del objeto. El m•todo puede reemplazar la referencia con otro referencia a otro recibir‚ un puntero a la referencia del objeto. El m•todo puede reemplazar la referencia con otro referencia a otro objeto distinto, y cuando el m•todo finalice su ejecuci€n el c€digo que ha llamado al m•todo obtendr‚ un objeto objeto distinto, y cuando el m•todo finalice su ejecuci€n el c€digo que ha llamado al m•todo obtendr‚ un objeto totalmente distinto. Cuando se use este tipo de par‚metro si el m•todo no reasigna la referencia entonces se totalmente distinto. Cuando se use este tipo de par‚metro si el m•todo no reasigna la referencia entonces se establece a
establece a nullnull al finalizar la ejecuci€n del m•todo.al finalizar la ejecuci€n del m•todo.
‡‡ La variabLa variable "q" es de nuele "q" es de nuevo del mismvo del mismo tipo que la anto tipo que la anterior. En eerior. En este caso se manste caso se maneja comeja como "p" con una imo "p" con una importanportantete diferencia, ya que el m•todo puede elegir modificarla o no la referencia, y puede acceder al objeto al que
diferencia, ya que el m•todo puede elegir modificarla o no la referencia, y puede acceder al objeto al que referencia. Vala se asegurar‚ que la instancia "q" apunte a cualquier objeto, y por lo tanto no sea
referencia. Vala se asegurar‚ que la instancia "q" apunte a cualquier objeto, y por lo tanto no sea nullnull cuando secuando se entra en el m•todo.
Colecciones
Colecciones
La biblioteca de funciones Gee
La biblioteca de funciones Gee [2][2] es una biblioteca de colecciones escrita en Vala. Las clases deber…an resultares una biblioteca de colecciones escrita en Vala. Las clases deber…an resultar familiares a los desarrolladores que han usado bibliotecas como la JFC (Java's Foundation Classes). Gee est‚ familiares a los desarrolladores que han usado bibliotecas como la JFC (Java's Foundation Classes). Gee est‚ formado por un conjunto de interfaces y distintos tipos de datos que se implementan de distintas formas.
formado por un conjunto de interfaces y distintos tipos de datos que se implementan de distintas formas.
Si se desea usar Gee en una aplicaci€n, es necesario instalar la biblioteca en el sistema de forma separada. Se puede Si se desea usar Gee en una aplicaci€n, es necesario instalar la biblioteca en el sistema de forma separada. Se puede obtener Gee desde el enlace
obtener Gee desde el enlace [2][2]. Para usar la biblioteca es necesario compilar el programa usando la opci€n. Para usar la biblioteca es necesario compilar el programa usando la opci€n --pkg gee-1.0
--pkg gee-1.0..
Los tipos de datos m‚s †tiles son: Los tipos de datos m‚s †tiles son:
‡‡‡‡ Listas: CoListas: Coleccilecciones ordeones ordenadas de elnadas de elementementos, acceos, accesibles posibles por un …ndice nur un …ndice num•ricm•rico.o. ‡‡‡‡ ConjunConjuntos: Ctos: Coleccolecciones iones de elde elementoementos distis distintos dntos desordeesordenadas.nadas.
‡‡‡‡ Mapas (DicMapas (Diccionacionarios): Colrios): Coleccioecciones de elemennes de elementos desordetos desordenados, acnados, accesiblcesibles por un …ndice de tipo arbes por un …ndice de tipo arbitrariitrario.o. Todas las listas y conjuntos en la biblioteca implementan la interfaz
Todas las listas y conjuntos en la biblioteca implementan la interfaz CollectionCollection, y todos los mapas la interfaz, y todos los mapas la interfaz MapMap.. Las listas implementan as…mismo la interfaz
Las listas implementan as…mismo la interfaz ListList mientras que los conjuntos implementan la interfazmientras que los conjuntos implementan la interfaz SetSet. Estas. Estas interfaces comunes significan no s€lo que todas las colecciones son de un tipo similar y que pueden ser usadas de interfaces comunes significan no s€lo que todas las colecciones son de un tipo similar y que pueden ser usadas de manera intercambiable, sino que las colecciones nuevas pueden ser escritas usando las mismas interfaces, y por lo manera intercambiable, sino que las colecciones nuevas pueden ser escritas usando las mismas interfaces, y por lo tanto usando c€digo ya existente.
tanto usando c€digo ya existente.
Tambi•n es com†n a todas las colecciones la interfaz
Tambi•n es com†n a todas las colecciones la interfaz IterableIterable. Esto significa que cualquier objeto de esta categor…a. Esto significa que cualquier objeto de esta categor…a puede ser iterado mediante los m•todos est‚ndar de la interfaz, o directamente mediante la sint‚xis de Vala, usando puede ser iterado mediante los m•todos est‚ndar de la interfaz, o directamente mediante la sint‚xis de Vala, usando foreach
foreach..
Todas las clases e interfaces usan tipos gen•ricos. Esto significa que deben ser instanciadas con un tipo particular o Todas las clases e interfaces usan tipos gen•ricos. Esto significa que deben ser instanciadas con un tipo particular o conjunto de tipos que van a contener. El sistema se asegurar‚ de que s€lo los tipos especificados puedan a„adirse a conjunto de tipos que van a contener. El sistema se asegurar‚ de que s€lo los tipos especificados puedan a„adirse a una colecci€n, y que cuando los objetos se extraigan desde una colecci€n se devuelvan con ese tipo.
una colecci€n, y que cuando los objetos se extraigan desde una colecci€n se devuelvan con ese tipo.
ArrayList<G>
ArrayList<G>
Implementa:
Implementa: Iterable <G>Iterable <G>,, Collection <G>Collection <G>,, List <G>List <G>.. Es una lista ordenada de elementos del tipo
Es una lista ordenada de elementos del tipo GG implementada por un vector que crece de forma din‚mica. Este tipo esimplementada por un vector que crece de forma din‚mica. Este tipo es muy r‚pido para acceder a los datos, pero potencialmente lento cuando se insertan elementos en cualquier posici€n muy r‚pido para acceder a los datos, pero potencialmente lento cuando se insertan elementos en cualquier posici€n que no sea al final, o al insertar elementos cuando el vector ya est‚ lleno (y hay por tanto que redimensionarlo). que no sea al final, o al insertar elementos cuando el vector ya est‚ lleno (y hay por tanto que redimensionarlo). Ejemplo:
Ejemplo:
using
using GeeGee;;
static
static intint mainmain ( (stringstring[] args) {[] args) { var
var list list == newnew ArrayList< ArrayList<intint> ();> (); // Se crea un arraylist de enteros// Se crea un arraylist de enteros
list.
list.add add ( (11);); // Se aƒade un elemento al final// Se aƒade un elemento al final
list. list.add add ( (22);); list. list.add add ( (55);); list. list.add add ( (44);); list.insert
list.insert ((22,, 33);); // Se inserta el elemento '2' en la posici‚n// Se inserta el elemento '2' en la posici‚n
'3'
'3'
list.remove
list.remove_at _at ((33);); // Se elimina el elemento de la posici‚n '3'// Se elimina el elemento de la posici‚n '3'
// Se recorre todo el vector
// Se recorre todo el vector
foreach
foreach ( (intint i i inin list) { list) { stdout.print
stdout.printf f (("%d\n""%d\n", i);, i); }
list[
list[22] =] = 1010;; // Se obtiene el mismo// Se obtiene el mismo
resultado que con
resultado que con ''''''list.list.setset ( (22,, 1010))''''''
stdout.print
stdout.printf f (("%d\n""%d\n", list[, list[22]);]); // Se obtiene el mismo// Se obtiene el mismo
resultado que con
resultado que con ''''''list.list.getget ( (22))''''''
return
return 00;; }
}
Para compilar este programa se tiene que ejecutar algo similar a lo que aparece en la siguiente l…nea de comandos: Para compilar este programa se tiene que ejecutar algo similar a lo que aparece en la siguiente l…nea de comandos:
valac programa_gee.vala --pkg gee-1.0 valac programa_gee.vala --pkg gee-1.0
Como se puede ver en el c€digo de arriba lo primero que se hace es crear el objeto de tipo
Como se puede ver en el c€digo de arriba lo primero que se hace es crear el objeto de tipo ArrayListArrayList de tipo enterode tipo entero lo cual se especifica entre los s…mbolos de menor y mayor. Despu•s se usa el m•todo
lo cual se especifica entre los s…mbolos de menor y mayor. Despu•s se usa el m•todo addadd para a„adir un elemento alpara a„adir un elemento al final de la colecci€n. Esta insercci€n es r‚pido en comparaci€n con la insercci€n de un elemento en una posici€n final de la colecci€n. Esta insercci€n es r‚pido en comparaci€n con la insercci€n de un elemento en una posici€n determinada de la lista; algo que se consigue mendiante el uso del m•todo
determinada de la lista; algo que se consigue mendiante el uso del m•todo insertinsert, al que se le pasa el elemento y la, al que se le pasa el elemento y la posici€n. Se cuenta con el m•todo
posici€n. Se cuenta con el m•todo remove_atremove_at que se usa para eliminar un elemento en una posici€n determinada,que se usa para eliminar un elemento en una posici€n determinada, indicando la posici€n como par‚metro. Se ve como se puede recorrer toda la lista mediante el uso de la construcci€n indicando la posici€n como par‚metro. Se ve como se puede recorrer toda la lista mediante el uso de la construcci€n foreach
foreach. Por †ltimo se como es posible acceder a la lista mediante el uso de la sintaxis de vector indicando la. Por †ltimo se como es posible acceder a la lista mediante el uso de la sintaxis de vector indicando la posici€n entre corchetes. Esta sint‚xis se puede usar tanto para acceder como modificar el valor de una posici€n posici€n entre corchetes. Esta sint‚xis se puede usar tanto para acceder como modificar el valor de una posici€n determinada. Para m‚s informaci€n sobre las listas se puede consultar la API de Vala al respecto en [3].
determinada. Para m‚s informaci€n sobre las listas se puede consultar la API de Vala al respecto en [3].
HashMap<K,V>
HashMap<K,V>
Implementa:
Implementa: Iterable <Entry<K,V>>Iterable <Entry<K,V>>,, Map <K,V>Map <K,V> Es un mapa en relaci€n 1 a 1 de elementos de tipo
Es un mapa en relaci€n 1 a 1 de elementos de tipo KK a elementos de tipoa elementos de tipo VV. El mapeo se hace mediante el c‚lculo de. El mapeo se hace mediante el c‚lculo de un valor hash
un valor hash [4][4]para cada llave, esto puede ser modificado mediante el uso de punteros a funciones para el c‚lculopara cada llave, esto puede ser modificado mediante el uso de punteros a funciones para el c‚lculo de funciones de hash y funciones que comprueben la igualdad de las claves de una forma concreta.
de funciones de hash y funciones que comprueben la igualdad de las claves de una forma concreta. Se puede pasar opcionalmente una funci€n de hash y un comparador al constructor de la siguiente forma: Se puede pasar opcionalmente una funci€n de hash y un comparador al constructor de la siguiente forma:
var map =
var map = newnew Gee.HashMap<Foo, Object>(foo_hash, foo_equal); Gee.HashMap<Foo, Object>(foo_hash, foo_equal);
Ejemplo: Ejemplo:
using
using GeeGee;;
static
static intint mainmain ( (stringstring[] args) {[] args) { var
var map map == newnew HashMap< HashMap<stringstring,, intint> ();> ();
map.
map.setset ( ("one""one",, 11););
map.
map.setset ( ("two""two",, 22););
map.
map.setset ( ("three""three",, 33););
map[
map["four""four"] =] = 44;; // same as map.set ("four", 4)// same as map.set ("four", 4)
map[
map["five""five"] =] = 55;;
stdout.printf(
stdout.printf("%d\n""%d\n", , map['four']map['four']);); foreach
foreach ( (stringstring key key inin map.keys) { map.keys) { stdout.print
stdout.printf f (("%d\n""%d\n", map[key]);, map[key]); // same as map.get (key)// same as map.get (key)
} }
return
} }
Este programa se compila de la misma forma que el anterior. El programa define inicialmente un mapa
Este programa se compila de la misma forma que el anterior. El programa define inicialmente un mapa mapmap queque tendr‚n claves de tipo cadena y valores de tipo entero. Estos mapas puede definir valores de tuplas mediante el tendr‚n claves de tipo cadena y valores de tipo entero. Estos mapas puede definir valores de tuplas mediante el m•todo
m•todo setset de los objetos o mediante la sint‚xis de corchetes. As… se puede usar tambi•n el m•todode los objetos o mediante la sint‚xis de corchetes. As… se puede usar tambi•n el m•todo getget para obtenerpara obtener un valor dado una clave o mediante la sint‚xis de los corchetes. Para m‚s informaci€n sobre este tipo de colecciones un valor dado una clave o mediante la sint‚xis de los corchetes. Para m‚s informaci€n sobre este tipo de colecciones se puede consultar la API en [5].
se puede consultar la API en [5].
HashSet<G>
HashSet<G>
Implementa:
Implementa: Iterable <G>Iterable <G>,, Collection <G>Collection <G>,, Set <G>Set <G> Un conjunto de elementos del tipo
Un conjunto de elementos del tipo GG que no est•n repetidos. Los elementos duplicados se detectan calculando unque no est•n repetidos. Los elementos duplicados se detectan calculando un valor resumen (hash) para cada clave, esto puede modificarse pasando un m•todo que calcule el resumen y un valor resumen (hash) para cada clave, esto puede modificarse pasando un m•todo que calcule el resumen y un m•todo que compruebe la igualdad de una forma espec…fica. Esto se realiza de la misma forma que con un mapa de m•todo que compruebe la igualdad de una forma espec…fica. Esto se realiza de la misma forma que con un mapa de tipo
tipo HashMapHashMap.. Ejemplo: Ejemplo:
using
using GeeGee;;
static
static intint mainmain ( (stringstring[] args) {[] args) { var
var my_set my_set == newnew HashSet< HashSet<stringstring> ();> ();
my_set.
my_set.add add ( ("one""one"););
my_set.
my_set.add add ( ("two""two"););
my_set.
my_set.add add ( ("three""three"););
my_set.
my_set.add add ( ("two""two");); // No se podr• aƒadir por que ya est•// No se podr• aƒadir por que ya est•
en el conjunto en el conjunto