Diferencia entre revisiones de «Programación en Vala/Funcionalidades avanzadas del lenguaje»

Contenido eliminado Contenido añadido
Sigmar (discusión | contribs.)
Sin resumen de edición
Invadibot (discusión | contribs.)
m Bot: Arreglando enlaces a proyectos Wikimedia y aplicando direcciones URL de protocolo relativo
Línea 35:
</source>
 
Vala soporta las funcionalidades básicas de el [http[:m:w://es.wikipedia.org/wiki/:Dise%C3%B1o_por_Contrato |diseño por contrato]]. Un método puede tener precondiciones ('''requires''') y postcondiciones ('''ensures''') que deben ser satisfechos al principio o al final de un método respectivamente:
 
<source lang=csharp>
Línea 252:
Implementa: '''Iterable <Entry<K,V>>''', '''Map <K,V>'''
 
Es un mapa en relación 1 a 1 de elementos de tipo '''K''' a elementos de tipo '''V'''. El mapeo se hace mediante el cálculo de un valor [http[:m:w://es.wikipedia.org/wiki/:Hash |hash]] para 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.
 
Se puede pasar opcionalmente una función de hash y un comparador al constructor de la siguiente forma:
Línea 449:
$ valac --thread threading-sample.vala
 
Esto incluirá las bibliotecas necesarias e inicializará el sistema de hilos cuando sea posible. El programa se ejecutará ahora sin producirse fallos de [http[:m:w://es.wikipedia.org/wiki/:Violación_de_acceso |violación de acceso]], pero no se comportará como se espera. Sin un conjunto de bucles, el programa terminará cuando el hilo principal (el que ha sido creado con la función principal) finalice. Para controlar este comportamiento, se puede permitir cooperar a los hilos entre sí. Esto se puede realizar mediante los bucles de eventos y las colas asíncronas, pero en esta introducción a los hilos se mostrará las posibilidades básicas de los hilos.
 
Es posible para un hilo comunicarle al sistema que ahora no necesita ejecutarse, y por lo tanto sugerir que sea otro hilo el que debería ejecutarse en lugar del primero, esto se realiza mediante el método estático '''Thread.yield()'''. Si esta sentencia se coloca al final del método '''main''' definido arriba, el sistema de ejecución pausará la ejecución del hilo principal por un instante y comprobará si hay otros hilos que pueden ejecutarse, encontrando el hilo creado recientemente en un estado de pausa y a la espera de ejecución, y ejecutará el nuevo hilo hasta la finalización del mismo, y el programa tendrá el comportamiento esperado. Sin embargo, no hay garantía de que esto pase así. El sistema tiene potestad para decidir cuando ejecuta los hilos, y de esta forma podría no permitir que el nuevo hilo termine antes de que el hilo principal es reiniciado y el programa finalice.
Línea 636:
</source>
 
Después de la sentencia '''yield'''; el resultado se puede devolver. De manera implícita, se puede realizar con un '''AsyncResult''' en el método '''callback'''. El método '''calback''' se parece mucho al concepto de [http[:m:w://en.wikipedia.org/wiki/:Continuation |continuación]] en ciertos lenguajes de programación (por ejemplo [http[:m:w://es.wikipedia.org/wiki/:Scheme |Scheme]]) salvo que en Vala representa el contexto inmediatamente posterior a la sentencia '''yield'''.
 
El método '''end()''' es la sintaxis que se usa para el método '''_finishi'''. Toma un '''AsyncResult''' y devuelve el resultado real o lanza una excepción (si el método asíncrono lo hace). La llamada se realiza en el '''callback''' del método asíncrono de una forma similar a la siguiente:
Línea 646:
== Referencias débiles ==
 
La gestión de memoria en Vala se basa en el [http[:m:w://es.wikipedia.org/wiki/:Conteo_de_referencias |conteo automático de referencias]]. Cada vez que un objeto se asigna a una variable su contador de referencias se incrementa en 1, cada vez que una variable, la cual referencia un objeto, sale del ámbito; su contador interno de referencias se decrementa en 1. Si el contador de referencias alcanza el valor 0 el objeto será liberado (el bloque de memoria que contiene ese objeto será liberado).
 
Sin embargo, es posible formar un ciclo de referencias con las estructuras de datos que el programador defina. Por ejemplo, con una [http[:m:w://es.wikipedia.org/wiki/:%C3%81rbol_%28inform%C3%A1tica%29 |estructura de árbol]] de datos dónde un nodo hijo mantiene una referencia a su padre y viceversa, o una [http[:m:w://es.wikipedia.org/wiki/:Lista_%28inform%C3%A1tica%29#Lista_Doblemente_Enlazada |lista doblemente enlazada]] dónde cada elemento mantiene una referencia a su predecesor y el predecesor mantiene una referencia a su sucesor.
 
En estos casos los objetos podrían mantenerse vivos simplemente referenciándose unos a otros, a pesar de que deberían ser liberados. Para romper este ciclo de referencias se pueden usar el modificador '''weak''' para una de las referencias:
Línea 901:
</source>
 
Vala tiene soporte para los operadores de punteros que se usan en C, es decir, el operador '''dirección de (&)''' y el operador '''[http[:m:w://es.wikipedia.org/wiki/:Indirecci%C3%B3n |indirección]] (*)'''. El primer operador obtiene la dirección de memoria de un objeto y el segundo obtiene el propio objeto a partir de un puntero (se usa para acceder al contenido del objeto):
 
<source lang=csharp>
Línea 926:
Las clases que no hereden en ningún nivel de GLib.Object son tratadas como un caso especial. Estas clases derivan directamente desde el sistema de tipos de GLib y por lo tanto son más ligeras (en uso de recursos).
 
Un caso obvio de este tipo de clases son algunos de los [http[:m:w://es.wikipedia.org/wiki/:Binding |Binding]] a la biblioteca GLib. Puesto que la biblioteca GLib hace un trabajo a más bajo nivel que GObject, la mayoría de las clases que se definen en el binding son de este tipo. Como se ha comentado anteriormente, estas clases son más ligeras, lo cual las haces útiles en algunos casos (por ejemplo en el uso del propio compilador de Vala). Sin embargo, el uso de este tipo de clases no es muy habitual por lo que no se tratará en este documento.
 
== Perfiles ==