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

Contenido eliminado Contenido añadido
Sigmar (discusión | contribs.)
Sigmar (discusión | contribs.)
Línea 833:
stdout.printf("%s: %d\n", s, i);
}
</source>
 
En este ejemplo '''x''' es un argumento fijo para cumplir con los requisitos. La lista de argumentos se obtiene con el método '''va_list()'''. Después se puede ir obteniendo argumento tras argumento mediante el método '''arg(T)''' de la lista de argumentos, siendo '''T''' el tipo que debería ser el argumento. Si el tipo es evidente (como en el ejemplo anterior) se infiere automáticamente y se puede utilizar la llamada a '''arg()''' sin argumentos.
 
El siguiente ejemplo pasa un número indeterminado de cadenas de caracteres que se convierten en números reales ('''double'''):
 
<source lang=csharp>
void method_with_varargs(int fixed, ...) {
var l = va_list();
while (true) {
string? key = l.arg();
if (key == null) {
break; // fin de la lista y se sale del bucle infinito
}
double val = l.arg();
stdout.printf("%s: %g\n", key, val);
}
}
 
void main() {
method_with_varargs(42, "foo", 0.75, "bar", 0.25, "baz", 0.32);
}
</source>
 
En el ejemplo se comprueba que la cadena sea '''null''' para reconocer el final de la lista de parámetros. Vala pasa implícitamente el valor '''null''' como el último
argumento de la lista que reciben estos métodos.
 
Este forma de recibir listas de parámetros de tamaño indeterminado tiene un inconveniente que el programador debe tener en cuenta. El compilador no puede decirle al programador cuando se están pasando argumentos del tipo correcto al método y cuando no. Por este motivo el programador debe considerar el uso de estas listas sólo si tiene una buena razón para hacerlo y es imprescindible, por ejemplo: suministrar una función conveniente para los programadores de C que usen una biblioteca desarrollada en Vala. A menudo un argumento del tipo vector es una elección más acertada y segura.
 
Un patrón común para el uso de las listas de parámetros es esperar parejas de argumentos del tipo '''propiedad''' y '''valor''' a menudo referidas a gobject. En este caso se puede escribir '''propiedad : valor''', como en el siguiente ejemplo:
 
<source lang=csharp>
actor.animate (AnimationMode.EASE_OUT_BOUNCE, 3000, x: 100.0, y: 200.0, rotation_angle_z: 500.0, opacity: 0);
</source>
 
 
Este código de arriba sería equivalente al siguiente código fuente:
 
<source lang=csharp>
actor.animate (AnimationMode.EASE_OUT_BOUNCE, 3000, "x", 100.0, "y", 200.0, "rotation-angle-z", 500.0, "opacity", 0);
</source>