2011-12-11 19 views
8

me encontré con este trozo de código:¿Cómo funciona cualquier método en Groovy?

n = args[0] as Long 
[*n..1, n].any{ println ' '*it + '*'*(n - ~n - it*2) } 

Se utiliza para imprimir un formulario de árbol de la estructura. De esta manera:

* 
    *** 
    ***** 
******* 
    * 

(por n = 4)

  1. ¿Cómo el código [*n..1,n] producen [4, 3, 2, 1, 4]?

  2. ¿Cómo funciona el método any aquí? El Doc no me ayuda mucho. ¿Qué es un predictivo que se puede pasar al any (como se menciona en Doc)?

¿Cuál es el uso de any y cómo se maneja en este caso?

+2

@DownVoter: ¿por qué un voto a favor? 'any' mal en esta pregunta;)? –

Respuesta

10

Q1a: * "desempaqueta" una matriz. .. crea un rango. [] crea una colección.
Q1b: *n..1 desempaqueta [4,3,2,1] en sus partes individuales.
Q1c: [4,3,2,1,n] == [4,3,2,1,4]

P2: No sé por qué se utilizó any aquí; each funciona igual de bien, y tiene más sentido en contexto. anyhace lazo sobre la conexión, por lo que el efecto secundario println funciona según lo previsto.

Normalmente any se utilizaría para determinar si hay elementos de la colección encontraron con un criterio, por ejemplo:

[*n..1,n].any { it > 10 } // Returns false, no elements are > 10 
[*n..1,n].any { it == 3 } // Returns true, because at least one element is 3 

La última declaración del cierre se utiliza para determinar si cada elemento en cuestión cumple los criterios. println devuelve nulo, por lo que any devolverá falso. El valor no se usa y se descarta.

La única razón por la que puedo pensar que alguien podría haber usado any es para evitar ver el valor de retorno de each en la consola. each devuelve la colección original.

+1

Otra razón para haber usado '.any' es utilizar el menor número de caracteres en Code Golf Competition [Cómo imprimir un árbol de Navidad de altura N] (http: // codegolf.stackexchange.com/q/4244) –

+0

@ArturoHerrero: a partir de ahí solo se obtuvo el código;) –

3

1) n..1 se llama una gama literal, se crea un objeto de groovy.lang.Range que decrementa por 1 n-1. Esto entonces se combina en el contexto lista circundante utilizando la "Spread operator (*)"

2) el método any se define en DefaultGroovyMethods y es una función de predicado que devuelve verdadero si un elemento en una colección satisface el cierre predicado suministrado . En este ejemplo, el código no verifica el valor de retorno, por lo que el otro original podría haber producido el mismo resultado utilizando una llamada each en su lugar.

+0

gracias por la respuesta;) –

Cuestiones relacionadas