Conseils pour jouer au golf à Groovy


14

Comme j'ai vu de nombreuses questions demandant des conseils pour jouer au golf dans leur langue, j'ai décidé de demander ma langue préférée: le groovy. Les gens peuvent donner quelques trucs et astuces qui seront utilisés dans le golf avec Groovy.


1
Eh bien, ce n'est pas très populaire, n'est-ce pas :-(
Armand

@Alison: Je me sens mal, car il n'y a pas de pourboire de golf pour Groovy sur ce site :(
Ant's

2
Avez-vous des conseils pour nous lancer?
Armand

Réponses:


5

Je suis nouveau dans ce domaine du golf, c'est ce que j'ai obtenu jusqu'à présent:

Utiliser les fermetures et non les fonctions:

def a (b) {imprimer b}

est plus long que

a = {l'imprimer}

Vous pouvez utiliser un index négatif dans les tableaux et les listes comme alias pour size () -

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

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

L'opérateur de propagation est un raccourci pour collecter:

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

Pour le tri, utilisez l'opérateur du vaisseau spatial:

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)}}

Modifier les conversions:

assert "123" as int == "123".toInteger()

si sur quelque chose d'écoute, l' *.Xopérateur de propagation peut souvent s'écrire.X
cfrick

3

Comme Groovy est un langage quelque peu bavard, vous pouvez utiliser Groovys MOP pour raccourcir les appels de méthode.

L'extrait suivant, par exemple, serait rentable après la quatrième utilisation:

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

Astuce pour jouer au golf:

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

Ou, vous savez:

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

2

grep est court et fonctionne sur plusieurs problèmes

obtenir les caractères d'une chaîne sous forme de liste avec des espaces et sans éléments de tête: 'ABC XYZ'.grep()renvoie[A, B, C, , X, Y, Z]

grep avec regexp est plus court que la conversion en majuscules, si nécessaire: it.grep(~/(?i)$c/)au lieu deit.toUpperCase().grep(c)


1
'ABC XYZ'as Setest un personnage plus court et travaille dans la plupart des mêmes endroits
Marty Neal

2

Obtention d'un tableau à partir d'une liste d'objets

Si vous avez une liste d'objets comme:

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

Vous pouvez générer un ArrayList avec une certaine propriété en utilisant:

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

BONUS: Groovy ... sur Rails!

Eh bien, dans Grails Framework, nous devons obtenir de nombreuses valeurs d'une sélection avec plusieurs attributs . Vous pouvez utiliser des boucles, aplatir et d'autres structures de programmation plus typiques, mais vous pouvez enregistrer certaines lignes. Si vous avez un choix comme:

<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 --%>

Ensuite, dans votre contrôleur, vous pouvez simplement écrire:

def aListOfUsers = User.getAll(params.list('userIds'))

1
Cette question accepterait-elle les conseils de golf des Grails? J'avoue que j'ai peur des tireurs d'élite de downvote ...
Victor F

2
N'ayez pas peur, PCG est plein de gens extrêmement gentils :)
Beta Decay
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.