Diferencia entre revisiones de «Programación en Vala/Conceptos básicos del lenguaje»

Contenido eliminado Contenido añadido
Sigmar (discusión | contribs.)
Sigmar (discusión | contribs.)
Línea 709:
 
=== Métodos anónimos (Clausura/Closure) ===
 
Un método anónimo, también conocido como una expresión lambda, función literal o [http://es.wikipedia.org/wiki/Clausura_%28inform%C3%A1tica%29 clausura], puede ser definido usando el operador '''=>'''. La lista de parámetros se encuentran definidos en la parte de la izquierda del operador, mientras que el cuerpo del método se define a la derecha del operador.
 
Un método anónimo por si sólo no tiene sentido. Sólo es útil si se asignan directamente a una variable o a un tipo delegado o se pasa como argumento a otro método. Hay que darse cuenta de que ni los parámetros ni los tipos devueltos se dan explícitamente. En lugar de eso los tipos son inferidos de los parámetros que se usan con el tipo delegado. Ejemplo de asignación del método a una variable de tipo delegado:
 
<source lang=csharp>
delegate void PrintIntFunc(int a);
 
void main() {
PrintIntFunc p1 = (a) => { stdout.printf("%d\n", a); };
p1(10);
 
// Las llaves {} son opcionales si el cuerpo del método anónimo es de una línea
PrintIntFunc p2 = (a) => stdout.printf("%d\n", a);
p2(20):
}
</source>
 
Ejemplo de como se pasa un método anónimo a otro método
 
<source lang=csharp>
delegate int Comparator(int a, int b);
 
void my_sorting_algorithm(int[] data, Comparator compare) {
// ... el método 'compare' es llamado en alguna parte de este método ...
}
 
void main() {
int[] data = { 3, 9, 2, 7, 5 };
// Un método anónimo se pasa como segundo parámetro:
my_sorting_algorithm(data, (a, b) => {
if (a < b) return -1;
if (a > b) return 1;
return 0;
});
}
</source>
 
Los métodos anónimos son auténticas clausuras. Esto significa que pueden acceder a las variables locales del método exterior dentro de la expresión lambda. Ejemplo:
 
<source lang=csharp>
delegate int IntOperation(int i);
 
IntOperation curried_add(int a) {
return (b) => a + b; // 'a' es una variable externa
}
 
void main() {
stdout.printf("2 + 4 = %d\n", curried_add(2)(4));
}
</source>
 
En este ejemplo el método '''curried_add''' (ver [http://es.wikipedia.org/wiki/Currificaci%C3%B3n Currificación]) devuelve un método nuevo creado que mantiene el valor de '''a'''. Este método devuelto se llama con 4 como argumento, resultado de la suma de los dos números.
 
=== Estructuras ===