Dicas para jogar golfe no Groovy

14

Como já vi muitas perguntas com dicas de golfe no idioma de seu interesse, decidi pedir meu idioma favorito: Groovy. As pessoas podem dar algumas dicas e truques que serão usados ​​no golfe com o Groovy.

Formigas
fonte
1
Bem, isso não é muito popular, é :-(
Armand
@Alison: Eu me sinto mal, pois não há uma dica de golfe para o Groovy neste site :(
Ant's
2
Você tem alguma dica para começar?
Armand #

Respostas:

5

Eu sou novo nessa coisa toda de golfe, é isso que eu tenho até agora:

Usar fechamentos não funciona:

def a (b) {print b}

é maior que

a = {imprima}

Você pode usar um índice negativo em matrizes e listas como um alias para size () -

c = "abc"
d = ["a", "b", "c"]

afirmar c [c.size () - 1] == c [-1]
afirmar c [c.size () - 2] == c [-2]
afirmar d [d.size () - 1] == d [-1]
afirmar d.last () == d [-1]

O operador de propagação é um atalho para coletar:

afirmar d * .size () == d.collect {it.size ()}

Para classificar, use o operador de nave espacial:

e = [54,5,12]
assert e.sort{a,b->a<=>b}==e.sort{a,b->a<b?-1:+1}
assert e.sort{a,b->a<=>b}==e.sort{a,b->if (a>b) {return(-1)} else {return(+1)}}

Editar conversões:

assert "123" as int == "123".toInteger()
Fels
fonte
se em algo listish o *.Xoperador de propagação muitas vezes pode ser escrito como.X
cfrick
3

Como o Groovy é uma linguagem um pouco detalhada, você pode usar o Groovys MOP para reduzir as chamadas de método.

O seguinte snippet, por exemplo, seria recompensado após o quarto uso:

''.metaClass.r<<{i->(int)Math.random()*i}
''.r(12)

Dica de golfe editar:

0.metaClass.r<<{i->(int)Math.random()*i}
0.r(12)

Ou você sabe:

r={(int)Math.random()*it}
r(12)
codeporn
fonte
2

grep é curto e funciona em vários problemas

obter os caracteres de uma string como uma lista com espaços e sem elementos 'ABC XYZ'.grep()iniciais : retorna[A, B, C, , X, Y, Z]

grep com regexp é menor que a conversão para maiúscula, se necessário: em it.grep(~/(?i)$c/)vez deit.toUpperCase().grep(c)

cfrick
fonte
1
'ABC XYZ'as Seté um personagem menor e funciona na maioria dos mesmos lugares
Marty Neal
2

Obtendo uma matriz de uma lista de objetos

Se você tiver uma lista de objetos como:

def users = [[user:'A',id:1],[user:'B',id:2],[user:'C',id:3]]

Você pode gerar um ArrayList com uma determinada propriedade usando:

def userIds = users*.id // [1, 2, 3] no explicit loops!

BÔNUS: Groovy ... no Rails!

Bem, no Grails Framework , precisamos obter muitos valores de um select com vários atributos . Você pode usar loops, nivelar e outras estruturas mais comuns de programação, mas pode salvar algumas linhas. Se você tem um select como:

<select id="users" multiple="true" name="users">
    <option value="193">User A</option>
    <option value="378">User B</option>
    <option value="377">User C</option>
</select><%-- No Grails tags for now --%>

Então, no seu controlador, você pode escrever simplesmente:

def aListOfUsers = User.getAll(params.list('userIds'))
Victor F
fonte
1
Esta pergunta aceita dicas de golfe do Grails? Confesso que tenho medo de atiradores downvote ...
Victor F
2
Não tenha medo, PCG está cheio de pessoas extremamente agradáveis :)
Beta Decay