Skip to content

Instantly share code, notes, and snippets.

@jonatasemidio
Last active June 26, 2016 13:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jonatasemidio/ed4081ed043c7d241cc746e08a213ed3 to your computer and use it in GitHub Desktop.
Save jonatasemidio/ed4081ed043c7d241cc746e08a213ed3 to your computer and use it in GitHub Desktop.
Groovy Multiple Assignment

/* oficial samples http://groovy-lang.org/semantics.html#_multiple_assignment

*/

def (a,b) = [1L,2].split{it instanceof Long}
println a
println b
def (id, nome, idade, telefone, email) = "23141234#jonatas emidio de souza#20#32146547#jonatasemidio@gmail.com".split("#")
println id
println nome
println idade
println telefone
println email
def(x, y) = "xy"
println x
println y
println "***TESTE ALUNO***"
class Aluno{ String nome; Boolean aprovado; String toString() { "Nome:$nome - aprovado:${ aprovado ? 'SIM' : 'NÃO' }" } }
def(a1, a2, a3) = "abc".collect{ new Aluno(nome:it, aprovado:true) }

println a1.nome
println a2.nome
println a3.nome
def(aprovados, reprovados) = ([a1, a2, new Aluno(nome: "d", aprovado: false), a3]).split{ it.aprovado }
println aprovados
println reprovados
@jonatasemidio
Copy link
Author

Análise do comentário para o Rodolfo:

//Funcionamento padrão. 2 valores para 2 variáveisdef (a, b, c) = [1,2]
assert [a,b] == [1,2] 

//Com mais valores do que variáveis, os valores se perdem,pois ele distribui em ordem.
(a, b) = [1,2,3]
assert [a,b] == [1,2] 

//Mas em caso contrário, o erro relatado não foi identificado
(a, b, c) = [1,2]
assert [a,b,c] == [1,2,null] //Não apresentou o ArrayIndexOutOfBoundsException, por não ter valor, atribuiu o null
  1. No primeiro caso (o mais simples), o funcionamento está como o esperado.
  2. Já no segundo caso, me parece ser uma reação normal, já que não temos mais variáveis para atribuir valores, esse valores acabam sendo deixados de lado. Não sei se essa é a melhor estratégia, mas o que eu posso ver é se existe alguma opção para que os valores restantes sejam, passados em forma de lista, concatenados ou até calculados.
  3. Por ultimo e não menos importante. No caso de termos mais variáveis do que valores, as variáveis restantes ficaram nulas, já que estas foram declaradas sem a atribuição de algum valor. No entanto, o erro relatado: java.lang.ArrayIndexOutOfBoundsException: 4 at Script1.run(Script1.groovy:2) não ocorreu. Se possível mande o script testado para eu entender melhor.

OBS: Com relação ao MissingPropertyException, pelo fato de o groovy ser uma linguagem que gera bytecode java... algumas características foram herdadas, e uma delas é o fato de não podermos utilizar variáveis que ainda não foram explicitamente declaradas. Para ser sincero, não sei informar se hoje já existe algo para lidar com isso sem gerar Exception, mas o que normalmente acontece é a declaração desta variavel, para em seguida o seu uso - (Como no seu caso usando o println)


Então Rodolfo, espero ter respondido suas questões, caso eu tenha entendido algo errado, por favor não deixe de perguntar, pois as suas dúvida podem me levar a aprender mais sobre novos recursos da linguagem.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment