Upload
baruch-sadogursky
View
631
Download
3
Embed Size (px)
DESCRIPTION
Помните легендарные Java Puzzlers? Да-да, те самые, с Джошом Блохом и Нилом Гафтером? Ну, по которым ещё книжку написали? Так вот, в Groovy всё ещё веселее. В смысле — задачки ещё более странные, и ответы ещё более поразительные. Этот доклад для вас, Groovy-разработчики, мы покажем вам настоящие, большие и красивые подводные камни! И для вас, Java-разработчики, потому что таких вещей на Java-подобном синтакисе вы точно никогда не видели! И для вас, PHP-разработчики… хотя, нет, не для вас :) Всем точно будет весело — ваши ведущие Женя и Барух будут зажигать, шутить, спорить, бросаться футболками в публику, и самое главное — заставят вас офигевать от Groovy.
Citation preview
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 Мориарти
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
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 Мориарти
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
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 Мориарти
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
ПЕРВОЕ ПРАВИЛО ПАЗЗЛЕРОВ
НЕ ЧИТИТЬ
ВСЁ ВЕРНО ДЛЯ ВЕРСИИ 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 Мориарти
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
ВСЁ ВЕРНО ДЛЯ ВЕРСИИ 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 Мориарти
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
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 Мориарти
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
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 Мориарти
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
ЧИНИМ
(-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 Мориарти
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
ИДЕЯ НИЧЕГО НЕ ПЕЧАТАЕТ ПОЧЕМУ
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 Мориарти
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
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 Мориарти
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
УБЕЙТЕ ВСЕ СКОБКИ
КОМПИЛЯТОР РАЗБЕРЕТСЯ
-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 Мориарти
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
-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 Мориарти
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
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 Мориарти
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
ПРОСТО ДОБАВЬ СКОБОК
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 Мориарти
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
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 Мориарти
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
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 Мориарти
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
САМ В ШОКЕ
ПОСМОТРИМ ЕЩЕ РАЗ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 Мориарти
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
ПОСМОТРИМ ЕЩЕ РАЗ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 Мориарти
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
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 Мориарти
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
КАК 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 Мориарти
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
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
РЕШЕНИЕ ИСПОЛЬЗУЙ 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 Мориарти
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
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
РЕШЕНИЕ ИСПОЛЬЗУЙ 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 Мориарти
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
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
РЕШЕНИЕ ИСПОЛЬЗУЙ 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 Мориарти
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
ДАВАЙТЕ РАЗБИРАТЬСЯ
ДАВАЙТЕ РАЗБИРАТЬСЯ
РЕШЕНИЕ ИСПОЛЬЗУЙ 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 Мориарти
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
ДАВАЙТЕ РАЗБИРАТЬСЯ
РЕШЕНИЕ ИСПОЛЬЗУЙ 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 Мориарти
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
РЕШЕНИЕ ИСПОЛЬЗУЙ 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 Мориарти
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
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 Мориарти
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
КАКОЙ ЖЕ ЭТО 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 Мориарти
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
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 Мориарти
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
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 Мориарти
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
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 Мориарти
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
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 Мориарти
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
РАСКУСИЛ
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 Мориарти
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
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 Мориарти
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
СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ 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 Мориарти
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
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 Мориарти
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
КАК ЭТО ПОЛУЧИЛОСЬ
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 Мориарти
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
ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО
ДЕТЕКТИВ
КТО УБИЙЦА
A NullPointerException
B ктоУбийцаI_closure1xxxxxxx
C Startup errorD Мориарти
Closure ктоУбийца() Мориарти println ктоУбийца()
ПИЧАЛЬКА
ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ
Closure ктоУбийца() -gt Мориарти
Closure ктоУбийца() return Мориарти
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
ДЕТЕКТИВ
КТО УБИЙЦА
A NullPointerException
B ктоУбийцаI_closure1xxxxxxx
C Startup errorD Мориарти
Closure ктоУбийца() Мориарти println ктоУбийца()
ПИЧАЛЬКА
ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ
Closure ктоУбийца() -gt Мориарти
Closure ктоУбийца() return Мориарти
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
КТО УБИЙЦА
A NullPointerException
B ктоУбийцаI_closure1xxxxxxx
C Startup errorD Мориарти
Closure ктоУбийца() Мориарти println ктоУбийца()
ПИЧАЛЬКА
ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ
Closure ктоУбийца() -gt Мориарти
Closure ктоУбийца() return Мориарти
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
ПИЧАЛЬКА
ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ
Closure ктоУбийца() -gt Мориарти
Closure ктоУбийца() return Мориарти
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
ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ
Closure ктоУбийца() -gt Мориарти
Closure ктоУбийца() return Мориарти
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
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
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
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
КАК ТАК ТО НУ КАК ТАК ТО
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
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
ЛУЧШЕ НЕ СТАЛО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
ЧТО ПРОИЗОШЛО
ИСПОЛЬЗУЙ ОТВЕТ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
ИСПОЛЬЗУЙ ОТВЕТ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
ПОЧИНИЛИ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
ЭТО ВООБЩЕ КАК
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
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
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
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
У МЕНЯ ДВА ВОПРОСА
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
ОТВЕТ НА 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
ОТВЕТ НА 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
ГДЕ КАРТА БИЛЛИ
ГДЕ КАРТА БИЛЛИ
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
ГДЕ КАРТА БИЛЛИ
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
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
КАК ЭТО 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
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ
ЧИНИМ
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
ЧИНИМ
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
ЕЩЕ КАРТЫ БИЛЛИ
ЕЩЕ КАРТЫ БИЛЛИ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
ЕЩЕ КАРТЫ БИЛЛИ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
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
А СЕЙЧАС ТО-ЧТО
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
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
ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ
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
НАМ НУЖНА КАРТА
НАМ НУЖНА КАРТА
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
НАМ НУЖНА КАРТА
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
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
ЧТО ОПЯТЬ
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
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
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
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
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 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
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 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
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 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
ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 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
РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ
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
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
ЧТО БЫ СДЕЛАЛИ МЫ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
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
УБИРАЕМ ЕДИНИЧКУ
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
[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
(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
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[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
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[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
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[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
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[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
ОБМАНУЛИ ДУРАКА
ОБМАНУЛИ ДУРАКА
[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
ОБМАНУЛИ ДУРАКА
[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
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
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
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
А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ
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
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
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
А ГДЕ МОИ ПРОВЕРКИ
ВО ВРЕМЯ КОМПИЛЯЦИИ
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
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
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
π 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
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
ПРОСЁК
ПРОСЁК
ПРОСЁК
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
ПРОСЁК
ПРОСЁК
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
ПРОСЁК
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
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
ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ
ПОСМОТРИ НА 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
ПОСМОТРИ НА 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
ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ 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
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
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
А ВОТ ПОЧЕМУ
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
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
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
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
ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ
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
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
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
ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ
В КОДЕ 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
В КОДЕ 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
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
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
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
НУ ЭТО ЯСНО А ПОЧЕМУ
порядокточно непорядок
А ЭТО
(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
А ЭТО
(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
(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
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
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
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
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
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
I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK
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
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
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
РЕШЕНИЕ СТАТИЧЕСКИЙ 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
ЕЩЁ ЛУЧШЕ 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
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
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
СРАБОТАЛО НО
НЕ ФАКТ ЧТО ЭТО ХОРОШО
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО 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
ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ
ЧТО 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
ПЕРЕБОР 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
ВЫВОДЫ
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis
- intellij IDEA5 Rtfm6 Donrsquot code like my brother
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Мы только начали (надо еще форму придумать)
Засылайте Ваши паззлеры поделки и рисунки
- puzzlers jfrogcom- Groovypuzzlers
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull
Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch
Вам не поравилосьdevnull