Page 1
GROOVY PUZZLERS
СТРАННОЕ НЕПОНЯТНОЕ И
МАМОЧКИ-ЧТО-ЭТО-ТАКОЕ
CLICK AND HACK
THE TYPING BROTHERS
1 Два клЕвых пацана на сцене
2 Прикольные загадки3 Вы голосуете за
правильный ответ4 Мы швыряемся вещами5 Официальный хэш
groovypuzzlers
ПЕРВОЕ ПРАВИЛО ПАЗЗЛЕРОВ
НЕ ЧИТИТЬ
ВСЁ ВЕРНО ДЛЯ ВЕРСИИ 237
ABSOLUTELY GROOVY
A3BNoSuchMethodErrorC-3DExecution Failure
-3abs()
ЧИНИМ
(-3)abs()
ИЛИ
int value = -3valueabs()
ИДЕЯ НИЧЕГО НЕ ПЕЧАТАЕТ ПОЧЕМУ
A-3B3C3 and
NullPointerExceptionD-3 and
NullPointerException
ДОБАВИМ PRINTLN
println (-3)abs()
УБЕЙТЕ ВСЕ СКОБКИ
КОМПИЛЯТОР РАЗБЕРЕТСЯ
-3Caught javalangNullPointerException Cannot invoke method abs() on null objectjavalangNullPointerException Cannot invoke method abs() on null object
at AbsolutelyGroovyrun(AbsolutelyGroovygroovy7)at comintellijrtexecutionapplicationAppMainmain(AppMainjava134)
println (-3)abs()
ldquoВсе проблемы в программировании можно решить добавив пару скобокrdquo
John McCarthy изобретатель LISP
ПРОСТО ДОБАВЬ СКОБОК
println ((-3)abs())
ИЛИ
int value = -3println valueabs()
PRIME CUTS
PRIME CUTSboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
САМ В ШОКЕ
ПОСМОТРИМ ЕЩЕ РАЗboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
boolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
AtrueBfalse
CNumberFormatException
DMissingMethodException
КАК 4 МОГЛО ОКАЗАТЬСЯ ПРОСТЫМ ЧИСЛОМhellip
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
РЕШЕНИЕ ИСПОЛЬЗУЙ ANY() ИЛИ ПЕРЕОСМЫСЛИ АЛГОРИТМ
httpkousenitwordpresscom20140418responses-to-the-closure-of-no-return
class Conference def name def year
def gr = new Conference(name Greach year 2014)
greach println it
A class=class Conferencename=Greachyear=2014
B ConferenceXXXXXX
C Startup failure
D Greach 2014
КАКОЙ ЖЕ ЭТО ITERABLE
RTFS (READ THE FING SOURCE)
MAX POWER
MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
A ClassCastExceptionB 9C 56Dnull
РАСКУСИЛ
gtgroovysh ((9 as Character) as Integer)===gt 57
ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max
СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL
A ClassCastExceptionB 9C 56Dnull
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
КАК ЭТО ПОЛУЧИЛОСЬ
def random = new Random()
def randomList = []010each randomList ltlt randomnextInt()
assert randomListmax null == randomList[0]
ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО
ДЕТЕКТИВ
КТО УБИЙЦА
A NullPointerException
B ктоУбийцаI_closure1xxxxxxx
C Startup errorD Мориарти
Closure ктоУбийца() Мориарти println ктоУбийца()
ПИЧАЛЬКА
ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ
Closure ктоУбийца() -gt Мориарти
Closure ктоУбийца() return Мориарти
>
The Final Countdown - fragment Europe
Top Disco Hits vol 1 track 17
9743676
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9D10
КАК ТАК ТО НУ КАК ТАК ТО
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648
ЛУЧШЕ НЕ СТАЛОhellip
ЧТО ПРОИЗОШЛО
ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
ПОЧИНИЛИclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9
D42
ЭТО ВООБЩЕ КАК
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 2
CLICK AND HACK
THE TYPING BROTHERS
1 Два клЕвых пацана на сцене
2 Прикольные загадки3 Вы голосуете за
правильный ответ4 Мы швыряемся вещами5 Официальный хэш
groovypuzzlers
ПЕРВОЕ ПРАВИЛО ПАЗЗЛЕРОВ
НЕ ЧИТИТЬ
ВСЁ ВЕРНО ДЛЯ ВЕРСИИ 237
ABSOLUTELY GROOVY
A3BNoSuchMethodErrorC-3DExecution Failure
-3abs()
ЧИНИМ
(-3)abs()
ИЛИ
int value = -3valueabs()
ИДЕЯ НИЧЕГО НЕ ПЕЧАТАЕТ ПОЧЕМУ
A-3B3C3 and
NullPointerExceptionD-3 and
NullPointerException
ДОБАВИМ PRINTLN
println (-3)abs()
УБЕЙТЕ ВСЕ СКОБКИ
КОМПИЛЯТОР РАЗБЕРЕТСЯ
-3Caught javalangNullPointerException Cannot invoke method abs() on null objectjavalangNullPointerException Cannot invoke method abs() on null object
at AbsolutelyGroovyrun(AbsolutelyGroovygroovy7)at comintellijrtexecutionapplicationAppMainmain(AppMainjava134)
println (-3)abs()
ldquoВсе проблемы в программировании можно решить добавив пару скобокrdquo
John McCarthy изобретатель LISP
ПРОСТО ДОБАВЬ СКОБОК
println ((-3)abs())
ИЛИ
int value = -3println valueabs()
PRIME CUTS
PRIME CUTSboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
САМ В ШОКЕ
ПОСМОТРИМ ЕЩЕ РАЗboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
boolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
AtrueBfalse
CNumberFormatException
DMissingMethodException
КАК 4 МОГЛО ОКАЗАТЬСЯ ПРОСТЫМ ЧИСЛОМhellip
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
РЕШЕНИЕ ИСПОЛЬЗУЙ ANY() ИЛИ ПЕРЕОСМЫСЛИ АЛГОРИТМ
httpkousenitwordpresscom20140418responses-to-the-closure-of-no-return
class Conference def name def year
def gr = new Conference(name Greach year 2014)
greach println it
A class=class Conferencename=Greachyear=2014
B ConferenceXXXXXX
C Startup failure
D Greach 2014
КАКОЙ ЖЕ ЭТО ITERABLE
RTFS (READ THE FING SOURCE)
MAX POWER
MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
A ClassCastExceptionB 9C 56Dnull
РАСКУСИЛ
gtgroovysh ((9 as Character) as Integer)===gt 57
ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max
СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL
A ClassCastExceptionB 9C 56Dnull
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
КАК ЭТО ПОЛУЧИЛОСЬ
def random = new Random()
def randomList = []010each randomList ltlt randomnextInt()
assert randomListmax null == randomList[0]
ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО
ДЕТЕКТИВ
КТО УБИЙЦА
A NullPointerException
B ктоУбийцаI_closure1xxxxxxx
C Startup errorD Мориарти
Closure ктоУбийца() Мориарти println ктоУбийца()
ПИЧАЛЬКА
ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ
Closure ктоУбийца() -gt Мориарти
Closure ктоУбийца() return Мориарти
>
The Final Countdown - fragment Europe
Top Disco Hits vol 1 track 17
9743676
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9D10
КАК ТАК ТО НУ КАК ТАК ТО
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648
ЛУЧШЕ НЕ СТАЛОhellip
ЧТО ПРОИЗОШЛО
ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
ПОЧИНИЛИclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9
D42
ЭТО ВООБЩЕ КАК
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 3
1 Два клЕвых пацана на сцене
2 Прикольные загадки3 Вы голосуете за
правильный ответ4 Мы швыряемся вещами5 Официальный хэш
groovypuzzlers
ПЕРВОЕ ПРАВИЛО ПАЗЗЛЕРОВ
НЕ ЧИТИТЬ
ВСЁ ВЕРНО ДЛЯ ВЕРСИИ 237
ABSOLUTELY GROOVY
A3BNoSuchMethodErrorC-3DExecution Failure
-3abs()
ЧИНИМ
(-3)abs()
ИЛИ
int value = -3valueabs()
ИДЕЯ НИЧЕГО НЕ ПЕЧАТАЕТ ПОЧЕМУ
A-3B3C3 and
NullPointerExceptionD-3 and
NullPointerException
ДОБАВИМ PRINTLN
println (-3)abs()
УБЕЙТЕ ВСЕ СКОБКИ
КОМПИЛЯТОР РАЗБЕРЕТСЯ
-3Caught javalangNullPointerException Cannot invoke method abs() on null objectjavalangNullPointerException Cannot invoke method abs() on null object
at AbsolutelyGroovyrun(AbsolutelyGroovygroovy7)at comintellijrtexecutionapplicationAppMainmain(AppMainjava134)
println (-3)abs()
ldquoВсе проблемы в программировании можно решить добавив пару скобокrdquo
John McCarthy изобретатель LISP
ПРОСТО ДОБАВЬ СКОБОК
println ((-3)abs())
ИЛИ
int value = -3println valueabs()
PRIME CUTS
PRIME CUTSboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
САМ В ШОКЕ
ПОСМОТРИМ ЕЩЕ РАЗboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
boolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
AtrueBfalse
CNumberFormatException
DMissingMethodException
КАК 4 МОГЛО ОКАЗАТЬСЯ ПРОСТЫМ ЧИСЛОМhellip
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
РЕШЕНИЕ ИСПОЛЬЗУЙ ANY() ИЛИ ПЕРЕОСМЫСЛИ АЛГОРИТМ
httpkousenitwordpresscom20140418responses-to-the-closure-of-no-return
class Conference def name def year
def gr = new Conference(name Greach year 2014)
greach println it
A class=class Conferencename=Greachyear=2014
B ConferenceXXXXXX
C Startup failure
D Greach 2014
КАКОЙ ЖЕ ЭТО ITERABLE
RTFS (READ THE FING SOURCE)
MAX POWER
MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
A ClassCastExceptionB 9C 56Dnull
РАСКУСИЛ
gtgroovysh ((9 as Character) as Integer)===gt 57
ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max
СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL
A ClassCastExceptionB 9C 56Dnull
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
КАК ЭТО ПОЛУЧИЛОСЬ
def random = new Random()
def randomList = []010each randomList ltlt randomnextInt()
assert randomListmax null == randomList[0]
ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО
ДЕТЕКТИВ
КТО УБИЙЦА
A NullPointerException
B ктоУбийцаI_closure1xxxxxxx
C Startup errorD Мориарти
Closure ктоУбийца() Мориарти println ктоУбийца()
ПИЧАЛЬКА
ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ
Closure ктоУбийца() -gt Мориарти
Closure ктоУбийца() return Мориарти
>
The Final Countdown - fragment Europe
Top Disco Hits vol 1 track 17
9743676
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9D10
КАК ТАК ТО НУ КАК ТАК ТО
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648
ЛУЧШЕ НЕ СТАЛОhellip
ЧТО ПРОИЗОШЛО
ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
ПОЧИНИЛИclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9
D42
ЭТО ВООБЩЕ КАК
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 4
ПЕРВОЕ ПРАВИЛО ПАЗЗЛЕРОВ
НЕ ЧИТИТЬ
ВСЁ ВЕРНО ДЛЯ ВЕРСИИ 237
ABSOLUTELY GROOVY
A3BNoSuchMethodErrorC-3DExecution Failure
-3abs()
ЧИНИМ
(-3)abs()
ИЛИ
int value = -3valueabs()
ИДЕЯ НИЧЕГО НЕ ПЕЧАТАЕТ ПОЧЕМУ
A-3B3C3 and
NullPointerExceptionD-3 and
NullPointerException
ДОБАВИМ PRINTLN
println (-3)abs()
УБЕЙТЕ ВСЕ СКОБКИ
КОМПИЛЯТОР РАЗБЕРЕТСЯ
-3Caught javalangNullPointerException Cannot invoke method abs() on null objectjavalangNullPointerException Cannot invoke method abs() on null object
at AbsolutelyGroovyrun(AbsolutelyGroovygroovy7)at comintellijrtexecutionapplicationAppMainmain(AppMainjava134)
println (-3)abs()
ldquoВсе проблемы в программировании можно решить добавив пару скобокrdquo
John McCarthy изобретатель LISP
ПРОСТО ДОБАВЬ СКОБОК
println ((-3)abs())
ИЛИ
int value = -3println valueabs()
PRIME CUTS
PRIME CUTSboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
САМ В ШОКЕ
ПОСМОТРИМ ЕЩЕ РАЗboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
boolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
AtrueBfalse
CNumberFormatException
DMissingMethodException
КАК 4 МОГЛО ОКАЗАТЬСЯ ПРОСТЫМ ЧИСЛОМhellip
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
РЕШЕНИЕ ИСПОЛЬЗУЙ ANY() ИЛИ ПЕРЕОСМЫСЛИ АЛГОРИТМ
httpkousenitwordpresscom20140418responses-to-the-closure-of-no-return
class Conference def name def year
def gr = new Conference(name Greach year 2014)
greach println it
A class=class Conferencename=Greachyear=2014
B ConferenceXXXXXX
C Startup failure
D Greach 2014
КАКОЙ ЖЕ ЭТО ITERABLE
RTFS (READ THE FING SOURCE)
MAX POWER
MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
A ClassCastExceptionB 9C 56Dnull
РАСКУСИЛ
gtgroovysh ((9 as Character) as Integer)===gt 57
ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max
СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL
A ClassCastExceptionB 9C 56Dnull
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
КАК ЭТО ПОЛУЧИЛОСЬ
def random = new Random()
def randomList = []010each randomList ltlt randomnextInt()
assert randomListmax null == randomList[0]
ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО
ДЕТЕКТИВ
КТО УБИЙЦА
A NullPointerException
B ктоУбийцаI_closure1xxxxxxx
C Startup errorD Мориарти
Closure ктоУбийца() Мориарти println ктоУбийца()
ПИЧАЛЬКА
ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ
Closure ктоУбийца() -gt Мориарти
Closure ктоУбийца() return Мориарти
>
The Final Countdown - fragment Europe
Top Disco Hits vol 1 track 17
9743676
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9D10
КАК ТАК ТО НУ КАК ТАК ТО
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648
ЛУЧШЕ НЕ СТАЛОhellip
ЧТО ПРОИЗОШЛО
ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
ПОЧИНИЛИclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9
D42
ЭТО ВООБЩЕ КАК
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 5
ВСЁ ВЕРНО ДЛЯ ВЕРСИИ 237
ABSOLUTELY GROOVY
A3BNoSuchMethodErrorC-3DExecution Failure
-3abs()
ЧИНИМ
(-3)abs()
ИЛИ
int value = -3valueabs()
ИДЕЯ НИЧЕГО НЕ ПЕЧАТАЕТ ПОЧЕМУ
A-3B3C3 and
NullPointerExceptionD-3 and
NullPointerException
ДОБАВИМ PRINTLN
println (-3)abs()
УБЕЙТЕ ВСЕ СКОБКИ
КОМПИЛЯТОР РАЗБЕРЕТСЯ
-3Caught javalangNullPointerException Cannot invoke method abs() on null objectjavalangNullPointerException Cannot invoke method abs() on null object
at AbsolutelyGroovyrun(AbsolutelyGroovygroovy7)at comintellijrtexecutionapplicationAppMainmain(AppMainjava134)
println (-3)abs()
ldquoВсе проблемы в программировании можно решить добавив пару скобокrdquo
John McCarthy изобретатель LISP
ПРОСТО ДОБАВЬ СКОБОК
println ((-3)abs())
ИЛИ
int value = -3println valueabs()
PRIME CUTS
PRIME CUTSboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
САМ В ШОКЕ
ПОСМОТРИМ ЕЩЕ РАЗboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
boolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
AtrueBfalse
CNumberFormatException
DMissingMethodException
КАК 4 МОГЛО ОКАЗАТЬСЯ ПРОСТЫМ ЧИСЛОМhellip
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
РЕШЕНИЕ ИСПОЛЬЗУЙ ANY() ИЛИ ПЕРЕОСМЫСЛИ АЛГОРИТМ
httpkousenitwordpresscom20140418responses-to-the-closure-of-no-return
class Conference def name def year
def gr = new Conference(name Greach year 2014)
greach println it
A class=class Conferencename=Greachyear=2014
B ConferenceXXXXXX
C Startup failure
D Greach 2014
КАКОЙ ЖЕ ЭТО ITERABLE
RTFS (READ THE FING SOURCE)
MAX POWER
MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
A ClassCastExceptionB 9C 56Dnull
РАСКУСИЛ
gtgroovysh ((9 as Character) as Integer)===gt 57
ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max
СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL
A ClassCastExceptionB 9C 56Dnull
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
КАК ЭТО ПОЛУЧИЛОСЬ
def random = new Random()
def randomList = []010each randomList ltlt randomnextInt()
assert randomListmax null == randomList[0]
ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО
ДЕТЕКТИВ
КТО УБИЙЦА
A NullPointerException
B ктоУбийцаI_closure1xxxxxxx
C Startup errorD Мориарти
Closure ктоУбийца() Мориарти println ктоУбийца()
ПИЧАЛЬКА
ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ
Closure ктоУбийца() -gt Мориарти
Closure ктоУбийца() return Мориарти
>
The Final Countdown - fragment Europe
Top Disco Hits vol 1 track 17
9743676
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9D10
КАК ТАК ТО НУ КАК ТАК ТО
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648
ЛУЧШЕ НЕ СТАЛОhellip
ЧТО ПРОИЗОШЛО
ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
ПОЧИНИЛИclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9
D42
ЭТО ВООБЩЕ КАК
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 6
ABSOLUTELY GROOVY
A3BNoSuchMethodErrorC-3DExecution Failure
-3abs()
ЧИНИМ
(-3)abs()
ИЛИ
int value = -3valueabs()
ИДЕЯ НИЧЕГО НЕ ПЕЧАТАЕТ ПОЧЕМУ
A-3B3C3 and
NullPointerExceptionD-3 and
NullPointerException
ДОБАВИМ PRINTLN
println (-3)abs()
УБЕЙТЕ ВСЕ СКОБКИ
КОМПИЛЯТОР РАЗБЕРЕТСЯ
-3Caught javalangNullPointerException Cannot invoke method abs() on null objectjavalangNullPointerException Cannot invoke method abs() on null object
at AbsolutelyGroovyrun(AbsolutelyGroovygroovy7)at comintellijrtexecutionapplicationAppMainmain(AppMainjava134)
println (-3)abs()
ldquoВсе проблемы в программировании можно решить добавив пару скобокrdquo
John McCarthy изобретатель LISP
ПРОСТО ДОБАВЬ СКОБОК
println ((-3)abs())
ИЛИ
int value = -3println valueabs()
PRIME CUTS
PRIME CUTSboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
САМ В ШОКЕ
ПОСМОТРИМ ЕЩЕ РАЗboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
boolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
AtrueBfalse
CNumberFormatException
DMissingMethodException
КАК 4 МОГЛО ОКАЗАТЬСЯ ПРОСТЫМ ЧИСЛОМhellip
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
РЕШЕНИЕ ИСПОЛЬЗУЙ ANY() ИЛИ ПЕРЕОСМЫСЛИ АЛГОРИТМ
httpkousenitwordpresscom20140418responses-to-the-closure-of-no-return
class Conference def name def year
def gr = new Conference(name Greach year 2014)
greach println it
A class=class Conferencename=Greachyear=2014
B ConferenceXXXXXX
C Startup failure
D Greach 2014
КАКОЙ ЖЕ ЭТО ITERABLE
RTFS (READ THE FING SOURCE)
MAX POWER
MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
A ClassCastExceptionB 9C 56Dnull
РАСКУСИЛ
gtgroovysh ((9 as Character) as Integer)===gt 57
ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max
СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL
A ClassCastExceptionB 9C 56Dnull
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
КАК ЭТО ПОЛУЧИЛОСЬ
def random = new Random()
def randomList = []010each randomList ltlt randomnextInt()
assert randomListmax null == randomList[0]
ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО
ДЕТЕКТИВ
КТО УБИЙЦА
A NullPointerException
B ктоУбийцаI_closure1xxxxxxx
C Startup errorD Мориарти
Closure ктоУбийца() Мориарти println ктоУбийца()
ПИЧАЛЬКА
ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ
Closure ктоУбийца() -gt Мориарти
Closure ктоУбийца() return Мориарти
>
The Final Countdown - fragment Europe
Top Disco Hits vol 1 track 17
9743676
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9D10
КАК ТАК ТО НУ КАК ТАК ТО
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648
ЛУЧШЕ НЕ СТАЛОhellip
ЧТО ПРОИЗОШЛО
ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
ПОЧИНИЛИclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9
D42
ЭТО ВООБЩЕ КАК
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 7
A3BNoSuchMethodErrorC-3DExecution Failure
-3abs()
ЧИНИМ
(-3)abs()
ИЛИ
int value = -3valueabs()
ИДЕЯ НИЧЕГО НЕ ПЕЧАТАЕТ ПОЧЕМУ
A-3B3C3 and
NullPointerExceptionD-3 and
NullPointerException
ДОБАВИМ PRINTLN
println (-3)abs()
УБЕЙТЕ ВСЕ СКОБКИ
КОМПИЛЯТОР РАЗБЕРЕТСЯ
-3Caught javalangNullPointerException Cannot invoke method abs() on null objectjavalangNullPointerException Cannot invoke method abs() on null object
at AbsolutelyGroovyrun(AbsolutelyGroovygroovy7)at comintellijrtexecutionapplicationAppMainmain(AppMainjava134)
println (-3)abs()
ldquoВсе проблемы в программировании можно решить добавив пару скобокrdquo
John McCarthy изобретатель LISP
ПРОСТО ДОБАВЬ СКОБОК
println ((-3)abs())
ИЛИ
int value = -3println valueabs()
PRIME CUTS
PRIME CUTSboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
САМ В ШОКЕ
ПОСМОТРИМ ЕЩЕ РАЗboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
boolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
AtrueBfalse
CNumberFormatException
DMissingMethodException
КАК 4 МОГЛО ОКАЗАТЬСЯ ПРОСТЫМ ЧИСЛОМhellip
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
РЕШЕНИЕ ИСПОЛЬЗУЙ ANY() ИЛИ ПЕРЕОСМЫСЛИ АЛГОРИТМ
httpkousenitwordpresscom20140418responses-to-the-closure-of-no-return
class Conference def name def year
def gr = new Conference(name Greach year 2014)
greach println it
A class=class Conferencename=Greachyear=2014
B ConferenceXXXXXX
C Startup failure
D Greach 2014
КАКОЙ ЖЕ ЭТО ITERABLE
RTFS (READ THE FING SOURCE)
MAX POWER
MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
A ClassCastExceptionB 9C 56Dnull
РАСКУСИЛ
gtgroovysh ((9 as Character) as Integer)===gt 57
ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max
СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL
A ClassCastExceptionB 9C 56Dnull
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
КАК ЭТО ПОЛУЧИЛОСЬ
def random = new Random()
def randomList = []010each randomList ltlt randomnextInt()
assert randomListmax null == randomList[0]
ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО
ДЕТЕКТИВ
КТО УБИЙЦА
A NullPointerException
B ктоУбийцаI_closure1xxxxxxx
C Startup errorD Мориарти
Closure ктоУбийца() Мориарти println ктоУбийца()
ПИЧАЛЬКА
ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ
Closure ктоУбийца() -gt Мориарти
Closure ктоУбийца() return Мориарти
>
The Final Countdown - fragment Europe
Top Disco Hits vol 1 track 17
9743676
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9D10
КАК ТАК ТО НУ КАК ТАК ТО
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648
ЛУЧШЕ НЕ СТАЛОhellip
ЧТО ПРОИЗОШЛО
ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
ПОЧИНИЛИclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9
D42
ЭТО ВООБЩЕ КАК
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 8
ЧИНИМ
(-3)abs()
ИЛИ
int value = -3valueabs()
ИДЕЯ НИЧЕГО НЕ ПЕЧАТАЕТ ПОЧЕМУ
A-3B3C3 and
NullPointerExceptionD-3 and
NullPointerException
ДОБАВИМ PRINTLN
println (-3)abs()
УБЕЙТЕ ВСЕ СКОБКИ
КОМПИЛЯТОР РАЗБЕРЕТСЯ
-3Caught javalangNullPointerException Cannot invoke method abs() on null objectjavalangNullPointerException Cannot invoke method abs() on null object
at AbsolutelyGroovyrun(AbsolutelyGroovygroovy7)at comintellijrtexecutionapplicationAppMainmain(AppMainjava134)
println (-3)abs()
ldquoВсе проблемы в программировании можно решить добавив пару скобокrdquo
John McCarthy изобретатель LISP
ПРОСТО ДОБАВЬ СКОБОК
println ((-3)abs())
ИЛИ
int value = -3println valueabs()
PRIME CUTS
PRIME CUTSboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
САМ В ШОКЕ
ПОСМОТРИМ ЕЩЕ РАЗboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
boolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
AtrueBfalse
CNumberFormatException
DMissingMethodException
КАК 4 МОГЛО ОКАЗАТЬСЯ ПРОСТЫМ ЧИСЛОМhellip
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
РЕШЕНИЕ ИСПОЛЬЗУЙ ANY() ИЛИ ПЕРЕОСМЫСЛИ АЛГОРИТМ
httpkousenitwordpresscom20140418responses-to-the-closure-of-no-return
class Conference def name def year
def gr = new Conference(name Greach year 2014)
greach println it
A class=class Conferencename=Greachyear=2014
B ConferenceXXXXXX
C Startup failure
D Greach 2014
КАКОЙ ЖЕ ЭТО ITERABLE
RTFS (READ THE FING SOURCE)
MAX POWER
MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
A ClassCastExceptionB 9C 56Dnull
РАСКУСИЛ
gtgroovysh ((9 as Character) as Integer)===gt 57
ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max
СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL
A ClassCastExceptionB 9C 56Dnull
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
КАК ЭТО ПОЛУЧИЛОСЬ
def random = new Random()
def randomList = []010each randomList ltlt randomnextInt()
assert randomListmax null == randomList[0]
ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО
ДЕТЕКТИВ
КТО УБИЙЦА
A NullPointerException
B ктоУбийцаI_closure1xxxxxxx
C Startup errorD Мориарти
Closure ктоУбийца() Мориарти println ктоУбийца()
ПИЧАЛЬКА
ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ
Closure ктоУбийца() -gt Мориарти
Closure ктоУбийца() return Мориарти
>
The Final Countdown - fragment Europe
Top Disco Hits vol 1 track 17
9743676
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9D10
КАК ТАК ТО НУ КАК ТАК ТО
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648
ЛУЧШЕ НЕ СТАЛОhellip
ЧТО ПРОИЗОШЛО
ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
ПОЧИНИЛИclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9
D42
ЭТО ВООБЩЕ КАК
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 9
ИДЕЯ НИЧЕГО НЕ ПЕЧАТАЕТ ПОЧЕМУ
A-3B3C3 and
NullPointerExceptionD-3 and
NullPointerException
ДОБАВИМ PRINTLN
println (-3)abs()
УБЕЙТЕ ВСЕ СКОБКИ
КОМПИЛЯТОР РАЗБЕРЕТСЯ
-3Caught javalangNullPointerException Cannot invoke method abs() on null objectjavalangNullPointerException Cannot invoke method abs() on null object
at AbsolutelyGroovyrun(AbsolutelyGroovygroovy7)at comintellijrtexecutionapplicationAppMainmain(AppMainjava134)
println (-3)abs()
ldquoВсе проблемы в программировании можно решить добавив пару скобокrdquo
John McCarthy изобретатель LISP
ПРОСТО ДОБАВЬ СКОБОК
println ((-3)abs())
ИЛИ
int value = -3println valueabs()
PRIME CUTS
PRIME CUTSboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
САМ В ШОКЕ
ПОСМОТРИМ ЕЩЕ РАЗboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
boolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
AtrueBfalse
CNumberFormatException
DMissingMethodException
КАК 4 МОГЛО ОКАЗАТЬСЯ ПРОСТЫМ ЧИСЛОМhellip
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
РЕШЕНИЕ ИСПОЛЬЗУЙ ANY() ИЛИ ПЕРЕОСМЫСЛИ АЛГОРИТМ
httpkousenitwordpresscom20140418responses-to-the-closure-of-no-return
class Conference def name def year
def gr = new Conference(name Greach year 2014)
greach println it
A class=class Conferencename=Greachyear=2014
B ConferenceXXXXXX
C Startup failure
D Greach 2014
КАКОЙ ЖЕ ЭТО ITERABLE
RTFS (READ THE FING SOURCE)
MAX POWER
MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
A ClassCastExceptionB 9C 56Dnull
РАСКУСИЛ
gtgroovysh ((9 as Character) as Integer)===gt 57
ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max
СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL
A ClassCastExceptionB 9C 56Dnull
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
КАК ЭТО ПОЛУЧИЛОСЬ
def random = new Random()
def randomList = []010each randomList ltlt randomnextInt()
assert randomListmax null == randomList[0]
ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО
ДЕТЕКТИВ
КТО УБИЙЦА
A NullPointerException
B ктоУбийцаI_closure1xxxxxxx
C Startup errorD Мориарти
Closure ктоУбийца() Мориарти println ктоУбийца()
ПИЧАЛЬКА
ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ
Closure ктоУбийца() -gt Мориарти
Closure ктоУбийца() return Мориарти
>
The Final Countdown - fragment Europe
Top Disco Hits vol 1 track 17
9743676
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9D10
КАК ТАК ТО НУ КАК ТАК ТО
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648
ЛУЧШЕ НЕ СТАЛОhellip
ЧТО ПРОИЗОШЛО
ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
ПОЧИНИЛИclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9
D42
ЭТО ВООБЩЕ КАК
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 10
A-3B3C3 and
NullPointerExceptionD-3 and
NullPointerException
ДОБАВИМ PRINTLN
println (-3)abs()
УБЕЙТЕ ВСЕ СКОБКИ
КОМПИЛЯТОР РАЗБЕРЕТСЯ
-3Caught javalangNullPointerException Cannot invoke method abs() on null objectjavalangNullPointerException Cannot invoke method abs() on null object
at AbsolutelyGroovyrun(AbsolutelyGroovygroovy7)at comintellijrtexecutionapplicationAppMainmain(AppMainjava134)
println (-3)abs()
ldquoВсе проблемы в программировании можно решить добавив пару скобокrdquo
John McCarthy изобретатель LISP
ПРОСТО ДОБАВЬ СКОБОК
println ((-3)abs())
ИЛИ
int value = -3println valueabs()
PRIME CUTS
PRIME CUTSboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
САМ В ШОКЕ
ПОСМОТРИМ ЕЩЕ РАЗboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
boolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
AtrueBfalse
CNumberFormatException
DMissingMethodException
КАК 4 МОГЛО ОКАЗАТЬСЯ ПРОСТЫМ ЧИСЛОМhellip
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
РЕШЕНИЕ ИСПОЛЬЗУЙ ANY() ИЛИ ПЕРЕОСМЫСЛИ АЛГОРИТМ
httpkousenitwordpresscom20140418responses-to-the-closure-of-no-return
class Conference def name def year
def gr = new Conference(name Greach year 2014)
greach println it
A class=class Conferencename=Greachyear=2014
B ConferenceXXXXXX
C Startup failure
D Greach 2014
КАКОЙ ЖЕ ЭТО ITERABLE
RTFS (READ THE FING SOURCE)
MAX POWER
MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
A ClassCastExceptionB 9C 56Dnull
РАСКУСИЛ
gtgroovysh ((9 as Character) as Integer)===gt 57
ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max
СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL
A ClassCastExceptionB 9C 56Dnull
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
КАК ЭТО ПОЛУЧИЛОСЬ
def random = new Random()
def randomList = []010each randomList ltlt randomnextInt()
assert randomListmax null == randomList[0]
ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО
ДЕТЕКТИВ
КТО УБИЙЦА
A NullPointerException
B ктоУбийцаI_closure1xxxxxxx
C Startup errorD Мориарти
Closure ктоУбийца() Мориарти println ктоУбийца()
ПИЧАЛЬКА
ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ
Closure ктоУбийца() -gt Мориарти
Closure ктоУбийца() return Мориарти
>
The Final Countdown - fragment Europe
Top Disco Hits vol 1 track 17
9743676
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9D10
КАК ТАК ТО НУ КАК ТАК ТО
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648
ЛУЧШЕ НЕ СТАЛОhellip
ЧТО ПРОИЗОШЛО
ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
ПОЧИНИЛИclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9
D42
ЭТО ВООБЩЕ КАК
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 11
УБЕЙТЕ ВСЕ СКОБКИ
КОМПИЛЯТОР РАЗБЕРЕТСЯ
-3Caught javalangNullPointerException Cannot invoke method abs() on null objectjavalangNullPointerException Cannot invoke method abs() on null object
at AbsolutelyGroovyrun(AbsolutelyGroovygroovy7)at comintellijrtexecutionapplicationAppMainmain(AppMainjava134)
println (-3)abs()
ldquoВсе проблемы в программировании можно решить добавив пару скобокrdquo
John McCarthy изобретатель LISP
ПРОСТО ДОБАВЬ СКОБОК
println ((-3)abs())
ИЛИ
int value = -3println valueabs()
PRIME CUTS
PRIME CUTSboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
САМ В ШОКЕ
ПОСМОТРИМ ЕЩЕ РАЗboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
boolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
AtrueBfalse
CNumberFormatException
DMissingMethodException
КАК 4 МОГЛО ОКАЗАТЬСЯ ПРОСТЫМ ЧИСЛОМhellip
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
РЕШЕНИЕ ИСПОЛЬЗУЙ ANY() ИЛИ ПЕРЕОСМЫСЛИ АЛГОРИТМ
httpkousenitwordpresscom20140418responses-to-the-closure-of-no-return
class Conference def name def year
def gr = new Conference(name Greach year 2014)
greach println it
A class=class Conferencename=Greachyear=2014
B ConferenceXXXXXX
C Startup failure
D Greach 2014
КАКОЙ ЖЕ ЭТО ITERABLE
RTFS (READ THE FING SOURCE)
MAX POWER
MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
A ClassCastExceptionB 9C 56Dnull
РАСКУСИЛ
gtgroovysh ((9 as Character) as Integer)===gt 57
ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max
СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL
A ClassCastExceptionB 9C 56Dnull
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
КАК ЭТО ПОЛУЧИЛОСЬ
def random = new Random()
def randomList = []010each randomList ltlt randomnextInt()
assert randomListmax null == randomList[0]
ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО
ДЕТЕКТИВ
КТО УБИЙЦА
A NullPointerException
B ктоУбийцаI_closure1xxxxxxx
C Startup errorD Мориарти
Closure ктоУбийца() Мориарти println ктоУбийца()
ПИЧАЛЬКА
ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ
Closure ктоУбийца() -gt Мориарти
Closure ктоУбийца() return Мориарти
>
The Final Countdown - fragment Europe
Top Disco Hits vol 1 track 17
9743676
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9D10
КАК ТАК ТО НУ КАК ТАК ТО
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648
ЛУЧШЕ НЕ СТАЛОhellip
ЧТО ПРОИЗОШЛО
ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
ПОЧИНИЛИclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9
D42
ЭТО ВООБЩЕ КАК
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 12
-3Caught javalangNullPointerException Cannot invoke method abs() on null objectjavalangNullPointerException Cannot invoke method abs() on null object
at AbsolutelyGroovyrun(AbsolutelyGroovygroovy7)at comintellijrtexecutionapplicationAppMainmain(AppMainjava134)
println (-3)abs()
ldquoВсе проблемы в программировании можно решить добавив пару скобокrdquo
John McCarthy изобретатель LISP
ПРОСТО ДОБАВЬ СКОБОК
println ((-3)abs())
ИЛИ
int value = -3println valueabs()
PRIME CUTS
PRIME CUTSboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
САМ В ШОКЕ
ПОСМОТРИМ ЕЩЕ РАЗboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
boolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
AtrueBfalse
CNumberFormatException
DMissingMethodException
КАК 4 МОГЛО ОКАЗАТЬСЯ ПРОСТЫМ ЧИСЛОМhellip
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
РЕШЕНИЕ ИСПОЛЬЗУЙ ANY() ИЛИ ПЕРЕОСМЫСЛИ АЛГОРИТМ
httpkousenitwordpresscom20140418responses-to-the-closure-of-no-return
class Conference def name def year
def gr = new Conference(name Greach year 2014)
greach println it
A class=class Conferencename=Greachyear=2014
B ConferenceXXXXXX
C Startup failure
D Greach 2014
КАКОЙ ЖЕ ЭТО ITERABLE
RTFS (READ THE FING SOURCE)
MAX POWER
MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
A ClassCastExceptionB 9C 56Dnull
РАСКУСИЛ
gtgroovysh ((9 as Character) as Integer)===gt 57
ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max
СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL
A ClassCastExceptionB 9C 56Dnull
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
КАК ЭТО ПОЛУЧИЛОСЬ
def random = new Random()
def randomList = []010each randomList ltlt randomnextInt()
assert randomListmax null == randomList[0]
ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО
ДЕТЕКТИВ
КТО УБИЙЦА
A NullPointerException
B ктоУбийцаI_closure1xxxxxxx
C Startup errorD Мориарти
Closure ктоУбийца() Мориарти println ктоУбийца()
ПИЧАЛЬКА
ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ
Closure ктоУбийца() -gt Мориарти
Closure ктоУбийца() return Мориарти
>
The Final Countdown - fragment Europe
Top Disco Hits vol 1 track 17
9743676
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9D10
КАК ТАК ТО НУ КАК ТАК ТО
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648
ЛУЧШЕ НЕ СТАЛОhellip
ЧТО ПРОИЗОШЛО
ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
ПОЧИНИЛИclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9
D42
ЭТО ВООБЩЕ КАК
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 13
ldquoВсе проблемы в программировании можно решить добавив пару скобокrdquo
John McCarthy изобретатель LISP
ПРОСТО ДОБАВЬ СКОБОК
println ((-3)abs())
ИЛИ
int value = -3println valueabs()
PRIME CUTS
PRIME CUTSboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
САМ В ШОКЕ
ПОСМОТРИМ ЕЩЕ РАЗboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
boolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
AtrueBfalse
CNumberFormatException
DMissingMethodException
КАК 4 МОГЛО ОКАЗАТЬСЯ ПРОСТЫМ ЧИСЛОМhellip
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
РЕШЕНИЕ ИСПОЛЬЗУЙ ANY() ИЛИ ПЕРЕОСМЫСЛИ АЛГОРИТМ
httpkousenitwordpresscom20140418responses-to-the-closure-of-no-return
class Conference def name def year
def gr = new Conference(name Greach year 2014)
greach println it
A class=class Conferencename=Greachyear=2014
B ConferenceXXXXXX
C Startup failure
D Greach 2014
КАКОЙ ЖЕ ЭТО ITERABLE
RTFS (READ THE FING SOURCE)
MAX POWER
MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
A ClassCastExceptionB 9C 56Dnull
РАСКУСИЛ
gtgroovysh ((9 as Character) as Integer)===gt 57
ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max
СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL
A ClassCastExceptionB 9C 56Dnull
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
КАК ЭТО ПОЛУЧИЛОСЬ
def random = new Random()
def randomList = []010each randomList ltlt randomnextInt()
assert randomListmax null == randomList[0]
ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО
ДЕТЕКТИВ
КТО УБИЙЦА
A NullPointerException
B ктоУбийцаI_closure1xxxxxxx
C Startup errorD Мориарти
Closure ктоУбийца() Мориарти println ктоУбийца()
ПИЧАЛЬКА
ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ
Closure ктоУбийца() -gt Мориарти
Closure ктоУбийца() return Мориарти
>
The Final Countdown - fragment Europe
Top Disco Hits vol 1 track 17
9743676
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9D10
КАК ТАК ТО НУ КАК ТАК ТО
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648
ЛУЧШЕ НЕ СТАЛОhellip
ЧТО ПРОИЗОШЛО
ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
ПОЧИНИЛИclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9
D42
ЭТО ВООБЩЕ КАК
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 14
ПРОСТО ДОБАВЬ СКОБОК
println ((-3)abs())
ИЛИ
int value = -3println valueabs()
PRIME CUTS
PRIME CUTSboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
САМ В ШОКЕ
ПОСМОТРИМ ЕЩЕ РАЗboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
boolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
AtrueBfalse
CNumberFormatException
DMissingMethodException
КАК 4 МОГЛО ОКАЗАТЬСЯ ПРОСТЫМ ЧИСЛОМhellip
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
РЕШЕНИЕ ИСПОЛЬЗУЙ ANY() ИЛИ ПЕРЕОСМЫСЛИ АЛГОРИТМ
httpkousenitwordpresscom20140418responses-to-the-closure-of-no-return
class Conference def name def year
def gr = new Conference(name Greach year 2014)
greach println it
A class=class Conferencename=Greachyear=2014
B ConferenceXXXXXX
C Startup failure
D Greach 2014
КАКОЙ ЖЕ ЭТО ITERABLE
RTFS (READ THE FING SOURCE)
MAX POWER
MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
A ClassCastExceptionB 9C 56Dnull
РАСКУСИЛ
gtgroovysh ((9 as Character) as Integer)===gt 57
ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max
СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL
A ClassCastExceptionB 9C 56Dnull
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
КАК ЭТО ПОЛУЧИЛОСЬ
def random = new Random()
def randomList = []010each randomList ltlt randomnextInt()
assert randomListmax null == randomList[0]
ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО
ДЕТЕКТИВ
КТО УБИЙЦА
A NullPointerException
B ктоУбийцаI_closure1xxxxxxx
C Startup errorD Мориарти
Closure ктоУбийца() Мориарти println ктоУбийца()
ПИЧАЛЬКА
ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ
Closure ктоУбийца() -gt Мориарти
Closure ктоУбийца() return Мориарти
>
The Final Countdown - fragment Europe
Top Disco Hits vol 1 track 17
9743676
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9D10
КАК ТАК ТО НУ КАК ТАК ТО
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648
ЛУЧШЕ НЕ СТАЛОhellip
ЧТО ПРОИЗОШЛО
ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
ПОЧИНИЛИclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9
D42
ЭТО ВООБЩЕ КАК
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 15
PRIME CUTS
PRIME CUTSboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
САМ В ШОКЕ
ПОСМОТРИМ ЕЩЕ РАЗboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
boolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
AtrueBfalse
CNumberFormatException
DMissingMethodException
КАК 4 МОГЛО ОКАЗАТЬСЯ ПРОСТЫМ ЧИСЛОМhellip
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
РЕШЕНИЕ ИСПОЛЬЗУЙ ANY() ИЛИ ПЕРЕОСМЫСЛИ АЛГОРИТМ
httpkousenitwordpresscom20140418responses-to-the-closure-of-no-return
class Conference def name def year
def gr = new Conference(name Greach year 2014)
greach println it
A class=class Conferencename=Greachyear=2014
B ConferenceXXXXXX
C Startup failure
D Greach 2014
КАКОЙ ЖЕ ЭТО ITERABLE
RTFS (READ THE FING SOURCE)
MAX POWER
MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
A ClassCastExceptionB 9C 56Dnull
РАСКУСИЛ
gtgroovysh ((9 as Character) as Integer)===gt 57
ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max
СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL
A ClassCastExceptionB 9C 56Dnull
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
КАК ЭТО ПОЛУЧИЛОСЬ
def random = new Random()
def randomList = []010each randomList ltlt randomnextInt()
assert randomListmax null == randomList[0]
ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО
ДЕТЕКТИВ
КТО УБИЙЦА
A NullPointerException
B ктоУбийцаI_closure1xxxxxxx
C Startup errorD Мориарти
Closure ктоУбийца() Мориарти println ктоУбийца()
ПИЧАЛЬКА
ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ
Closure ктоУбийца() -gt Мориарти
Closure ктоУбийца() return Мориарти
>
The Final Countdown - fragment Europe
Top Disco Hits vol 1 track 17
9743676
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9D10
КАК ТАК ТО НУ КАК ТАК ТО
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648
ЛУЧШЕ НЕ СТАЛОhellip
ЧТО ПРОИЗОШЛО
ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
ПОЧИНИЛИclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9
D42
ЭТО ВООБЩЕ КАК
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 16
PRIME CUTSboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
САМ В ШОКЕ
ПОСМОТРИМ ЕЩЕ РАЗboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
boolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
AtrueBfalse
CNumberFormatException
DMissingMethodException
КАК 4 МОГЛО ОКАЗАТЬСЯ ПРОСТЫМ ЧИСЛОМhellip
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
РЕШЕНИЕ ИСПОЛЬЗУЙ ANY() ИЛИ ПЕРЕОСМЫСЛИ АЛГОРИТМ
httpkousenitwordpresscom20140418responses-to-the-closure-of-no-return
class Conference def name def year
def gr = new Conference(name Greach year 2014)
greach println it
A class=class Conferencename=Greachyear=2014
B ConferenceXXXXXX
C Startup failure
D Greach 2014
КАКОЙ ЖЕ ЭТО ITERABLE
RTFS (READ THE FING SOURCE)
MAX POWER
MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
A ClassCastExceptionB 9C 56Dnull
РАСКУСИЛ
gtgroovysh ((9 as Character) as Integer)===gt 57
ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max
СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL
A ClassCastExceptionB 9C 56Dnull
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
КАК ЭТО ПОЛУЧИЛОСЬ
def random = new Random()
def randomList = []010each randomList ltlt randomnextInt()
assert randomListmax null == randomList[0]
ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО
ДЕТЕКТИВ
КТО УБИЙЦА
A NullPointerException
B ктоУбийцаI_closure1xxxxxxx
C Startup errorD Мориарти
Closure ктоУбийца() Мориарти println ктоУбийца()
ПИЧАЛЬКА
ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ
Closure ктоУбийца() -gt Мориарти
Closure ктоУбийца() return Мориарти
>
The Final Countdown - fragment Europe
Top Disco Hits vol 1 track 17
9743676
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9D10
КАК ТАК ТО НУ КАК ТАК ТО
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648
ЛУЧШЕ НЕ СТАЛОhellip
ЧТО ПРОИЗОШЛО
ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
ПОЧИНИЛИclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9
D42
ЭТО ВООБЩЕ КАК
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 17
САМ В ШОКЕ
ПОСМОТРИМ ЕЩЕ РАЗboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
boolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
AtrueBfalse
CNumberFormatException
DMissingMethodException
КАК 4 МОГЛО ОКАЗАТЬСЯ ПРОСТЫМ ЧИСЛОМhellip
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
РЕШЕНИЕ ИСПОЛЬЗУЙ ANY() ИЛИ ПЕРЕОСМЫСЛИ АЛГОРИТМ
httpkousenitwordpresscom20140418responses-to-the-closure-of-no-return
class Conference def name def year
def gr = new Conference(name Greach year 2014)
greach println it
A class=class Conferencename=Greachyear=2014
B ConferenceXXXXXX
C Startup failure
D Greach 2014
КАКОЙ ЖЕ ЭТО ITERABLE
RTFS (READ THE FING SOURCE)
MAX POWER
MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
A ClassCastExceptionB 9C 56Dnull
РАСКУСИЛ
gtgroovysh ((9 as Character) as Integer)===gt 57
ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max
СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL
A ClassCastExceptionB 9C 56Dnull
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
КАК ЭТО ПОЛУЧИЛОСЬ
def random = new Random()
def randomList = []010each randomList ltlt randomnextInt()
assert randomListmax null == randomList[0]
ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО
ДЕТЕКТИВ
КТО УБИЙЦА
A NullPointerException
B ктоУбийцаI_closure1xxxxxxx
C Startup errorD Мориарти
Closure ктоУбийца() Мориарти println ктоУбийца()
ПИЧАЛЬКА
ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ
Closure ктоУбийца() -gt Мориарти
Closure ктоУбийца() return Мориарти
>
The Final Countdown - fragment Europe
Top Disco Hits vol 1 track 17
9743676
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9D10
КАК ТАК ТО НУ КАК ТАК ТО
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648
ЛУЧШЕ НЕ СТАЛОhellip
ЧТО ПРОИЗОШЛО
ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
ПОЧИНИЛИclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9
D42
ЭТО ВООБЩЕ КАК
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 18
ПОСМОТРИМ ЕЩЕ РАЗboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
boolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
AtrueBfalse
CNumberFormatException
DMissingMethodException
КАК 4 МОГЛО ОКАЗАТЬСЯ ПРОСТЫМ ЧИСЛОМhellip
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
РЕШЕНИЕ ИСПОЛЬЗУЙ ANY() ИЛИ ПЕРЕОСМЫСЛИ АЛГОРИТМ
httpkousenitwordpresscom20140418responses-to-the-closure-of-no-return
class Conference def name def year
def gr = new Conference(name Greach year 2014)
greach println it
A class=class Conferencename=Greachyear=2014
B ConferenceXXXXXX
C Startup failure
D Greach 2014
КАКОЙ ЖЕ ЭТО ITERABLE
RTFS (READ THE FING SOURCE)
MAX POWER
MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
A ClassCastExceptionB 9C 56Dnull
РАСКУСИЛ
gtgroovysh ((9 as Character) as Integer)===gt 57
ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max
СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL
A ClassCastExceptionB 9C 56Dnull
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
КАК ЭТО ПОЛУЧИЛОСЬ
def random = new Random()
def randomList = []010each randomList ltlt randomnextInt()
assert randomListmax null == randomList[0]
ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО
ДЕТЕКТИВ
КТО УБИЙЦА
A NullPointerException
B ктоУбийцаI_closure1xxxxxxx
C Startup errorD Мориарти
Closure ктоУбийца() Мориарти println ктоУбийца()
ПИЧАЛЬКА
ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ
Closure ктоУбийца() -gt Мориарти
Closure ктоУбийца() return Мориарти
>
The Final Countdown - fragment Europe
Top Disco Hits vol 1 track 17
9743676
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9D10
КАК ТАК ТО НУ КАК ТАК ТО
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648
ЛУЧШЕ НЕ СТАЛОhellip
ЧТО ПРОИЗОШЛО
ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
ПОЧИНИЛИclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9
D42
ЭТО ВООБЩЕ КАК
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 19
boolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true
println isPrime(4 as Double)
AtrueBfalse
CNumberFormatException
DMissingMethodException
КАК 4 МОГЛО ОКАЗАТЬСЯ ПРОСТЫМ ЧИСЛОМhellip
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
РЕШЕНИЕ ИСПОЛЬЗУЙ ANY() ИЛИ ПЕРЕОСМЫСЛИ АЛГОРИТМ
httpkousenitwordpresscom20140418responses-to-the-closure-of-no-return
class Conference def name def year
def gr = new Conference(name Greach year 2014)
greach println it
A class=class Conferencename=Greachyear=2014
B ConferenceXXXXXX
C Startup failure
D Greach 2014
КАКОЙ ЖЕ ЭТО ITERABLE
RTFS (READ THE FING SOURCE)
MAX POWER
MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
A ClassCastExceptionB 9C 56Dnull
РАСКУСИЛ
gtgroovysh ((9 as Character) as Integer)===gt 57
ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max
СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL
A ClassCastExceptionB 9C 56Dnull
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
КАК ЭТО ПОЛУЧИЛОСЬ
def random = new Random()
def randomList = []010each randomList ltlt randomnextInt()
assert randomListmax null == randomList[0]
ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО
ДЕТЕКТИВ
КТО УБИЙЦА
A NullPointerException
B ктоУбийцаI_closure1xxxxxxx
C Startup errorD Мориарти
Closure ктоУбийца() Мориарти println ктоУбийца()
ПИЧАЛЬКА
ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ
Closure ктоУбийца() -gt Мориарти
Closure ктоУбийца() return Мориарти
>
The Final Countdown - fragment Europe
Top Disco Hits vol 1 track 17
9743676
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9D10
КАК ТАК ТО НУ КАК ТАК ТО
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648
ЛУЧШЕ НЕ СТАЛОhellip
ЧТО ПРОИЗОШЛО
ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
ПОЧИНИЛИclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9
D42
ЭТО ВООБЩЕ КАК
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 20
КАК 4 МОГЛО ОКАЗАТЬСЯ ПРОСТЫМ ЧИСЛОМhellip
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
РЕШЕНИЕ ИСПОЛЬЗУЙ ANY() ИЛИ ПЕРЕОСМЫСЛИ АЛГОРИТМ
httpkousenitwordpresscom20140418responses-to-the-closure-of-no-return
class Conference def name def year
def gr = new Conference(name Greach year 2014)
greach println it
A class=class Conferencename=Greachyear=2014
B ConferenceXXXXXX
C Startup failure
D Greach 2014
КАКОЙ ЖЕ ЭТО ITERABLE
RTFS (READ THE FING SOURCE)
MAX POWER
MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
A ClassCastExceptionB 9C 56Dnull
РАСКУСИЛ
gtgroovysh ((9 as Character) as Integer)===gt 57
ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max
СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL
A ClassCastExceptionB 9C 56Dnull
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
КАК ЭТО ПОЛУЧИЛОСЬ
def random = new Random()
def randomList = []010each randomList ltlt randomnextInt()
assert randomListmax null == randomList[0]
ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО
ДЕТЕКТИВ
КТО УБИЙЦА
A NullPointerException
B ктоУбийцаI_closure1xxxxxxx
C Startup errorD Мориарти
Closure ктоУбийца() Мориарти println ктоУбийца()
ПИЧАЛЬКА
ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ
Closure ктоУбийца() -gt Мориарти
Closure ктоУбийца() return Мориарти
>
The Final Countdown - fragment Europe
Top Disco Hits vol 1 track 17
9743676
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9D10
КАК ТАК ТО НУ КАК ТАК ТО
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648
ЛУЧШЕ НЕ СТАЛОhellip
ЧТО ПРОИЗОШЛО
ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
ПОЧИНИЛИclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9
D42
ЭТО ВООБЩЕ КАК
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 21
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
РЕШЕНИЕ ИСПОЛЬЗУЙ ANY() ИЛИ ПЕРЕОСМЫСЛИ АЛГОРИТМ
httpkousenitwordpresscom20140418responses-to-the-closure-of-no-return
class Conference def name def year
def gr = new Conference(name Greach year 2014)
greach println it
A class=class Conferencename=Greachyear=2014
B ConferenceXXXXXX
C Startup failure
D Greach 2014
КАКОЙ ЖЕ ЭТО ITERABLE
RTFS (READ THE FING SOURCE)
MAX POWER
MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
A ClassCastExceptionB 9C 56Dnull
РАСКУСИЛ
gtgroovysh ((9 as Character) as Integer)===gt 57
ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max
СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL
A ClassCastExceptionB 9C 56Dnull
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
КАК ЭТО ПОЛУЧИЛОСЬ
def random = new Random()
def randomList = []010each randomList ltlt randomnextInt()
assert randomListmax null == randomList[0]
ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО
ДЕТЕКТИВ
КТО УБИЙЦА
A NullPointerException
B ктоУбийцаI_closure1xxxxxxx
C Startup errorD Мориарти
Closure ктоУбийца() Мориарти println ктоУбийца()
ПИЧАЛЬКА
ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ
Closure ктоУбийца() -gt Мориарти
Closure ктоУбийца() return Мориарти
>
The Final Countdown - fragment Europe
Top Disco Hits vol 1 track 17
9743676
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9D10
КАК ТАК ТО НУ КАК ТАК ТО
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648
ЛУЧШЕ НЕ СТАЛОhellip
ЧТО ПРОИЗОШЛО
ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
ПОЧИНИЛИclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9
D42
ЭТО ВООБЩЕ КАК
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 22
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
РЕШЕНИЕ ИСПОЛЬЗУЙ ANY() ИЛИ ПЕРЕОСМЫСЛИ АЛГОРИТМ
httpkousenitwordpresscom20140418responses-to-the-closure-of-no-return
class Conference def name def year
def gr = new Conference(name Greach year 2014)
greach println it
A class=class Conferencename=Greachyear=2014
B ConferenceXXXXXX
C Startup failure
D Greach 2014
КАКОЙ ЖЕ ЭТО ITERABLE
RTFS (READ THE FING SOURCE)
MAX POWER
MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
A ClassCastExceptionB 9C 56Dnull
РАСКУСИЛ
gtgroovysh ((9 as Character) as Integer)===gt 57
ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max
СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL
A ClassCastExceptionB 9C 56Dnull
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
КАК ЭТО ПОЛУЧИЛОСЬ
def random = new Random()
def randomList = []010each randomList ltlt randomnextInt()
assert randomListmax null == randomList[0]
ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО
ДЕТЕКТИВ
КТО УБИЙЦА
A NullPointerException
B ктоУбийцаI_closure1xxxxxxx
C Startup errorD Мориарти
Closure ктоУбийца() Мориарти println ктоУбийца()
ПИЧАЛЬКА
ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ
Closure ктоУбийца() -gt Мориарти
Closure ктоУбийца() return Мориарти
>
The Final Countdown - fragment Europe
Top Disco Hits vol 1 track 17
9743676
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9D10
КАК ТАК ТО НУ КАК ТАК ТО
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648
ЛУЧШЕ НЕ СТАЛОhellip
ЧТО ПРОИЗОШЛО
ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
ПОЧИНИЛИclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9
D42
ЭТО ВООБЩЕ КАК
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 23
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
РЕШЕНИЕ ИСПОЛЬЗУЙ ANY() ИЛИ ПЕРЕОСМЫСЛИ АЛГОРИТМ
httpkousenitwordpresscom20140418responses-to-the-closure-of-no-return
class Conference def name def year
def gr = new Conference(name Greach year 2014)
greach println it
A class=class Conferencename=Greachyear=2014
B ConferenceXXXXXX
C Startup failure
D Greach 2014
КАКОЙ ЖЕ ЭТО ITERABLE
RTFS (READ THE FING SOURCE)
MAX POWER
MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
A ClassCastExceptionB 9C 56Dnull
РАСКУСИЛ
gtgroovysh ((9 as Character) as Integer)===gt 57
ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max
СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL
A ClassCastExceptionB 9C 56Dnull
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
КАК ЭТО ПОЛУЧИЛОСЬ
def random = new Random()
def randomList = []010each randomList ltlt randomnextInt()
assert randomListmax null == randomList[0]
ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО
ДЕТЕКТИВ
КТО УБИЙЦА
A NullPointerException
B ктоУбийцаI_closure1xxxxxxx
C Startup errorD Мориарти
Closure ктоУбийца() Мориарти println ктоУбийца()
ПИЧАЛЬКА
ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ
Closure ктоУбийца() -gt Мориарти
Closure ктоУбийца() return Мориарти
>
The Final Countdown - fragment Europe
Top Disco Hits vol 1 track 17
9743676
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9D10
КАК ТАК ТО НУ КАК ТАК ТО
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648
ЛУЧШЕ НЕ СТАЛОhellip
ЧТО ПРОИЗОШЛО
ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
ПОЧИНИЛИclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9
D42
ЭТО ВООБЩЕ КАК
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 24
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
РЕШЕНИЕ ИСПОЛЬЗУЙ ANY() ИЛИ ПЕРЕОСМЫСЛИ АЛГОРИТМ
httpkousenitwordpresscom20140418responses-to-the-closure-of-no-return
class Conference def name def year
def gr = new Conference(name Greach year 2014)
greach println it
A class=class Conferencename=Greachyear=2014
B ConferenceXXXXXX
C Startup failure
D Greach 2014
КАКОЙ ЖЕ ЭТО ITERABLE
RTFS (READ THE FING SOURCE)
MAX POWER
MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
A ClassCastExceptionB 9C 56Dnull
РАСКУСИЛ
gtgroovysh ((9 as Character) as Integer)===gt 57
ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max
СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL
A ClassCastExceptionB 9C 56Dnull
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
КАК ЭТО ПОЛУЧИЛОСЬ
def random = new Random()
def randomList = []010each randomList ltlt randomnextInt()
assert randomListmax null == randomList[0]
ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО
ДЕТЕКТИВ
КТО УБИЙЦА
A NullPointerException
B ктоУбийцаI_closure1xxxxxxx
C Startup errorD Мориарти
Closure ктоУбийца() Мориарти println ктоУбийца()
ПИЧАЛЬКА
ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ
Closure ктоУбийца() -gt Мориарти
Closure ктоУбийца() return Мориарти
>
The Final Countdown - fragment Europe
Top Disco Hits vol 1 track 17
9743676
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9D10
КАК ТАК ТО НУ КАК ТАК ТО
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648
ЛУЧШЕ НЕ СТАЛОhellip
ЧТО ПРОИЗОШЛО
ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
ПОЧИНИЛИclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9
D42
ЭТО ВООБЩЕ КАК
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 25
ДАВАЙТЕ РАЗБИРАТЬСЯ
РЕШЕНИЕ ИСПОЛЬЗУЙ ANY() ИЛИ ПЕРЕОСМЫСЛИ АЛГОРИТМ
httpkousenitwordpresscom20140418responses-to-the-closure-of-no-return
class Conference def name def year
def gr = new Conference(name Greach year 2014)
greach println it
A class=class Conferencename=Greachyear=2014
B ConferenceXXXXXX
C Startup failure
D Greach 2014
КАКОЙ ЖЕ ЭТО ITERABLE
RTFS (READ THE FING SOURCE)
MAX POWER
MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
A ClassCastExceptionB 9C 56Dnull
РАСКУСИЛ
gtgroovysh ((9 as Character) as Integer)===gt 57
ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max
СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL
A ClassCastExceptionB 9C 56Dnull
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
КАК ЭТО ПОЛУЧИЛОСЬ
def random = new Random()
def randomList = []010each randomList ltlt randomnextInt()
assert randomListmax null == randomList[0]
ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО
ДЕТЕКТИВ
КТО УБИЙЦА
A NullPointerException
B ктоУбийцаI_closure1xxxxxxx
C Startup errorD Мориарти
Closure ктоУбийца() Мориарти println ктоУбийца()
ПИЧАЛЬКА
ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ
Closure ктоУбийца() -gt Мориарти
Closure ктоУбийца() return Мориарти
>
The Final Countdown - fragment Europe
Top Disco Hits vol 1 track 17
9743676
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9D10
КАК ТАК ТО НУ КАК ТАК ТО
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648
ЛУЧШЕ НЕ СТАЛОhellip
ЧТО ПРОИЗОШЛО
ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
ПОЧИНИЛИclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9
D42
ЭТО ВООБЩЕ КАК
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 26
РЕШЕНИЕ ИСПОЛЬЗУЙ ANY() ИЛИ ПЕРЕОСМЫСЛИ АЛГОРИТМ
httpkousenitwordpresscom20140418responses-to-the-closure-of-no-return
class Conference def name def year
def gr = new Conference(name Greach year 2014)
greach println it
A class=class Conferencename=Greachyear=2014
B ConferenceXXXXXX
C Startup failure
D Greach 2014
КАКОЙ ЖЕ ЭТО ITERABLE
RTFS (READ THE FING SOURCE)
MAX POWER
MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
A ClassCastExceptionB 9C 56Dnull
РАСКУСИЛ
gtgroovysh ((9 as Character) as Integer)===gt 57
ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max
СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL
A ClassCastExceptionB 9C 56Dnull
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
КАК ЭТО ПОЛУЧИЛОСЬ
def random = new Random()
def randomList = []010each randomList ltlt randomnextInt()
assert randomListmax null == randomList[0]
ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО
ДЕТЕКТИВ
КТО УБИЙЦА
A NullPointerException
B ктоУбийцаI_closure1xxxxxxx
C Startup errorD Мориарти
Closure ктоУбийца() Мориарти println ктоУбийца()
ПИЧАЛЬКА
ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ
Closure ктоУбийца() -gt Мориарти
Closure ктоУбийца() return Мориарти
>
The Final Countdown - fragment Europe
Top Disco Hits vol 1 track 17
9743676
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9D10
КАК ТАК ТО НУ КАК ТАК ТО
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648
ЛУЧШЕ НЕ СТАЛОhellip
ЧТО ПРОИЗОШЛО
ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
ПОЧИНИЛИclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9
D42
ЭТО ВООБЩЕ КАК
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 27
class Conference def name def year
def gr = new Conference(name Greach year 2014)
greach println it
A class=class Conferencename=Greachyear=2014
B ConferenceXXXXXX
C Startup failure
D Greach 2014
КАКОЙ ЖЕ ЭТО ITERABLE
RTFS (READ THE FING SOURCE)
MAX POWER
MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
A ClassCastExceptionB 9C 56Dnull
РАСКУСИЛ
gtgroovysh ((9 as Character) as Integer)===gt 57
ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max
СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL
A ClassCastExceptionB 9C 56Dnull
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
КАК ЭТО ПОЛУЧИЛОСЬ
def random = new Random()
def randomList = []010each randomList ltlt randomnextInt()
assert randomListmax null == randomList[0]
ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО
ДЕТЕКТИВ
КТО УБИЙЦА
A NullPointerException
B ктоУбийцаI_closure1xxxxxxx
C Startup errorD Мориарти
Closure ктоУбийца() Мориарти println ктоУбийца()
ПИЧАЛЬКА
ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ
Closure ктоУбийца() -gt Мориарти
Closure ктоУбийца() return Мориарти
>
The Final Countdown - fragment Europe
Top Disco Hits vol 1 track 17
9743676
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9D10
КАК ТАК ТО НУ КАК ТАК ТО
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648
ЛУЧШЕ НЕ СТАЛОhellip
ЧТО ПРОИЗОШЛО
ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
ПОЧИНИЛИclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9
D42
ЭТО ВООБЩЕ КАК
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 28
КАКОЙ ЖЕ ЭТО ITERABLE
RTFS (READ THE FING SOURCE)
MAX POWER
MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
A ClassCastExceptionB 9C 56Dnull
РАСКУСИЛ
gtgroovysh ((9 as Character) as Integer)===gt 57
ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max
СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL
A ClassCastExceptionB 9C 56Dnull
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
КАК ЭТО ПОЛУЧИЛОСЬ
def random = new Random()
def randomList = []010each randomList ltlt randomnextInt()
assert randomListmax null == randomList[0]
ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО
ДЕТЕКТИВ
КТО УБИЙЦА
A NullPointerException
B ктоУбийцаI_closure1xxxxxxx
C Startup errorD Мориарти
Closure ктоУбийца() Мориарти println ктоУбийца()
ПИЧАЛЬКА
ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ
Closure ктоУбийца() -gt Мориарти
Closure ктоУбийца() return Мориарти
>
The Final Countdown - fragment Europe
Top Disco Hits vol 1 track 17
9743676
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9D10
КАК ТАК ТО НУ КАК ТАК ТО
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648
ЛУЧШЕ НЕ СТАЛОhellip
ЧТО ПРОИЗОШЛО
ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
ПОЧИНИЛИclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9
D42
ЭТО ВООБЩЕ КАК
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 29
RTFS (READ THE FING SOURCE)
MAX POWER
MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
A ClassCastExceptionB 9C 56Dnull
РАСКУСИЛ
gtgroovysh ((9 as Character) as Integer)===gt 57
ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max
СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL
A ClassCastExceptionB 9C 56Dnull
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
КАК ЭТО ПОЛУЧИЛОСЬ
def random = new Random()
def randomList = []010each randomList ltlt randomnextInt()
assert randomListmax null == randomList[0]
ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО
ДЕТЕКТИВ
КТО УБИЙЦА
A NullPointerException
B ктоУбийцаI_closure1xxxxxxx
C Startup errorD Мориарти
Closure ктоУбийца() Мориарти println ктоУбийца()
ПИЧАЛЬКА
ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ
Closure ктоУбийца() -gt Мориарти
Closure ктоУбийца() return Мориарти
>
The Final Countdown - fragment Europe
Top Disco Hits vol 1 track 17
9743676
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9D10
КАК ТАК ТО НУ КАК ТАК ТО
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648
ЛУЧШЕ НЕ СТАЛОhellip
ЧТО ПРОИЗОШЛО
ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
ПОЧИНИЛИclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9
D42
ЭТО ВООБЩЕ КАК
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 30
MAX POWER
MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
A ClassCastExceptionB 9C 56Dnull
РАСКУСИЛ
gtgroovysh ((9 as Character) as Integer)===gt 57
ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max
СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL
A ClassCastExceptionB 9C 56Dnull
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
КАК ЭТО ПОЛУЧИЛОСЬ
def random = new Random()
def randomList = []010each randomList ltlt randomnextInt()
assert randomListmax null == randomList[0]
ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО
ДЕТЕКТИВ
КТО УБИЙЦА
A NullPointerException
B ктоУбийцаI_closure1xxxxxxx
C Startup errorD Мориарти
Closure ктоУбийца() Мориарти println ктоУбийца()
ПИЧАЛЬКА
ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ
Closure ктоУбийца() -gt Мориарти
Closure ктоУбийца() return Мориарти
>
The Final Countdown - fragment Europe
Top Disco Hits vol 1 track 17
9743676
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9D10
КАК ТАК ТО НУ КАК ТАК ТО
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648
ЛУЧШЕ НЕ СТАЛОhellip
ЧТО ПРОИЗОШЛО
ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
ПОЧИНИЛИclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9
D42
ЭТО ВООБЩЕ КАК
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 31
MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
A ClassCastExceptionB 9C 56Dnull
РАСКУСИЛ
gtgroovysh ((9 as Character) as Integer)===gt 57
ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max
СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL
A ClassCastExceptionB 9C 56Dnull
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
КАК ЭТО ПОЛУЧИЛОСЬ
def random = new Random()
def randomList = []010each randomList ltlt randomnextInt()
assert randomListmax null == randomList[0]
ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО
ДЕТЕКТИВ
КТО УБИЙЦА
A NullPointerException
B ктоУбийцаI_closure1xxxxxxx
C Startup errorD Мориарти
Closure ктоУбийца() Мориарти println ктоУбийца()
ПИЧАЛЬКА
ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ
Closure ктоУбийца() -gt Мориарти
Closure ктоУбийца() return Мориарти
>
The Final Countdown - fragment Europe
Top Disco Hits vol 1 track 17
9743676
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9D10
КАК ТАК ТО НУ КАК ТАК ТО
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648
ЛУЧШЕ НЕ СТАЛОhellip
ЧТО ПРОИЗОШЛО
ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
ПОЧИНИЛИclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9
D42
ЭТО ВООБЩЕ КАК
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 32
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
A ClassCastExceptionB 9C 56Dnull
РАСКУСИЛ
gtgroovysh ((9 as Character) as Integer)===gt 57
ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max
СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL
A ClassCastExceptionB 9C 56Dnull
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
КАК ЭТО ПОЛУЧИЛОСЬ
def random = new Random()
def randomList = []010each randomList ltlt randomnextInt()
assert randomListmax null == randomList[0]
ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО
ДЕТЕКТИВ
КТО УБИЙЦА
A NullPointerException
B ктоУбийцаI_closure1xxxxxxx
C Startup errorD Мориарти
Closure ктоУбийца() Мориарти println ктоУбийца()
ПИЧАЛЬКА
ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ
Closure ктоУбийца() -gt Мориарти
Closure ктоУбийца() return Мориарти
>
The Final Countdown - fragment Europe
Top Disco Hits vol 1 track 17
9743676
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9D10
КАК ТАК ТО НУ КАК ТАК ТО
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648
ЛУЧШЕ НЕ СТАЛОhellip
ЧТО ПРОИЗОШЛО
ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
ПОЧИНИЛИclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9
D42
ЭТО ВООБЩЕ КАК
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 33
РАСКУСИЛ
gtgroovysh ((9 as Character) as Integer)===gt 57
ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max
СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL
A ClassCastExceptionB 9C 56Dnull
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
КАК ЭТО ПОЛУЧИЛОСЬ
def random = new Random()
def randomList = []010each randomList ltlt randomnextInt()
assert randomListmax null == randomList[0]
ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО
ДЕТЕКТИВ
КТО УБИЙЦА
A NullPointerException
B ктоУбийцаI_closure1xxxxxxx
C Startup errorD Мориарти
Closure ктоУбийца() Мориарти println ктоУбийца()
ПИЧАЛЬКА
ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ
Closure ктоУбийца() -gt Мориарти
Closure ктоУбийца() return Мориарти
>
The Final Countdown - fragment Europe
Top Disco Hits vol 1 track 17
9743676
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9D10
КАК ТАК ТО НУ КАК ТАК ТО
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648
ЛУЧШЕ НЕ СТАЛОhellip
ЧТО ПРОИЗОШЛО
ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
ПОЧИНИЛИclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9
D42
ЭТО ВООБЩЕ КАК
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 34
ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max
СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL
A ClassCastExceptionB 9C 56Dnull
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
КАК ЭТО ПОЛУЧИЛОСЬ
def random = new Random()
def randomList = []010each randomList ltlt randomnextInt()
assert randomListmax null == randomList[0]
ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО
ДЕТЕКТИВ
КТО УБИЙЦА
A NullPointerException
B ктоУбийцаI_closure1xxxxxxx
C Startup errorD Мориарти
Closure ктоУбийца() Мориарти println ктоУбийца()
ПИЧАЛЬКА
ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ
Closure ктоУбийца() -gt Мориарти
Closure ктоУбийца() return Мориарти
>
The Final Countdown - fragment Europe
Top Disco Hits vol 1 track 17
9743676
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9D10
КАК ТАК ТО НУ КАК ТАК ТО
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648
ЛУЧШЕ НЕ СТАЛОhellip
ЧТО ПРОИЗОШЛО
ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
ПОЧИНИЛИclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9
D42
ЭТО ВООБЩЕ КАК
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 35
СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL
A ClassCastExceptionB 9C 56Dnull
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
КАК ЭТО ПОЛУЧИЛОСЬ
def random = new Random()
def randomList = []010each randomList ltlt randomnextInt()
assert randomListmax null == randomList[0]
ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО
ДЕТЕКТИВ
КТО УБИЙЦА
A NullPointerException
B ктоУбийцаI_closure1xxxxxxx
C Startup errorD Мориарти
Closure ктоУбийца() Мориарти println ктоУбийца()
ПИЧАЛЬКА
ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ
Closure ктоУбийца() -gt Мориарти
Closure ктоУбийца() return Мориарти
>
The Final Countdown - fragment Europe
Top Disco Hits vol 1 track 17
9743676
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9D10
КАК ТАК ТО НУ КАК ТАК ТО
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648
ЛУЧШЕ НЕ СТАЛОhellip
ЧТО ПРОИЗОШЛО
ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
ПОЧИНИЛИclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9
D42
ЭТО ВООБЩЕ КАК
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 36
A ClassCastExceptionB 9C 56Dnull
ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max
КАК ЭТО ПОЛУЧИЛОСЬ
def random = new Random()
def randomList = []010each randomList ltlt randomnextInt()
assert randomListmax null == randomList[0]
ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО
ДЕТЕКТИВ
КТО УБИЙЦА
A NullPointerException
B ктоУбийцаI_closure1xxxxxxx
C Startup errorD Мориарти
Closure ктоУбийца() Мориарти println ктоУбийца()
ПИЧАЛЬКА
ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ
Closure ктоУбийца() -gt Мориарти
Closure ктоУбийца() return Мориарти
>
The Final Countdown - fragment Europe
Top Disco Hits vol 1 track 17
9743676
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9D10
КАК ТАК ТО НУ КАК ТАК ТО
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648
ЛУЧШЕ НЕ СТАЛОhellip
ЧТО ПРОИЗОШЛО
ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
ПОЧИНИЛИclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9
D42
ЭТО ВООБЩЕ КАК
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 37
КАК ЭТО ПОЛУЧИЛОСЬ
def random = new Random()
def randomList = []010each randomList ltlt randomnextInt()
assert randomListmax null == randomList[0]
ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО
ДЕТЕКТИВ
КТО УБИЙЦА
A NullPointerException
B ктоУбийцаI_closure1xxxxxxx
C Startup errorD Мориарти
Closure ктоУбийца() Мориарти println ктоУбийца()
ПИЧАЛЬКА
ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ
Closure ктоУбийца() -gt Мориарти
Closure ктоУбийца() return Мориарти
>
The Final Countdown - fragment Europe
Top Disco Hits vol 1 track 17
9743676
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9D10
КАК ТАК ТО НУ КАК ТАК ТО
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648
ЛУЧШЕ НЕ СТАЛОhellip
ЧТО ПРОИЗОШЛО
ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
ПОЧИНИЛИclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9
D42
ЭТО ВООБЩЕ КАК
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 38
ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО
ДЕТЕКТИВ
КТО УБИЙЦА
A NullPointerException
B ктоУбийцаI_closure1xxxxxxx
C Startup errorD Мориарти
Closure ктоУбийца() Мориарти println ктоУбийца()
ПИЧАЛЬКА
ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ
Closure ктоУбийца() -gt Мориарти
Closure ктоУбийца() return Мориарти
>
The Final Countdown - fragment Europe
Top Disco Hits vol 1 track 17
9743676
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9D10
КАК ТАК ТО НУ КАК ТАК ТО
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648
ЛУЧШЕ НЕ СТАЛОhellip
ЧТО ПРОИЗОШЛО
ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
ПОЧИНИЛИclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9
D42
ЭТО ВООБЩЕ КАК
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 39
ДЕТЕКТИВ
КТО УБИЙЦА
A NullPointerException
B ктоУбийцаI_closure1xxxxxxx
C Startup errorD Мориарти
Closure ктоУбийца() Мориарти println ктоУбийца()
ПИЧАЛЬКА
ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ
Closure ктоУбийца() -gt Мориарти
Closure ктоУбийца() return Мориарти
>
The Final Countdown - fragment Europe
Top Disco Hits vol 1 track 17
9743676
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9D10
КАК ТАК ТО НУ КАК ТАК ТО
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648
ЛУЧШЕ НЕ СТАЛОhellip
ЧТО ПРОИЗОШЛО
ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
ПОЧИНИЛИclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9
D42
ЭТО ВООБЩЕ КАК
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 40
КТО УБИЙЦА
A NullPointerException
B ктоУбийцаI_closure1xxxxxxx
C Startup errorD Мориарти
Closure ктоУбийца() Мориарти println ктоУбийца()
ПИЧАЛЬКА
ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ
Closure ктоУбийца() -gt Мориарти
Closure ктоУбийца() return Мориарти
>
The Final Countdown - fragment Europe
Top Disco Hits vol 1 track 17
9743676
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9D10
КАК ТАК ТО НУ КАК ТАК ТО
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648
ЛУЧШЕ НЕ СТАЛОhellip
ЧТО ПРОИЗОШЛО
ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
ПОЧИНИЛИclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9
D42
ЭТО ВООБЩЕ КАК
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 41
ПИЧАЛЬКА
ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ
Closure ктоУбийца() -gt Мориарти
Closure ктоУбийца() return Мориарти
>
The Final Countdown - fragment Europe
Top Disco Hits vol 1 track 17
9743676
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9D10
КАК ТАК ТО НУ КАК ТАК ТО
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648
ЛУЧШЕ НЕ СТАЛОhellip
ЧТО ПРОИЗОШЛО
ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
ПОЧИНИЛИclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9
D42
ЭТО ВООБЩЕ КАК
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 42
ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ
Closure ктоУбийца() -gt Мориарти
Closure ктоУбийца() return Мориарти
>
The Final Countdown - fragment Europe
Top Disco Hits vol 1 track 17
9743676
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9D10
КАК ТАК ТО НУ КАК ТАК ТО
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648
ЛУЧШЕ НЕ СТАЛОhellip
ЧТО ПРОИЗОШЛО
ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
ПОЧИНИЛИclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9
D42
ЭТО ВООБЩЕ КАК
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 43
>
The Final Countdown - fragment Europe
Top Disco Hits vol 1 track 17
9743676
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9D10
КАК ТАК ТО НУ КАК ТАК ТО
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648
ЛУЧШЕ НЕ СТАЛОhellip
ЧТО ПРОИЗОШЛО
ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
ПОЧИНИЛИclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9
D42
ЭТО ВООБЩЕ КАК
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 44
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9D10
КАК ТАК ТО НУ КАК ТАК ТО
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648
ЛУЧШЕ НЕ СТАЛОhellip
ЧТО ПРОИЗОШЛО
ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
ПОЧИНИЛИclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9
D42
ЭТО ВООБЩЕ КАК
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 45
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9D10
КАК ТАК ТО НУ КАК ТАК ТО
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648
ЛУЧШЕ НЕ СТАЛОhellip
ЧТО ПРОИЗОШЛО
ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
ПОЧИНИЛИclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9
D42
ЭТО ВООБЩЕ КАК
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 46
КАК ТАК ТО НУ КАК ТАК ТО
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648
ЛУЧШЕ НЕ СТАЛОhellip
ЧТО ПРОИЗОШЛО
ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
ПОЧИНИЛИclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9
D42
ЭТО ВООБЩЕ КАК
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 47
class CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown
println finalCountDown()counter
orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648
ЛУЧШЕ НЕ СТАЛОhellip
ЧТО ПРОИЗОШЛО
ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
ПОЧИНИЛИclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9
D42
ЭТО ВООБЩЕ КАК
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 48
ЛУЧШЕ НЕ СТАЛОhellip
ЧТО ПРОИЗОШЛО
ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
ПОЧИНИЛИclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9
D42
ЭТО ВООБЩЕ КАК
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 49
ЧТО ПРОИЗОШЛО
ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
ПОЧИНИЛИclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9
D42
ЭТО ВООБЩЕ КАК
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 50
ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
ПОЧИНИЛИclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9
D42
ЭТО ВООБЩЕ КАК
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 51
ПОЧИНИЛИclass CountDown int counter = 10
CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42
println finalCountDown()counter
AStartup failureBThat will never happen
-2147483648C9
D42
ЭТО ВООБЩЕ КАК
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 52
ЭТО ВООБЩЕ КАК
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 53
PUBLIC - PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 54
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 55
trait Public public String property = I am all public
class Property implements Public
Property publicProperty = new Property()
A publicPropertyproperty
B publicPropertyPublic__property
C publicPropertygetProperty()
D publicPropertyproperty
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 56
У МЕНЯ ДВА ВОПРОСА
1Что за дебильное имя
2 Откуда я мог это знать
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 57
ОТВЕТ НА 1 IN SOVIET RUSSIA
YOU DONrsquoT ACCESS PUBLIC
PROPERTY
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 58
ОТВЕТ НА 2
httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml
А ты документацию читать не пробовал
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 59
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 60
ГДЕ КАРТА БИЛЛИ
def key = xdef map = [key treasure]def value = mapget(key)println value
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 61
def key = xdef map = [key treasure]def value = mapget(key)println value
ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000
чертей
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 62
КАК ЭТО NULL
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 63
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 64
ЧИНИМ
1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 65
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 66
ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 67
def map = [2 treasure]def key = 2def value = map$keyprintln value
ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 68
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 69
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
def map = [2 treasure]println mapkeySet()first()classname
javalangInteger
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 70
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 71
НАМ НУЖНА КАРТА
def key = xdef map = [$key treasure]def value = map[x]println value
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 72
ANoSuchElementExceptionBnullCtreasureDПолундра Startup error
def key = xdef map = [$key treasure]def value = map[x]println value
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 73
ЧТО ОПЯТЬ
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 74
STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН
def map = [$key treasure]println mapkeySet()first()classname
orgcodehausgroovyruntimeGStringImpl
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 75
OUT OF RANGE
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 76
AAssertion FailedBfalseCtrueDNullPointerException
OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 77
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 78
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 79
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 80
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3
Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()
10 20 30 40 50 60 70 80 90 100
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 81
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 82
GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 83
ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100
bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно
bullИ пусть делегирует в containsWithinBounds
bullПочините наконец GROOVY-2771
bullThank you
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 84
POWER RANGE(RS)
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 85
УБИРАЕМ ЕДИНИЧКУ
A -1012345678
C[0 2 3 4 5 6 7 8 9]
D[-1 0 1 2 3 4 5 6 7 8]
[09]each println(it - 1)
B0123456789
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 86
[09]each println(it - 1)
Это неправильные скобки
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 87
(09)each println(it - 1)
Другое дело
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 88
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 89
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 90
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 91
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 92
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 93
ОБМАНУЛИ ДУРАКА
[0 2 3 4 5 6 7 8 9]
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 94
SAVE THE DATE
JOKERCONF IS COMING
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 95
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
JAVA2 КТО ПОМНИТ
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 96
ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list
AStartup FailureB[1 2 3 WED Oct 17
161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 97
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 98
ERASURE
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 99
ERASURE
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 100
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 101
laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo
ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname
[javalangLong javalangLong javalangLong javautilDate javalangString]
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 102
COMPILESTATIC
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 103
π ndash ТОРТ И ЧИСЛО
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 104
DOUBLE THE PI
double value = 3println $value14isDouble()
A trueB MissingPropertyExceptionC falseDMissingMethodException
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 105
ПРОСЁК
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 106
ПРОСЁК
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 107
ПРОСЁК
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 108
A trueB MissingPropertyExceptionC falseDMissingMethodException
DOUBLE THE PI
double value = 3println $value14isDouble()
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 109
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 110
ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 111
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP
СПРОСИ ФРАНЦУЗОВ
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 112
RSVP
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 113
class Invite int attending = 1
def invite = new Invite()def attendees = (inviteattending) +1println attendees
A Startup FailureB 1C 2D MissingPropertyException
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 114
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 115
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def attendees = (new Invite()attending) + 1println attendees
НАПРИМЕР
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 116
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
def invite = new Invite()def attendees = inviteattending +1
НУ ИЛИ УБРАТЬ СКОБКИ
Как убрать скобки
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 117
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 118
class MrHyde def me() return this
class DrJekyll
DrJekyllmixin MrHyde
def drJekyll = new DrJekyll()me() as DrJekyll
def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)
A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true
B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false
C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true
D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 119
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 120
В КОДЕ MIXINMETACLASS
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 121
WHY SO PRIMITIVE
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 122
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 123
WHY SO PRIMITIVEdef x = intprintln x
if ((x = long)) println x
if (x = boolean ) println x
A Startup ErrorB int long
booleanC javalangInte
ger javalangLong javalangBoolean
Dint
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 124
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 125
А ЭТО
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 126
(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 127
JUMP AKA ПРОПАВШИЕ СЛОВА
>
14863602
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 128
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 129
JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen
public static jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println VanHalenjump()
A Here are the lyrics
B Here are the null
C Startup failureD MissingMethodExcep
tion
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 130
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 131
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 132
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 133
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 134
РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen
public static jump() Here are the $lyrics()
static $static_methodMissing(String name def args) lyrics
println VanHalenjump()
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 135
ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП
class VanHalen
public jump() Here are the $lyrics()
def methodMissing(String name def args) lyrics
println new VanHalen()jump()
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 136
>
null
10161629
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 137
WHATrsquoS THE METACLASS БАРУХ
def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух
AMissingMethodExceptionBWhats the
orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух
CWhatrsquos the javautilLinkedHashMapXXXXXX Барух
DWhatrsquos the frequency Барух
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 138
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 139
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 140
ПЕРЕБОР OPERATOR OVERLOADING
Если переопределён для он не может быть переопредён и для
mapmetaClass
mapget(metaClass)
mapgetMetaClass()
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 141
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 142
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 143
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 144
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Page 145
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull