Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

184
Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/

description

Remember the epic Java Puzzlers? Here’s the Groovy version, and we have some neat ones! Even though we are totally a Grails shop here at JFrog, some of these had us scratching our heads for days trying to figure them out. And there is more! Contributions from the truly Groovy senseis, including @glaforge, @aalmiray, @tim_yates, @kenkousen make this talk an unforgettable journey to Groovy's O_O.

Transcript of Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

Page 1: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

Unless otherwise indicated, these slides are © 2013 -2014 Pivotal Software, Inc. and licensed under a

Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/

Unless otherwise indicated, these slides are © 2013 -2014 Pivotal Software, Inc. and licensed under a

Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/

Page 2: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 3: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 4: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 5: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 6: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 7: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 8: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 9: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 10: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

1. Two entertaining guys on stage 2. Funny Puzzling questions 3. You think and vote 4. Lots of T-shirts flying in the air 5. Official twitter handle!

groovypuzzlers

Page 11: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 12: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

Cédric?!

Page 13: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 14: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 15: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 16: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

class Conference {def name; def year}

def gr = new Conference(name: 'Greach', year: 2014)

gr.each {println it}

Page 17: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 18: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 19: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 20: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

-3.abs()

Page 21: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 22: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

(-3).abs()

int value = -3

value.abs()

Page 23: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 24: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

println (-3).abs()

Page 25: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 26: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 27: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

-3

Caught: java.lang.NullPointerException: Cannot invoke method abs() on null

object

java.lang.NullPointerException: Cannot invoke method abs() on null object

at AbsolutelyGroovy.run(AbsolutelyGroovy.groovy:7)

at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)

println (-3).abs()

Page 28: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

“All problems in computer science can be solved by another pair of parentheses”

John McCarthy, the inventor of LISP

Page 29: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

println ((-3).abs())

int value = -3

println value.abs()

Page 30: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 31: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 32: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

List<Integer> list = [56, '9', 74]

def max = list.max { item ->

(item < 50) ? item : null

}

println max

Page 33: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

List<Integer> list = [56, '9', 74]

def max = list.max { item ->

(item < 50) ? item : null

}

println max

Page 34: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

>groovysh (('9' as Character) as Integer)

===> 57

Page 35: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

List<Integer> list = [56, 57, 74]

def max = list.max { item ->

(item < 50) ? item : null

}

println max

Page 36: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 37: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

List<Integer> list = [56, '9', 74]

def max = list.max { item ->

(item < 50) ? item : null

}

println max

Page 38: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 39: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

def random = new Random() def randomList = [] 0..10.each {randomList << random.nextInt()} assert randomList.max{ null } == randomList[0]

Page 40: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 41: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 42: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

def x = int println x if ((x = long)) { println x } if (x = boolean ) { println x }

Page 43: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

def x = int println x if ((x = long)) { println x } if (x = boolean ) { println x }

Page 44: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 45: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 46: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 47: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

All characters

appearing in

this puzzler are

fictitious.

Any resemblance

to real persons,

present or not,

is purely

coincidental.

Page 48: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 49: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

import org.codehaus.groovy.tools.groovydoc.SimpleGroovyDoc as delegate

def delegate = new Ghostwriter()

println ({ ->

delegate.class.simpleName

}.call())

class Ghostwriter {

String book = '****** in Action, *** Edition'

}

Page 50: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 51: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

import org.codehaus.groovy.tools.groovydoc.SimpleGroovyDoc as delegate

// def delegate = new Ghostwriter()

println ({ ->

delegate.class.name

}.call())

/* class Ghostwriter {

String book = '****** in Action, *** Edition'

}*/

Page 52: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 53: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 54: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 55: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

Closure whodunit() {

{

'The butler did it.'

}

}

println whodunit()

Page 56: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 57: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

Closure whodunit() {

{ ->

'The butler did it.'

}

}

Page 58: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 59: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 60: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

class MrHyde {

def me() {

return this

}

}

class DrJekyll {

}

DrJekyll.mixin MrHyde

def drJekyll = new DrJekyll().me() as DrJekyll

def mrHide = new DrJekyll().me()

println "$drJekyll and $mrHide, are they the

same? ${(drJekyll.class).equals(mrHide.class)}"

Page 61: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

class MrHyde {

def me() {

return this

}

}

class DrJekyll {

}

DrJekyll.mixin MrHyde

def drJekyll = new DrJekyll().me() as DrJekyll

def mrHide = new DrJekyll().me()

println "$drJekyll and $mrHide, are they the same?

${(drJekyll.class).equals(mrHide.class)}"

Page 62: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 63: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 64: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 65: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 66: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 67: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 68: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 69: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

class CountDown { int counter = 10 }

CountDown finalCountDown() {

def countDown = new CountDown()

try {

countDown.counter = --countDown.counter

} catch (ignored) {

println "That will never happen."

countDown.counter = Integer.MIN_VALUE

} finally {

return countDown

}

}

println finalCountDown().counter

Page 70: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

class CountDown { int counter = 10 }

CountDown finalCountDown() {

def countDown = new CountDown()

try {

countDown.counter = --countDown.counter

} catch (ignored) {

println "That will never happen."

countDown.counter = Integer.MIN_VALUE

} finally {

return countDown

}

}

println finalCountDown().counter

Page 71: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 72: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

class CountDown { int counter = 10 } CountDown finalCountDown() { def countDown = new CountDown() try { countDown.counter = --countDown.counter } catch (ignored) { ignored.printStackTrace() countDown.counter = Integer.MIN_VALUE } finally { return countDown } } println finalCountDown().counter

org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object '9' with class 'java.lang.Integer' to class 'CountDown’ -2147483648

Page 73: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 74: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

class CountDown { int counter = 10 }

CountDown finalCountDown() {

def countDown = new CountDown()

try {

countDown.counter = --countDown.counter

} catch (ignored) {

println "That will never happen."

countDown.counter = Integer.MIN_VALUE

} finally {

return countDown

}

42

}

println finalCountDown().counter

Page 75: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 76: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 77: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 78: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 79: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 80: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

PUBLIC - PROPERTY!

Page 81: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

trait Public {

public String property = "I am all public!"

}

class Property implements Public {}

Property publicProperty = new Property()

Page 82: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

trait Public {

public String property = "I am all public!"

}

class Property implements Public {}

Property publicProperty = new Property()

Page 83: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 84: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 85: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 86: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

http://beta.groovy-

lang.org/docs/groovy-

2.3.0/html/documentation/core-

traits.html

Page 87: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 88: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

def range = 1.0..10.0 assert range.contains(5.0) println range.contains(5.6)

Page 89: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 90: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 91: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 92: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 93: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

Iterator iterator = (1.0..10.0).iterator()

while (iterator.hasNext()) {

print "${iterator.next()} "

}

1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0

Page 94: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 95: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 96: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 97: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 98: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 99: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 100: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

def key = 'x' def map = [key: 'treasure'] def value = map.get(key) println value

Page 101: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

def key = 'x' def map = [key: 'treasure'] def value = map.get(key) println value

Page 102: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 103: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 104: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

1.def map = [(key): 'treasure']

2.map.put(key, 'treasure')

3.map."$key" = 'treasure'

4.map[key] = 'treasure'

Page 105: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 106: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

def map = [2: 'treasure'] def key = 2 def value = map."$key" println value

Page 107: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

def map = [2: 'treasure'] def key = 2 def value = map."$key" println value

Page 108: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 109: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

def map = [2: 'treasure'] println map.keySet().first().class.name

java.lang.Integer

Page 110: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 111: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 112: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

List<Long> list = [1,2,3]

def now = new Date()

list << now

println list

Page 113: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

List<Long> list = [1,2,3]

def now = new Date()

list << now

println list

Page 114: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 115: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 116: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 117: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 118: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

List<Long> list = [1,2,3]

def now = new Date()

list << now

list << 'foo'

println list*.class.name

[java.lang.Long, java.lang.Long,

java.lang.Long, java.util.Date,

java.lang.String]

Page 119: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 120: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 121: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

def map = [metaClass: ‘frequency'] println "What's the $map.metaClass, Frederic?"

Page 122: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 123: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 124: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

map.metaClass

map.get('metaClass')

map.getMetaClass()

Page 125: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 126: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 127: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 128: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

[0..9].each { println(it - 1) }

Page 129: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 130: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 131: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 132: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 133: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 134: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 135: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 136: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 137: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 138: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

boolean isPrime(def x) { if (x == 2) return true int limit = Math.sqrt(x) + 1 (2..limit).each { if (x % it == 0) { return false } } true } println isPrime("4" as Double)

Page 139: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 140: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

boolean isPrime(def x) { if (x == 2) return true int limit = Math.sqrt(x) + 1 (2..limit).each { if (x % it == 0) { return false } } true } println isPrime("4" as Double)

Page 141: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

boolean isPrime(def x) { if (x == 2) return true int limit = Math.sqrt(x) + 1 (2..limit).each { if (x % it == 0) { return false } } true } println isPrime("4" as Double)

Page 142: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 143: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 144: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 145: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 146: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 147: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 148: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

http://kousenit.wordpress.com/2014/04/

18/responses-to-the-closure-of-no-

return/

Page 149: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 150: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 151: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 152: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

class VanHalen { public static jump() { "Here are the ${lyrics()}" } def methodMissing(String name, def args) { 'lyrics' } } println VanHalen.jump()

Page 153: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

class VanHalen { public static jump() { "Here are the ${lyrics()}" } def methodMissing(String name, def args) { 'lyrics' } } println VanHalen.jump()

Page 154: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 155: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 156: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 157: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 158: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

class VanHalen { public static jump() { "Here are the ${lyrics()}" } static $static_methodMissing(String name, def args) { 'lyrics' } } println VanHalen.jump()

Page 159: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

class VanHalen { public jump() { "Here are the ${lyrics()}" } def methodMissing(String name, def args) { 'lyrics' } } println new VanHalen().jump()

Page 160: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 161: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

double value = 3 println "$value.14".isDouble()

Page 162: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 163: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 164: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 165: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

double value = 3 println "$value.14".isDouble()

Page 166: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 167: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 168: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 169: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 170: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

class Invite { int attending = 1 } def invite = new Invite() def attendees = (invite.attending) +1 println attendees

Page 171: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

class Invite { int attending = 1 } def invite = new Invite() def attendees = (invite.attending) +1 println attendees

Page 172: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 173: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 174: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 175: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 176: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 177: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

def attendees = (new Invite().attending) + 1 println attendees

def invite = new Invite() println (invite.attending +1)

Page 178: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 179: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 180: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

1. Write readable code

2. Comment neat tricks

3. Sometimes it is just a bug

4. Use static code analysis (intellij IDEA!)

5. Rtfm

6. Don’t code like my brother

Page 181: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

We have just started! (may end up in proper uniform) Puzzlers? Gotchas? Fetal position inducing behavior?

- puzzlers jfrog.com - Groovypuzzlers

Page 182: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases
Page 183: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases

Positive feedback? Praise us on twitter groovypuzzlers - Groovypuzzlers - freddy33 - jbaruch

Negative feeback? /dev/null

Page 184: Groovy and Grails Puzzlers - As Usual - Traps, Pitfalls, and End Cases