Tipps zum Golfen in Groovy


14

Da ich viele Fragen gesehen habe, die Tipps zum Golfen in ihrer interessierten Sprache geben, habe ich beschlossen, nach meiner Lieblingssprache zu fragen: Groovy. Die Leute können einige Tipps und Tricks geben, die beim Golfen mit Groovy verwendet werden.


1
Nun, das ist nicht sehr beliebt, ist es :-(
Armand

@Alison: Ich fühle mich schlecht, da es keinen Golftipp für Groovy auf dieser Seite gibt :(
Ants

2
Haben Sie Tipps, um uns anzufangen?
Armand

Antworten:


5

Ich bin neu in dieser ganzen Golf-Sache, das ist, was ich bisher bekommen habe:

Verwenden Sie Verschlüsse nicht Funktionen:

def a (b) {print b}

ist länger als

a = {drucke es aus}

Sie können einen negativen Index in Arrays und Listen als Alias ​​für size () verwenden -

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

setze c [c.size () - 1] == c [-1]
setze c [c.size () - 2] == c [-2]
behaupten, d [d.size () - 1] == d [-1]
assert d.last () == d [-1]

Der Spread-Operator ist eine Abkürzung für collect:

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

Verwenden Sie zum Sortieren den Raumschiff-Operator:

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

Conversions bearbeiten:

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

Wenn der *.XSpread-Operator auf einer Liste steht , kann er oft wie .X
folgt

3

Da Groovy eine etwas ausführliche Sprache ist, können Sie mit Groovys MOP Methodenaufrufe verkürzen.

Das folgende Snippet würde sich beispielsweise nach der vierten Verwendung auszahlen:

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

Golftipp bearbeiten:

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

Oder wissen Sie:

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

2

grep ist kurz und arbeitet an mehreren Problemen

Holen Sie sich die Zeichen eines Strings als Liste mit Leerzeichen und ohne führende Elemente: 'ABC XYZ'.grep() return[A, B, C, , X, Y, Z]

grep mit regexp ist kürzer als das Konvertieren in Großbuchstaben, falls erforderlich: it.grep(~/(?i)$c/)stattit.toUpperCase().grep(c)


1
'ABC XYZ'as Setist ein Zeichen kürzer und arbeitet an den meisten Orten
Marty Neal

2

Abrufen eines Arrays aus einer Liste von Objekten

Wenn Sie eine Liste von Objekten haben, wie:

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

Sie können eine ArrayList mit einer bestimmten Eigenschaft generieren, indem Sie Folgendes verwenden:

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

BONUS: Groovy ... auf Schienen!

Nun, in Grails Framework müssen wir viele Werte von einem Select mit mehreren Attributen erhalten . Sie können Schleifen, Abflachen und andere typische Programmierstrukturen verwenden, aber Sie können einige Zeilen speichern. Wenn Sie eine Auswahl haben wie:

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

Dann können Sie in Ihrem Controller einfach schreiben:

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

1
Würde diese Frage Grails Golftipps akzeptieren? Ich gebe zu, ich habe Angst vor Downvote-Scharfschützen ...
Victor F

2
Keine Angst, PCG ist voll von extrem netten Leuten :)
Beta Decay
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.