groovy puzzlers по русски с joker 2014

Post on 27-Nov-2014

634 Views

Category:

Technology

3 Downloads

Preview:

Click to see full reader

DESCRIPTION

Помните легендарные Java Puzzlers? Да-да, те самые, с Джошом Блохом и Нилом Гафтером? Ну, по которым ещё книжку написали? Так вот, в Groovy всё ещё веселее. В смысле — задачки ещё более странные, и ответы ещё более поразительные. Этот доклад для вас, Groovy-разработчики, мы покажем вам настоящие, большие и красивые подводные камни! И для вас, Java-разработчики, потому что таких вещей на Java-подобном синтакисе вы точно никогда не видели! И для вас, PHP-разработчики… хотя, нет, не для вас :) Всем точно будет весело — ваши ведущие Женя и Барух будут зажигать, шутить, спорить, бросаться футболками в публику, и самое главное — заставят вас офигевать от Groovy.

TRANSCRIPT

GROOVY PUZZLERS

СТРАННОЕ НЕПОНЯТНОЕ И

МАМОЧКИ-ЧТО-ЭТО-ТАКОЕ

CLICK AND HACK

THE TYPING BROTHERS

1 Два клЕвых пацана на сцене

2 Прикольные загадки3 Вы голосуете за

правильный ответ4 Мы швыряемся вещами5 Официальный хэш

groovypuzzlers

ПЕРВОЕ ПРАВИЛО ПАЗЗЛЕРОВ

НЕ ЧИТИТЬ

ВСЁ ВЕРНО ДЛЯ ВЕРСИИ 237

ABSOLUTELY GROOVY

A3BNoSuchMethodErrorC-3DExecution Failure

-3abs()

ЧИНИМ

(-3)abs()

ИЛИ

int value = -3valueabs()

ИДЕЯ НИЧЕГО НЕ ПЕЧАТАЕТ ПОЧЕМУ

A-3B3C3 and

NullPointerExceptionD-3 and

NullPointerException

ДОБАВИМ PRINTLN

println (-3)abs()

УБЕЙТЕ ВСЕ СКОБКИ

КОМПИЛЯТОР РАЗБЕРЕТСЯ

-3Caught javalangNullPointerException Cannot invoke method abs() on null objectjavalangNullPointerException Cannot invoke method abs() on null object

at AbsolutelyGroovyrun(AbsolutelyGroovygroovy7)at comintellijrtexecutionapplicationAppMainmain(AppMainjava134)

println (-3)abs()

ldquoВсе проблемы в программировании можно решить добавив пару скобокrdquo

John McCarthy изобретатель LISP

ПРОСТО ДОБАВЬ СКОБОК

println ((-3)abs())

ИЛИ

int value = -3println valueabs()

PRIME CUTS

PRIME CUTSboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

САМ В ШОКЕ

ПОСМОТРИМ ЕЩЕ РАЗboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

boolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

AtrueBfalse

CNumberFormatException

DMissingMethodException

КАК 4 МОГЛО ОКАЗАТЬСЯ ПРОСТЫМ ЧИСЛОМhellip

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

РЕШЕНИЕ ИСПОЛЬЗУЙ ANY() ИЛИ ПЕРЕОСМЫСЛИ АЛГОРИТМ

httpkousenitwordpresscom20140418responses-to-the-closure-of-no-return

class Conference def name def year

def gr = new Conference(name Greach year 2014)

greach println it

A class=class Conferencename=Greachyear=2014

B ConferenceXXXXXX

C Startup failure

D Greach 2014

КАКОЙ ЖЕ ЭТО ITERABLE

RTFS (READ THE FING SOURCE)

MAX POWER

MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

A ClassCastExceptionB 9C 56Dnull

РАСКУСИЛ

gtgroovysh ((9 as Character) as Integer)===gt 57

ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max

СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL

A ClassCastExceptionB 9C 56Dnull

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

КАК ЭТО ПОЛУЧИЛОСЬ

def random = new Random()

def randomList = []010each randomList ltlt randomnextInt()

assert randomListmax null == randomList[0]

ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО

ДЕТЕКТИВ

КТО УБИЙЦА

A NullPointerException

B ктоУбийцаI_closure1xxxxxxx

C Startup errorD Мориарти

Closure ктоУбийца() Мориарти println ктоУбийца()

ПИЧАЛЬКА

ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ

Closure ктоУбийца() -gt Мориарти

Closure ктоУбийца() return Мориарти

>

The Final Countdown - fragment

Europe

Top Disco Hits vol 1 track 17

9743676

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9D10

КАК ТАК ТО НУ КАК ТАК ТО

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648

ЛУЧШЕ НЕ СТАЛОhellip

ЧТО ПРОИЗОШЛО

ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

ПОЧИНИЛИclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9

D42

ЭТО ВООБЩЕ КАК

PUBLIC - PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

A publicPropertyproperty

B publicPropertyPublic__property

C publicPropertygetProperty()

D publicPropertyproperty

У МЕНЯ ДВА ВОПРОСА

1Что за дебильное имя

2 Откуда я мог это знать

ОТВЕТ НА 1 IN SOVIET RUSSIA

YOU DONrsquoT ACCESS PUBLIC

PROPERTY

ОТВЕТ НА 2

httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml

А ты документацию читать не пробовал

ГДЕ КАРТА БИЛЛИ

ГДЕ КАРТА БИЛЛИ

def key = xdef map = [key treasure]def value = mapget(key)println value

def key = xdef map = [key treasure]def value = mapget(key)println value

ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000

чертей

КАК ЭТО NULL

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ

ЧИНИМ

1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure

ЕЩЕ КАРТЫ БИЛЛИ

ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value

def map = [2 treasure]def key = 2def value = map$keyprintln value

ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку

А СЕЙЧАС ТО-ЧТО

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ

def map = [2 treasure]println mapkeySet()first()classname

javalangInteger

НАМ НУЖНА КАРТА

НАМ НУЖНА КАРТА

def key = xdef map = [$key treasure]def value = map[x]println value

ANoSuchElementExceptionBnullCtreasureDПолундра Startup error

def key = xdef map = [$key treasure]def value = map[x]println value

ЧТО ОПЯТЬ

STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН

def map = [$key treasure]println mapkeySet()first()classname

orgcodehausgroovyruntimeGStringImpl

OUT OF RANGE

AAssertion FailedBfalseCtrueDNullPointerException

OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3

Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()

10 20 30 40 50 60 70 80 90 100

РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ

GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56

ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100

bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно

bullИ пусть делегирует в containsWithinBounds

bullПочините наконец GROOVY-2771

bullThank you

POWER RANGE(RS)

УБИРАЕМ ЕДИНИЧКУ

A -1012345678

C[0 2 3 4 5 6 7 8 9]

D[-1 0 1 2 3 4 5 6 7 8]

[09]each println(it - 1)

B0123456789

[09]each println(it - 1)

Это неправильные скобки

(09)each println(it - 1)

Другое дело

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

[0 2 3 4 5 6 7 8 9]

SAVE THE DATE

JOKERCONF IS COMING

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

JAVA2 КТО ПОМНИТ

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

AStartup FailureB[1 2 3 WED Oct 17

161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException

А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ

ERASURE

ERASURE

А ГДЕ МОИ ПРОВЕРКИ

ВО ВРЕМЯ КОМПИЛЯЦИИ

laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo

ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname

[javalangLong javalangLong javalangLong javautilDate javalangString]

COMPILESTATIC

π ndash ТОРТ И ЧИСЛО

DOUBLE THE PI

double value = 3println $value14isDouble()

A trueB MissingPropertyExceptionC falseDMissingMethodException

ПРОСЁК

ПРОСЁК

ПРОСЁК

A trueB MissingPropertyExceptionC falseDMissingMethodException

DOUBLE THE PI

double value = 3println $value14isDouble()

ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ

ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE

ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP

СПРОСИ ФРАНЦУЗОВ

RSVP

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

A Startup FailureB 1C 2D MissingPropertyException

А ВОТ ПОЧЕМУ

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

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

НАПРИМЕР

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

def invite = new Invite()def attendees = inviteattending +1

НУ ИЛИ УБРАТЬ СКОБКИ

Как убрать скобки

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true

B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false

C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true

D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false

ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ

В КОДЕ MIXINMETACLASS

WHY SO PRIMITIVE

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

A Startup ErrorB int long

booleanC javalangInte

ger javalangLong javalangBoolean

Dint

НУ ЭТО ЯСНО А ПОЧЕМУ

порядокточно непорядок

А ЭТО

(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК

JUMP AKA ПРОПАВШИЕ СЛОВА

>

14863602

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

A Here are the lyrics

B Here are the null

C Startup failureD MissingMethodExcep

tion

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen

public static jump() Here are the $lyrics()

static $static_methodMissing(String name def args) lyrics

println VanHalenjump()

ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП

class VanHalen

public jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println new VanHalen()jump()

>

null

10161629

WHATrsquoS THE METACLASS БАРУХ

def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух

AMissingMethodExceptionBWhats the

orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух

CWhatrsquos the javautilLinkedHashMapXXXXXX Барух

DWhatrsquos the frequency Барух

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

mapgetMetaClass()

ВЫВОДЫ

1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis

- intellij IDEA5 Rtfm6 Donrsquot code like my brother

Мы только начали (надо еще форму придумать)

Засылайте Ваши паззлеры поделки и рисунки

- puzzlers jfrogcom- Groovypuzzlers

ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ

Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch

Вам не поравилосьdevnull

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

CLICK AND HACK

THE TYPING BROTHERS

1 Два клЕвых пацана на сцене

2 Прикольные загадки3 Вы голосуете за

правильный ответ4 Мы швыряемся вещами5 Официальный хэш

groovypuzzlers

ПЕРВОЕ ПРАВИЛО ПАЗЗЛЕРОВ

НЕ ЧИТИТЬ

ВСЁ ВЕРНО ДЛЯ ВЕРСИИ 237

ABSOLUTELY GROOVY

A3BNoSuchMethodErrorC-3DExecution Failure

-3abs()

ЧИНИМ

(-3)abs()

ИЛИ

int value = -3valueabs()

ИДЕЯ НИЧЕГО НЕ ПЕЧАТАЕТ ПОЧЕМУ

A-3B3C3 and

NullPointerExceptionD-3 and

NullPointerException

ДОБАВИМ PRINTLN

println (-3)abs()

УБЕЙТЕ ВСЕ СКОБКИ

КОМПИЛЯТОР РАЗБЕРЕТСЯ

-3Caught javalangNullPointerException Cannot invoke method abs() on null objectjavalangNullPointerException Cannot invoke method abs() on null object

at AbsolutelyGroovyrun(AbsolutelyGroovygroovy7)at comintellijrtexecutionapplicationAppMainmain(AppMainjava134)

println (-3)abs()

ldquoВсе проблемы в программировании можно решить добавив пару скобокrdquo

John McCarthy изобретатель LISP

ПРОСТО ДОБАВЬ СКОБОК

println ((-3)abs())

ИЛИ

int value = -3println valueabs()

PRIME CUTS

PRIME CUTSboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

САМ В ШОКЕ

ПОСМОТРИМ ЕЩЕ РАЗboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

boolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

AtrueBfalse

CNumberFormatException

DMissingMethodException

КАК 4 МОГЛО ОКАЗАТЬСЯ ПРОСТЫМ ЧИСЛОМhellip

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

РЕШЕНИЕ ИСПОЛЬЗУЙ ANY() ИЛИ ПЕРЕОСМЫСЛИ АЛГОРИТМ

httpkousenitwordpresscom20140418responses-to-the-closure-of-no-return

class Conference def name def year

def gr = new Conference(name Greach year 2014)

greach println it

A class=class Conferencename=Greachyear=2014

B ConferenceXXXXXX

C Startup failure

D Greach 2014

КАКОЙ ЖЕ ЭТО ITERABLE

RTFS (READ THE FING SOURCE)

MAX POWER

MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

A ClassCastExceptionB 9C 56Dnull

РАСКУСИЛ

gtgroovysh ((9 as Character) as Integer)===gt 57

ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max

СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL

A ClassCastExceptionB 9C 56Dnull

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

КАК ЭТО ПОЛУЧИЛОСЬ

def random = new Random()

def randomList = []010each randomList ltlt randomnextInt()

assert randomListmax null == randomList[0]

ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО

ДЕТЕКТИВ

КТО УБИЙЦА

A NullPointerException

B ктоУбийцаI_closure1xxxxxxx

C Startup errorD Мориарти

Closure ктоУбийца() Мориарти println ктоУбийца()

ПИЧАЛЬКА

ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ

Closure ктоУбийца() -gt Мориарти

Closure ктоУбийца() return Мориарти

>

The Final Countdown - fragment

Europe

Top Disco Hits vol 1 track 17

9743676

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9D10

КАК ТАК ТО НУ КАК ТАК ТО

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648

ЛУЧШЕ НЕ СТАЛОhellip

ЧТО ПРОИЗОШЛО

ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

ПОЧИНИЛИclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9

D42

ЭТО ВООБЩЕ КАК

PUBLIC - PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

A publicPropertyproperty

B publicPropertyPublic__property

C publicPropertygetProperty()

D publicPropertyproperty

У МЕНЯ ДВА ВОПРОСА

1Что за дебильное имя

2 Откуда я мог это знать

ОТВЕТ НА 1 IN SOVIET RUSSIA

YOU DONrsquoT ACCESS PUBLIC

PROPERTY

ОТВЕТ НА 2

httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml

А ты документацию читать не пробовал

ГДЕ КАРТА БИЛЛИ

ГДЕ КАРТА БИЛЛИ

def key = xdef map = [key treasure]def value = mapget(key)println value

def key = xdef map = [key treasure]def value = mapget(key)println value

ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000

чертей

КАК ЭТО NULL

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ

ЧИНИМ

1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure

ЕЩЕ КАРТЫ БИЛЛИ

ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value

def map = [2 treasure]def key = 2def value = map$keyprintln value

ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку

А СЕЙЧАС ТО-ЧТО

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ

def map = [2 treasure]println mapkeySet()first()classname

javalangInteger

НАМ НУЖНА КАРТА

НАМ НУЖНА КАРТА

def key = xdef map = [$key treasure]def value = map[x]println value

ANoSuchElementExceptionBnullCtreasureDПолундра Startup error

def key = xdef map = [$key treasure]def value = map[x]println value

ЧТО ОПЯТЬ

STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН

def map = [$key treasure]println mapkeySet()first()classname

orgcodehausgroovyruntimeGStringImpl

OUT OF RANGE

AAssertion FailedBfalseCtrueDNullPointerException

OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3

Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()

10 20 30 40 50 60 70 80 90 100

РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ

GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56

ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100

bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно

bullИ пусть делегирует в containsWithinBounds

bullПочините наконец GROOVY-2771

bullThank you

POWER RANGE(RS)

УБИРАЕМ ЕДИНИЧКУ

A -1012345678

C[0 2 3 4 5 6 7 8 9]

D[-1 0 1 2 3 4 5 6 7 8]

[09]each println(it - 1)

B0123456789

[09]each println(it - 1)

Это неправильные скобки

(09)each println(it - 1)

Другое дело

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

[0 2 3 4 5 6 7 8 9]

SAVE THE DATE

JOKERCONF IS COMING

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

JAVA2 КТО ПОМНИТ

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

AStartup FailureB[1 2 3 WED Oct 17

161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException

А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ

ERASURE

ERASURE

А ГДЕ МОИ ПРОВЕРКИ

ВО ВРЕМЯ КОМПИЛЯЦИИ

laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo

ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname

[javalangLong javalangLong javalangLong javautilDate javalangString]

COMPILESTATIC

π ndash ТОРТ И ЧИСЛО

DOUBLE THE PI

double value = 3println $value14isDouble()

A trueB MissingPropertyExceptionC falseDMissingMethodException

ПРОСЁК

ПРОСЁК

ПРОСЁК

A trueB MissingPropertyExceptionC falseDMissingMethodException

DOUBLE THE PI

double value = 3println $value14isDouble()

ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ

ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE

ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP

СПРОСИ ФРАНЦУЗОВ

RSVP

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

A Startup FailureB 1C 2D MissingPropertyException

А ВОТ ПОЧЕМУ

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

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

НАПРИМЕР

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

def invite = new Invite()def attendees = inviteattending +1

НУ ИЛИ УБРАТЬ СКОБКИ

Как убрать скобки

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true

B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false

C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true

D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false

ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ

В КОДЕ MIXINMETACLASS

WHY SO PRIMITIVE

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

A Startup ErrorB int long

booleanC javalangInte

ger javalangLong javalangBoolean

Dint

НУ ЭТО ЯСНО А ПОЧЕМУ

порядокточно непорядок

А ЭТО

(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК

JUMP AKA ПРОПАВШИЕ СЛОВА

>

14863602

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

A Here are the lyrics

B Here are the null

C Startup failureD MissingMethodExcep

tion

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen

public static jump() Here are the $lyrics()

static $static_methodMissing(String name def args) lyrics

println VanHalenjump()

ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП

class VanHalen

public jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println new VanHalen()jump()

>

null

10161629

WHATrsquoS THE METACLASS БАРУХ

def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух

AMissingMethodExceptionBWhats the

orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух

CWhatrsquos the javautilLinkedHashMapXXXXXX Барух

DWhatrsquos the frequency Барух

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

mapgetMetaClass()

ВЫВОДЫ

1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis

- intellij IDEA5 Rtfm6 Donrsquot code like my brother

Мы только начали (надо еще форму придумать)

Засылайте Ваши паззлеры поделки и рисунки

- puzzlers jfrogcom- Groovypuzzlers

ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ

Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch

Вам не поравилосьdevnull

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

1 Два клЕвых пацана на сцене

2 Прикольные загадки3 Вы голосуете за

правильный ответ4 Мы швыряемся вещами5 Официальный хэш

groovypuzzlers

ПЕРВОЕ ПРАВИЛО ПАЗЗЛЕРОВ

НЕ ЧИТИТЬ

ВСЁ ВЕРНО ДЛЯ ВЕРСИИ 237

ABSOLUTELY GROOVY

A3BNoSuchMethodErrorC-3DExecution Failure

-3abs()

ЧИНИМ

(-3)abs()

ИЛИ

int value = -3valueabs()

ИДЕЯ НИЧЕГО НЕ ПЕЧАТАЕТ ПОЧЕМУ

A-3B3C3 and

NullPointerExceptionD-3 and

NullPointerException

ДОБАВИМ PRINTLN

println (-3)abs()

УБЕЙТЕ ВСЕ СКОБКИ

КОМПИЛЯТОР РАЗБЕРЕТСЯ

-3Caught javalangNullPointerException Cannot invoke method abs() on null objectjavalangNullPointerException Cannot invoke method abs() on null object

at AbsolutelyGroovyrun(AbsolutelyGroovygroovy7)at comintellijrtexecutionapplicationAppMainmain(AppMainjava134)

println (-3)abs()

ldquoВсе проблемы в программировании можно решить добавив пару скобокrdquo

John McCarthy изобретатель LISP

ПРОСТО ДОБАВЬ СКОБОК

println ((-3)abs())

ИЛИ

int value = -3println valueabs()

PRIME CUTS

PRIME CUTSboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

САМ В ШОКЕ

ПОСМОТРИМ ЕЩЕ РАЗboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

boolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

AtrueBfalse

CNumberFormatException

DMissingMethodException

КАК 4 МОГЛО ОКАЗАТЬСЯ ПРОСТЫМ ЧИСЛОМhellip

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

РЕШЕНИЕ ИСПОЛЬЗУЙ ANY() ИЛИ ПЕРЕОСМЫСЛИ АЛГОРИТМ

httpkousenitwordpresscom20140418responses-to-the-closure-of-no-return

class Conference def name def year

def gr = new Conference(name Greach year 2014)

greach println it

A class=class Conferencename=Greachyear=2014

B ConferenceXXXXXX

C Startup failure

D Greach 2014

КАКОЙ ЖЕ ЭТО ITERABLE

RTFS (READ THE FING SOURCE)

MAX POWER

MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

A ClassCastExceptionB 9C 56Dnull

РАСКУСИЛ

gtgroovysh ((9 as Character) as Integer)===gt 57

ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max

СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL

A ClassCastExceptionB 9C 56Dnull

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

КАК ЭТО ПОЛУЧИЛОСЬ

def random = new Random()

def randomList = []010each randomList ltlt randomnextInt()

assert randomListmax null == randomList[0]

ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО

ДЕТЕКТИВ

КТО УБИЙЦА

A NullPointerException

B ктоУбийцаI_closure1xxxxxxx

C Startup errorD Мориарти

Closure ктоУбийца() Мориарти println ктоУбийца()

ПИЧАЛЬКА

ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ

Closure ктоУбийца() -gt Мориарти

Closure ктоУбийца() return Мориарти

>

The Final Countdown - fragment

Europe

Top Disco Hits vol 1 track 17

9743676

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9D10

КАК ТАК ТО НУ КАК ТАК ТО

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648

ЛУЧШЕ НЕ СТАЛОhellip

ЧТО ПРОИЗОШЛО

ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

ПОЧИНИЛИclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9

D42

ЭТО ВООБЩЕ КАК

PUBLIC - PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

A publicPropertyproperty

B publicPropertyPublic__property

C publicPropertygetProperty()

D publicPropertyproperty

У МЕНЯ ДВА ВОПРОСА

1Что за дебильное имя

2 Откуда я мог это знать

ОТВЕТ НА 1 IN SOVIET RUSSIA

YOU DONrsquoT ACCESS PUBLIC

PROPERTY

ОТВЕТ НА 2

httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml

А ты документацию читать не пробовал

ГДЕ КАРТА БИЛЛИ

ГДЕ КАРТА БИЛЛИ

def key = xdef map = [key treasure]def value = mapget(key)println value

def key = xdef map = [key treasure]def value = mapget(key)println value

ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000

чертей

КАК ЭТО NULL

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ

ЧИНИМ

1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure

ЕЩЕ КАРТЫ БИЛЛИ

ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value

def map = [2 treasure]def key = 2def value = map$keyprintln value

ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку

А СЕЙЧАС ТО-ЧТО

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ

def map = [2 treasure]println mapkeySet()first()classname

javalangInteger

НАМ НУЖНА КАРТА

НАМ НУЖНА КАРТА

def key = xdef map = [$key treasure]def value = map[x]println value

ANoSuchElementExceptionBnullCtreasureDПолундра Startup error

def key = xdef map = [$key treasure]def value = map[x]println value

ЧТО ОПЯТЬ

STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН

def map = [$key treasure]println mapkeySet()first()classname

orgcodehausgroovyruntimeGStringImpl

OUT OF RANGE

AAssertion FailedBfalseCtrueDNullPointerException

OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3

Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()

10 20 30 40 50 60 70 80 90 100

РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ

GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56

ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100

bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно

bullИ пусть делегирует в containsWithinBounds

bullПочините наконец GROOVY-2771

bullThank you

POWER RANGE(RS)

УБИРАЕМ ЕДИНИЧКУ

A -1012345678

C[0 2 3 4 5 6 7 8 9]

D[-1 0 1 2 3 4 5 6 7 8]

[09]each println(it - 1)

B0123456789

[09]each println(it - 1)

Это неправильные скобки

(09)each println(it - 1)

Другое дело

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

[0 2 3 4 5 6 7 8 9]

SAVE THE DATE

JOKERCONF IS COMING

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

JAVA2 КТО ПОМНИТ

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

AStartup FailureB[1 2 3 WED Oct 17

161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException

А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ

ERASURE

ERASURE

А ГДЕ МОИ ПРОВЕРКИ

ВО ВРЕМЯ КОМПИЛЯЦИИ

laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo

ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname

[javalangLong javalangLong javalangLong javautilDate javalangString]

COMPILESTATIC

π ndash ТОРТ И ЧИСЛО

DOUBLE THE PI

double value = 3println $value14isDouble()

A trueB MissingPropertyExceptionC falseDMissingMethodException

ПРОСЁК

ПРОСЁК

ПРОСЁК

A trueB MissingPropertyExceptionC falseDMissingMethodException

DOUBLE THE PI

double value = 3println $value14isDouble()

ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ

ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE

ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP

СПРОСИ ФРАНЦУЗОВ

RSVP

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

A Startup FailureB 1C 2D MissingPropertyException

А ВОТ ПОЧЕМУ

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

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

НАПРИМЕР

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

def invite = new Invite()def attendees = inviteattending +1

НУ ИЛИ УБРАТЬ СКОБКИ

Как убрать скобки

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true

B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false

C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true

D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false

ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ

В КОДЕ MIXINMETACLASS

WHY SO PRIMITIVE

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

A Startup ErrorB int long

booleanC javalangInte

ger javalangLong javalangBoolean

Dint

НУ ЭТО ЯСНО А ПОЧЕМУ

порядокточно непорядок

А ЭТО

(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК

JUMP AKA ПРОПАВШИЕ СЛОВА

>

14863602

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

A Here are the lyrics

B Here are the null

C Startup failureD MissingMethodExcep

tion

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen

public static jump() Here are the $lyrics()

static $static_methodMissing(String name def args) lyrics

println VanHalenjump()

ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП

class VanHalen

public jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println new VanHalen()jump()

>

null

10161629

WHATrsquoS THE METACLASS БАРУХ

def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух

AMissingMethodExceptionBWhats the

orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух

CWhatrsquos the javautilLinkedHashMapXXXXXX Барух

DWhatrsquos the frequency Барух

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

mapgetMetaClass()

ВЫВОДЫ

1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis

- intellij IDEA5 Rtfm6 Donrsquot code like my brother

Мы только начали (надо еще форму придумать)

Засылайте Ваши паззлеры поделки и рисунки

- puzzlers jfrogcom- Groovypuzzlers

ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ

Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch

Вам не поравилосьdevnull

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ПЕРВОЕ ПРАВИЛО ПАЗЗЛЕРОВ

НЕ ЧИТИТЬ

ВСЁ ВЕРНО ДЛЯ ВЕРСИИ 237

ABSOLUTELY GROOVY

A3BNoSuchMethodErrorC-3DExecution Failure

-3abs()

ЧИНИМ

(-3)abs()

ИЛИ

int value = -3valueabs()

ИДЕЯ НИЧЕГО НЕ ПЕЧАТАЕТ ПОЧЕМУ

A-3B3C3 and

NullPointerExceptionD-3 and

NullPointerException

ДОБАВИМ PRINTLN

println (-3)abs()

УБЕЙТЕ ВСЕ СКОБКИ

КОМПИЛЯТОР РАЗБЕРЕТСЯ

-3Caught javalangNullPointerException Cannot invoke method abs() on null objectjavalangNullPointerException Cannot invoke method abs() on null object

at AbsolutelyGroovyrun(AbsolutelyGroovygroovy7)at comintellijrtexecutionapplicationAppMainmain(AppMainjava134)

println (-3)abs()

ldquoВсе проблемы в программировании можно решить добавив пару скобокrdquo

John McCarthy изобретатель LISP

ПРОСТО ДОБАВЬ СКОБОК

println ((-3)abs())

ИЛИ

int value = -3println valueabs()

PRIME CUTS

PRIME CUTSboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

САМ В ШОКЕ

ПОСМОТРИМ ЕЩЕ РАЗboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

boolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

AtrueBfalse

CNumberFormatException

DMissingMethodException

КАК 4 МОГЛО ОКАЗАТЬСЯ ПРОСТЫМ ЧИСЛОМhellip

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

РЕШЕНИЕ ИСПОЛЬЗУЙ ANY() ИЛИ ПЕРЕОСМЫСЛИ АЛГОРИТМ

httpkousenitwordpresscom20140418responses-to-the-closure-of-no-return

class Conference def name def year

def gr = new Conference(name Greach year 2014)

greach println it

A class=class Conferencename=Greachyear=2014

B ConferenceXXXXXX

C Startup failure

D Greach 2014

КАКОЙ ЖЕ ЭТО ITERABLE

RTFS (READ THE FING SOURCE)

MAX POWER

MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

A ClassCastExceptionB 9C 56Dnull

РАСКУСИЛ

gtgroovysh ((9 as Character) as Integer)===gt 57

ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max

СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL

A ClassCastExceptionB 9C 56Dnull

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

КАК ЭТО ПОЛУЧИЛОСЬ

def random = new Random()

def randomList = []010each randomList ltlt randomnextInt()

assert randomListmax null == randomList[0]

ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО

ДЕТЕКТИВ

КТО УБИЙЦА

A NullPointerException

B ктоУбийцаI_closure1xxxxxxx

C Startup errorD Мориарти

Closure ктоУбийца() Мориарти println ктоУбийца()

ПИЧАЛЬКА

ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ

Closure ктоУбийца() -gt Мориарти

Closure ктоУбийца() return Мориарти

>

The Final Countdown - fragment

Europe

Top Disco Hits vol 1 track 17

9743676

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9D10

КАК ТАК ТО НУ КАК ТАК ТО

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648

ЛУЧШЕ НЕ СТАЛОhellip

ЧТО ПРОИЗОШЛО

ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

ПОЧИНИЛИclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9

D42

ЭТО ВООБЩЕ КАК

PUBLIC - PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

A publicPropertyproperty

B publicPropertyPublic__property

C publicPropertygetProperty()

D publicPropertyproperty

У МЕНЯ ДВА ВОПРОСА

1Что за дебильное имя

2 Откуда я мог это знать

ОТВЕТ НА 1 IN SOVIET RUSSIA

YOU DONrsquoT ACCESS PUBLIC

PROPERTY

ОТВЕТ НА 2

httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml

А ты документацию читать не пробовал

ГДЕ КАРТА БИЛЛИ

ГДЕ КАРТА БИЛЛИ

def key = xdef map = [key treasure]def value = mapget(key)println value

def key = xdef map = [key treasure]def value = mapget(key)println value

ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000

чертей

КАК ЭТО NULL

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ

ЧИНИМ

1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure

ЕЩЕ КАРТЫ БИЛЛИ

ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value

def map = [2 treasure]def key = 2def value = map$keyprintln value

ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку

А СЕЙЧАС ТО-ЧТО

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ

def map = [2 treasure]println mapkeySet()first()classname

javalangInteger

НАМ НУЖНА КАРТА

НАМ НУЖНА КАРТА

def key = xdef map = [$key treasure]def value = map[x]println value

ANoSuchElementExceptionBnullCtreasureDПолундра Startup error

def key = xdef map = [$key treasure]def value = map[x]println value

ЧТО ОПЯТЬ

STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН

def map = [$key treasure]println mapkeySet()first()classname

orgcodehausgroovyruntimeGStringImpl

OUT OF RANGE

AAssertion FailedBfalseCtrueDNullPointerException

OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3

Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()

10 20 30 40 50 60 70 80 90 100

РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ

GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56

ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100

bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно

bullИ пусть делегирует в containsWithinBounds

bullПочините наконец GROOVY-2771

bullThank you

POWER RANGE(RS)

УБИРАЕМ ЕДИНИЧКУ

A -1012345678

C[0 2 3 4 5 6 7 8 9]

D[-1 0 1 2 3 4 5 6 7 8]

[09]each println(it - 1)

B0123456789

[09]each println(it - 1)

Это неправильные скобки

(09)each println(it - 1)

Другое дело

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

[0 2 3 4 5 6 7 8 9]

SAVE THE DATE

JOKERCONF IS COMING

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

JAVA2 КТО ПОМНИТ

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

AStartup FailureB[1 2 3 WED Oct 17

161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException

А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ

ERASURE

ERASURE

А ГДЕ МОИ ПРОВЕРКИ

ВО ВРЕМЯ КОМПИЛЯЦИИ

laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo

ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname

[javalangLong javalangLong javalangLong javautilDate javalangString]

COMPILESTATIC

π ndash ТОРТ И ЧИСЛО

DOUBLE THE PI

double value = 3println $value14isDouble()

A trueB MissingPropertyExceptionC falseDMissingMethodException

ПРОСЁК

ПРОСЁК

ПРОСЁК

A trueB MissingPropertyExceptionC falseDMissingMethodException

DOUBLE THE PI

double value = 3println $value14isDouble()

ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ

ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE

ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP

СПРОСИ ФРАНЦУЗОВ

RSVP

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

A Startup FailureB 1C 2D MissingPropertyException

А ВОТ ПОЧЕМУ

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

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

НАПРИМЕР

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

def invite = new Invite()def attendees = inviteattending +1

НУ ИЛИ УБРАТЬ СКОБКИ

Как убрать скобки

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true

B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false

C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true

D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false

ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ

В КОДЕ MIXINMETACLASS

WHY SO PRIMITIVE

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

A Startup ErrorB int long

booleanC javalangInte

ger javalangLong javalangBoolean

Dint

НУ ЭТО ЯСНО А ПОЧЕМУ

порядокточно непорядок

А ЭТО

(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК

JUMP AKA ПРОПАВШИЕ СЛОВА

>

14863602

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

A Here are the lyrics

B Here are the null

C Startup failureD MissingMethodExcep

tion

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen

public static jump() Here are the $lyrics()

static $static_methodMissing(String name def args) lyrics

println VanHalenjump()

ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП

class VanHalen

public jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println new VanHalen()jump()

>

null

10161629

WHATrsquoS THE METACLASS БАРУХ

def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух

AMissingMethodExceptionBWhats the

orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух

CWhatrsquos the javautilLinkedHashMapXXXXXX Барух

DWhatrsquos the frequency Барух

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

mapgetMetaClass()

ВЫВОДЫ

1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis

- intellij IDEA5 Rtfm6 Donrsquot code like my brother

Мы только начали (надо еще форму придумать)

Засылайте Ваши паззлеры поделки и рисунки

- puzzlers jfrogcom- Groovypuzzlers

ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ

Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch

Вам не поравилосьdevnull

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ВСЁ ВЕРНО ДЛЯ ВЕРСИИ 237

ABSOLUTELY GROOVY

A3BNoSuchMethodErrorC-3DExecution Failure

-3abs()

ЧИНИМ

(-3)abs()

ИЛИ

int value = -3valueabs()

ИДЕЯ НИЧЕГО НЕ ПЕЧАТАЕТ ПОЧЕМУ

A-3B3C3 and

NullPointerExceptionD-3 and

NullPointerException

ДОБАВИМ PRINTLN

println (-3)abs()

УБЕЙТЕ ВСЕ СКОБКИ

КОМПИЛЯТОР РАЗБЕРЕТСЯ

-3Caught javalangNullPointerException Cannot invoke method abs() on null objectjavalangNullPointerException Cannot invoke method abs() on null object

at AbsolutelyGroovyrun(AbsolutelyGroovygroovy7)at comintellijrtexecutionapplicationAppMainmain(AppMainjava134)

println (-3)abs()

ldquoВсе проблемы в программировании можно решить добавив пару скобокrdquo

John McCarthy изобретатель LISP

ПРОСТО ДОБАВЬ СКОБОК

println ((-3)abs())

ИЛИ

int value = -3println valueabs()

PRIME CUTS

PRIME CUTSboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

САМ В ШОКЕ

ПОСМОТРИМ ЕЩЕ РАЗboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

boolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

AtrueBfalse

CNumberFormatException

DMissingMethodException

КАК 4 МОГЛО ОКАЗАТЬСЯ ПРОСТЫМ ЧИСЛОМhellip

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

РЕШЕНИЕ ИСПОЛЬЗУЙ ANY() ИЛИ ПЕРЕОСМЫСЛИ АЛГОРИТМ

httpkousenitwordpresscom20140418responses-to-the-closure-of-no-return

class Conference def name def year

def gr = new Conference(name Greach year 2014)

greach println it

A class=class Conferencename=Greachyear=2014

B ConferenceXXXXXX

C Startup failure

D Greach 2014

КАКОЙ ЖЕ ЭТО ITERABLE

RTFS (READ THE FING SOURCE)

MAX POWER

MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

A ClassCastExceptionB 9C 56Dnull

РАСКУСИЛ

gtgroovysh ((9 as Character) as Integer)===gt 57

ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max

СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL

A ClassCastExceptionB 9C 56Dnull

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

КАК ЭТО ПОЛУЧИЛОСЬ

def random = new Random()

def randomList = []010each randomList ltlt randomnextInt()

assert randomListmax null == randomList[0]

ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО

ДЕТЕКТИВ

КТО УБИЙЦА

A NullPointerException

B ктоУбийцаI_closure1xxxxxxx

C Startup errorD Мориарти

Closure ктоУбийца() Мориарти println ктоУбийца()

ПИЧАЛЬКА

ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ

Closure ктоУбийца() -gt Мориарти

Closure ктоУбийца() return Мориарти

>

The Final Countdown - fragment

Europe

Top Disco Hits vol 1 track 17

9743676

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9D10

КАК ТАК ТО НУ КАК ТАК ТО

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648

ЛУЧШЕ НЕ СТАЛОhellip

ЧТО ПРОИЗОШЛО

ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

ПОЧИНИЛИclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9

D42

ЭТО ВООБЩЕ КАК

PUBLIC - PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

A publicPropertyproperty

B publicPropertyPublic__property

C publicPropertygetProperty()

D publicPropertyproperty

У МЕНЯ ДВА ВОПРОСА

1Что за дебильное имя

2 Откуда я мог это знать

ОТВЕТ НА 1 IN SOVIET RUSSIA

YOU DONrsquoT ACCESS PUBLIC

PROPERTY

ОТВЕТ НА 2

httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml

А ты документацию читать не пробовал

ГДЕ КАРТА БИЛЛИ

ГДЕ КАРТА БИЛЛИ

def key = xdef map = [key treasure]def value = mapget(key)println value

def key = xdef map = [key treasure]def value = mapget(key)println value

ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000

чертей

КАК ЭТО NULL

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ

ЧИНИМ

1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure

ЕЩЕ КАРТЫ БИЛЛИ

ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value

def map = [2 treasure]def key = 2def value = map$keyprintln value

ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку

А СЕЙЧАС ТО-ЧТО

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ

def map = [2 treasure]println mapkeySet()first()classname

javalangInteger

НАМ НУЖНА КАРТА

НАМ НУЖНА КАРТА

def key = xdef map = [$key treasure]def value = map[x]println value

ANoSuchElementExceptionBnullCtreasureDПолундра Startup error

def key = xdef map = [$key treasure]def value = map[x]println value

ЧТО ОПЯТЬ

STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН

def map = [$key treasure]println mapkeySet()first()classname

orgcodehausgroovyruntimeGStringImpl

OUT OF RANGE

AAssertion FailedBfalseCtrueDNullPointerException

OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3

Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()

10 20 30 40 50 60 70 80 90 100

РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ

GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56

ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100

bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно

bullИ пусть делегирует в containsWithinBounds

bullПочините наконец GROOVY-2771

bullThank you

POWER RANGE(RS)

УБИРАЕМ ЕДИНИЧКУ

A -1012345678

C[0 2 3 4 5 6 7 8 9]

D[-1 0 1 2 3 4 5 6 7 8]

[09]each println(it - 1)

B0123456789

[09]each println(it - 1)

Это неправильные скобки

(09)each println(it - 1)

Другое дело

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

[0 2 3 4 5 6 7 8 9]

SAVE THE DATE

JOKERCONF IS COMING

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

JAVA2 КТО ПОМНИТ

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

AStartup FailureB[1 2 3 WED Oct 17

161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException

А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ

ERASURE

ERASURE

А ГДЕ МОИ ПРОВЕРКИ

ВО ВРЕМЯ КОМПИЛЯЦИИ

laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo

ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname

[javalangLong javalangLong javalangLong javautilDate javalangString]

COMPILESTATIC

π ndash ТОРТ И ЧИСЛО

DOUBLE THE PI

double value = 3println $value14isDouble()

A trueB MissingPropertyExceptionC falseDMissingMethodException

ПРОСЁК

ПРОСЁК

ПРОСЁК

A trueB MissingPropertyExceptionC falseDMissingMethodException

DOUBLE THE PI

double value = 3println $value14isDouble()

ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ

ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE

ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP

СПРОСИ ФРАНЦУЗОВ

RSVP

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

A Startup FailureB 1C 2D MissingPropertyException

А ВОТ ПОЧЕМУ

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

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

НАПРИМЕР

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

def invite = new Invite()def attendees = inviteattending +1

НУ ИЛИ УБРАТЬ СКОБКИ

Как убрать скобки

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true

B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false

C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true

D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false

ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ

В КОДЕ MIXINMETACLASS

WHY SO PRIMITIVE

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

A Startup ErrorB int long

booleanC javalangInte

ger javalangLong javalangBoolean

Dint

НУ ЭТО ЯСНО А ПОЧЕМУ

порядокточно непорядок

А ЭТО

(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК

JUMP AKA ПРОПАВШИЕ СЛОВА

>

14863602

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

A Here are the lyrics

B Here are the null

C Startup failureD MissingMethodExcep

tion

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen

public static jump() Here are the $lyrics()

static $static_methodMissing(String name def args) lyrics

println VanHalenjump()

ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП

class VanHalen

public jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println new VanHalen()jump()

>

null

10161629

WHATrsquoS THE METACLASS БАРУХ

def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух

AMissingMethodExceptionBWhats the

orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух

CWhatrsquos the javautilLinkedHashMapXXXXXX Барух

DWhatrsquos the frequency Барух

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

mapgetMetaClass()

ВЫВОДЫ

1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis

- intellij IDEA5 Rtfm6 Donrsquot code like my brother

Мы только начали (надо еще форму придумать)

Засылайте Ваши паззлеры поделки и рисунки

- puzzlers jfrogcom- Groovypuzzlers

ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ

Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch

Вам не поравилосьdevnull

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ABSOLUTELY GROOVY

A3BNoSuchMethodErrorC-3DExecution Failure

-3abs()

ЧИНИМ

(-3)abs()

ИЛИ

int value = -3valueabs()

ИДЕЯ НИЧЕГО НЕ ПЕЧАТАЕТ ПОЧЕМУ

A-3B3C3 and

NullPointerExceptionD-3 and

NullPointerException

ДОБАВИМ PRINTLN

println (-3)abs()

УБЕЙТЕ ВСЕ СКОБКИ

КОМПИЛЯТОР РАЗБЕРЕТСЯ

-3Caught javalangNullPointerException Cannot invoke method abs() on null objectjavalangNullPointerException Cannot invoke method abs() on null object

at AbsolutelyGroovyrun(AbsolutelyGroovygroovy7)at comintellijrtexecutionapplicationAppMainmain(AppMainjava134)

println (-3)abs()

ldquoВсе проблемы в программировании можно решить добавив пару скобокrdquo

John McCarthy изобретатель LISP

ПРОСТО ДОБАВЬ СКОБОК

println ((-3)abs())

ИЛИ

int value = -3println valueabs()

PRIME CUTS

PRIME CUTSboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

САМ В ШОКЕ

ПОСМОТРИМ ЕЩЕ РАЗboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

boolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

AtrueBfalse

CNumberFormatException

DMissingMethodException

КАК 4 МОГЛО ОКАЗАТЬСЯ ПРОСТЫМ ЧИСЛОМhellip

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

РЕШЕНИЕ ИСПОЛЬЗУЙ ANY() ИЛИ ПЕРЕОСМЫСЛИ АЛГОРИТМ

httpkousenitwordpresscom20140418responses-to-the-closure-of-no-return

class Conference def name def year

def gr = new Conference(name Greach year 2014)

greach println it

A class=class Conferencename=Greachyear=2014

B ConferenceXXXXXX

C Startup failure

D Greach 2014

КАКОЙ ЖЕ ЭТО ITERABLE

RTFS (READ THE FING SOURCE)

MAX POWER

MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

A ClassCastExceptionB 9C 56Dnull

РАСКУСИЛ

gtgroovysh ((9 as Character) as Integer)===gt 57

ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max

СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL

A ClassCastExceptionB 9C 56Dnull

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

КАК ЭТО ПОЛУЧИЛОСЬ

def random = new Random()

def randomList = []010each randomList ltlt randomnextInt()

assert randomListmax null == randomList[0]

ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО

ДЕТЕКТИВ

КТО УБИЙЦА

A NullPointerException

B ктоУбийцаI_closure1xxxxxxx

C Startup errorD Мориарти

Closure ктоУбийца() Мориарти println ктоУбийца()

ПИЧАЛЬКА

ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ

Closure ктоУбийца() -gt Мориарти

Closure ктоУбийца() return Мориарти

>

The Final Countdown - fragment

Europe

Top Disco Hits vol 1 track 17

9743676

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9D10

КАК ТАК ТО НУ КАК ТАК ТО

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648

ЛУЧШЕ НЕ СТАЛОhellip

ЧТО ПРОИЗОШЛО

ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

ПОЧИНИЛИclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9

D42

ЭТО ВООБЩЕ КАК

PUBLIC - PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

A publicPropertyproperty

B publicPropertyPublic__property

C publicPropertygetProperty()

D publicPropertyproperty

У МЕНЯ ДВА ВОПРОСА

1Что за дебильное имя

2 Откуда я мог это знать

ОТВЕТ НА 1 IN SOVIET RUSSIA

YOU DONrsquoT ACCESS PUBLIC

PROPERTY

ОТВЕТ НА 2

httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml

А ты документацию читать не пробовал

ГДЕ КАРТА БИЛЛИ

ГДЕ КАРТА БИЛЛИ

def key = xdef map = [key treasure]def value = mapget(key)println value

def key = xdef map = [key treasure]def value = mapget(key)println value

ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000

чертей

КАК ЭТО NULL

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ

ЧИНИМ

1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure

ЕЩЕ КАРТЫ БИЛЛИ

ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value

def map = [2 treasure]def key = 2def value = map$keyprintln value

ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку

А СЕЙЧАС ТО-ЧТО

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ

def map = [2 treasure]println mapkeySet()first()classname

javalangInteger

НАМ НУЖНА КАРТА

НАМ НУЖНА КАРТА

def key = xdef map = [$key treasure]def value = map[x]println value

ANoSuchElementExceptionBnullCtreasureDПолундра Startup error

def key = xdef map = [$key treasure]def value = map[x]println value

ЧТО ОПЯТЬ

STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН

def map = [$key treasure]println mapkeySet()first()classname

orgcodehausgroovyruntimeGStringImpl

OUT OF RANGE

AAssertion FailedBfalseCtrueDNullPointerException

OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3

Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()

10 20 30 40 50 60 70 80 90 100

РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ

GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56

ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100

bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно

bullИ пусть делегирует в containsWithinBounds

bullПочините наконец GROOVY-2771

bullThank you

POWER RANGE(RS)

УБИРАЕМ ЕДИНИЧКУ

A -1012345678

C[0 2 3 4 5 6 7 8 9]

D[-1 0 1 2 3 4 5 6 7 8]

[09]each println(it - 1)

B0123456789

[09]each println(it - 1)

Это неправильные скобки

(09)each println(it - 1)

Другое дело

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

[0 2 3 4 5 6 7 8 9]

SAVE THE DATE

JOKERCONF IS COMING

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

JAVA2 КТО ПОМНИТ

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

AStartup FailureB[1 2 3 WED Oct 17

161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException

А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ

ERASURE

ERASURE

А ГДЕ МОИ ПРОВЕРКИ

ВО ВРЕМЯ КОМПИЛЯЦИИ

laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo

ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname

[javalangLong javalangLong javalangLong javautilDate javalangString]

COMPILESTATIC

π ndash ТОРТ И ЧИСЛО

DOUBLE THE PI

double value = 3println $value14isDouble()

A trueB MissingPropertyExceptionC falseDMissingMethodException

ПРОСЁК

ПРОСЁК

ПРОСЁК

A trueB MissingPropertyExceptionC falseDMissingMethodException

DOUBLE THE PI

double value = 3println $value14isDouble()

ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ

ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE

ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP

СПРОСИ ФРАНЦУЗОВ

RSVP

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

A Startup FailureB 1C 2D MissingPropertyException

А ВОТ ПОЧЕМУ

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

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

НАПРИМЕР

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

def invite = new Invite()def attendees = inviteattending +1

НУ ИЛИ УБРАТЬ СКОБКИ

Как убрать скобки

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true

B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false

C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true

D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false

ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ

В КОДЕ MIXINMETACLASS

WHY SO PRIMITIVE

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

A Startup ErrorB int long

booleanC javalangInte

ger javalangLong javalangBoolean

Dint

НУ ЭТО ЯСНО А ПОЧЕМУ

порядокточно непорядок

А ЭТО

(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК

JUMP AKA ПРОПАВШИЕ СЛОВА

>

14863602

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

A Here are the lyrics

B Here are the null

C Startup failureD MissingMethodExcep

tion

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen

public static jump() Here are the $lyrics()

static $static_methodMissing(String name def args) lyrics

println VanHalenjump()

ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП

class VanHalen

public jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println new VanHalen()jump()

>

null

10161629

WHATrsquoS THE METACLASS БАРУХ

def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух

AMissingMethodExceptionBWhats the

orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух

CWhatrsquos the javautilLinkedHashMapXXXXXX Барух

DWhatrsquos the frequency Барух

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

mapgetMetaClass()

ВЫВОДЫ

1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis

- intellij IDEA5 Rtfm6 Donrsquot code like my brother

Мы только начали (надо еще форму придумать)

Засылайте Ваши паззлеры поделки и рисунки

- puzzlers jfrogcom- Groovypuzzlers

ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ

Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch

Вам не поравилосьdevnull

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

A3BNoSuchMethodErrorC-3DExecution Failure

-3abs()

ЧИНИМ

(-3)abs()

ИЛИ

int value = -3valueabs()

ИДЕЯ НИЧЕГО НЕ ПЕЧАТАЕТ ПОЧЕМУ

A-3B3C3 and

NullPointerExceptionD-3 and

NullPointerException

ДОБАВИМ PRINTLN

println (-3)abs()

УБЕЙТЕ ВСЕ СКОБКИ

КОМПИЛЯТОР РАЗБЕРЕТСЯ

-3Caught javalangNullPointerException Cannot invoke method abs() on null objectjavalangNullPointerException Cannot invoke method abs() on null object

at AbsolutelyGroovyrun(AbsolutelyGroovygroovy7)at comintellijrtexecutionapplicationAppMainmain(AppMainjava134)

println (-3)abs()

ldquoВсе проблемы в программировании можно решить добавив пару скобокrdquo

John McCarthy изобретатель LISP

ПРОСТО ДОБАВЬ СКОБОК

println ((-3)abs())

ИЛИ

int value = -3println valueabs()

PRIME CUTS

PRIME CUTSboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

САМ В ШОКЕ

ПОСМОТРИМ ЕЩЕ РАЗboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

boolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

AtrueBfalse

CNumberFormatException

DMissingMethodException

КАК 4 МОГЛО ОКАЗАТЬСЯ ПРОСТЫМ ЧИСЛОМhellip

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

РЕШЕНИЕ ИСПОЛЬЗУЙ ANY() ИЛИ ПЕРЕОСМЫСЛИ АЛГОРИТМ

httpkousenitwordpresscom20140418responses-to-the-closure-of-no-return

class Conference def name def year

def gr = new Conference(name Greach year 2014)

greach println it

A class=class Conferencename=Greachyear=2014

B ConferenceXXXXXX

C Startup failure

D Greach 2014

КАКОЙ ЖЕ ЭТО ITERABLE

RTFS (READ THE FING SOURCE)

MAX POWER

MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

A ClassCastExceptionB 9C 56Dnull

РАСКУСИЛ

gtgroovysh ((9 as Character) as Integer)===gt 57

ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max

СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL

A ClassCastExceptionB 9C 56Dnull

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

КАК ЭТО ПОЛУЧИЛОСЬ

def random = new Random()

def randomList = []010each randomList ltlt randomnextInt()

assert randomListmax null == randomList[0]

ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО

ДЕТЕКТИВ

КТО УБИЙЦА

A NullPointerException

B ктоУбийцаI_closure1xxxxxxx

C Startup errorD Мориарти

Closure ктоУбийца() Мориарти println ктоУбийца()

ПИЧАЛЬКА

ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ

Closure ктоУбийца() -gt Мориарти

Closure ктоУбийца() return Мориарти

>

The Final Countdown - fragment

Europe

Top Disco Hits vol 1 track 17

9743676

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9D10

КАК ТАК ТО НУ КАК ТАК ТО

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648

ЛУЧШЕ НЕ СТАЛОhellip

ЧТО ПРОИЗОШЛО

ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

ПОЧИНИЛИclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9

D42

ЭТО ВООБЩЕ КАК

PUBLIC - PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

A publicPropertyproperty

B publicPropertyPublic__property

C publicPropertygetProperty()

D publicPropertyproperty

У МЕНЯ ДВА ВОПРОСА

1Что за дебильное имя

2 Откуда я мог это знать

ОТВЕТ НА 1 IN SOVIET RUSSIA

YOU DONrsquoT ACCESS PUBLIC

PROPERTY

ОТВЕТ НА 2

httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml

А ты документацию читать не пробовал

ГДЕ КАРТА БИЛЛИ

ГДЕ КАРТА БИЛЛИ

def key = xdef map = [key treasure]def value = mapget(key)println value

def key = xdef map = [key treasure]def value = mapget(key)println value

ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000

чертей

КАК ЭТО NULL

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ

ЧИНИМ

1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure

ЕЩЕ КАРТЫ БИЛЛИ

ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value

def map = [2 treasure]def key = 2def value = map$keyprintln value

ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку

А СЕЙЧАС ТО-ЧТО

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ

def map = [2 treasure]println mapkeySet()first()classname

javalangInteger

НАМ НУЖНА КАРТА

НАМ НУЖНА КАРТА

def key = xdef map = [$key treasure]def value = map[x]println value

ANoSuchElementExceptionBnullCtreasureDПолундра Startup error

def key = xdef map = [$key treasure]def value = map[x]println value

ЧТО ОПЯТЬ

STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН

def map = [$key treasure]println mapkeySet()first()classname

orgcodehausgroovyruntimeGStringImpl

OUT OF RANGE

AAssertion FailedBfalseCtrueDNullPointerException

OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3

Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()

10 20 30 40 50 60 70 80 90 100

РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ

GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56

ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100

bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно

bullИ пусть делегирует в containsWithinBounds

bullПочините наконец GROOVY-2771

bullThank you

POWER RANGE(RS)

УБИРАЕМ ЕДИНИЧКУ

A -1012345678

C[0 2 3 4 5 6 7 8 9]

D[-1 0 1 2 3 4 5 6 7 8]

[09]each println(it - 1)

B0123456789

[09]each println(it - 1)

Это неправильные скобки

(09)each println(it - 1)

Другое дело

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

[0 2 3 4 5 6 7 8 9]

SAVE THE DATE

JOKERCONF IS COMING

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

JAVA2 КТО ПОМНИТ

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

AStartup FailureB[1 2 3 WED Oct 17

161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException

А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ

ERASURE

ERASURE

А ГДЕ МОИ ПРОВЕРКИ

ВО ВРЕМЯ КОМПИЛЯЦИИ

laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo

ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname

[javalangLong javalangLong javalangLong javautilDate javalangString]

COMPILESTATIC

π ndash ТОРТ И ЧИСЛО

DOUBLE THE PI

double value = 3println $value14isDouble()

A trueB MissingPropertyExceptionC falseDMissingMethodException

ПРОСЁК

ПРОСЁК

ПРОСЁК

A trueB MissingPropertyExceptionC falseDMissingMethodException

DOUBLE THE PI

double value = 3println $value14isDouble()

ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ

ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE

ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP

СПРОСИ ФРАНЦУЗОВ

RSVP

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

A Startup FailureB 1C 2D MissingPropertyException

А ВОТ ПОЧЕМУ

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

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

НАПРИМЕР

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

def invite = new Invite()def attendees = inviteattending +1

НУ ИЛИ УБРАТЬ СКОБКИ

Как убрать скобки

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true

B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false

C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true

D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false

ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ

В КОДЕ MIXINMETACLASS

WHY SO PRIMITIVE

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

A Startup ErrorB int long

booleanC javalangInte

ger javalangLong javalangBoolean

Dint

НУ ЭТО ЯСНО А ПОЧЕМУ

порядокточно непорядок

А ЭТО

(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК

JUMP AKA ПРОПАВШИЕ СЛОВА

>

14863602

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

A Here are the lyrics

B Here are the null

C Startup failureD MissingMethodExcep

tion

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen

public static jump() Here are the $lyrics()

static $static_methodMissing(String name def args) lyrics

println VanHalenjump()

ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП

class VanHalen

public jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println new VanHalen()jump()

>

null

10161629

WHATrsquoS THE METACLASS БАРУХ

def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух

AMissingMethodExceptionBWhats the

orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух

CWhatrsquos the javautilLinkedHashMapXXXXXX Барух

DWhatrsquos the frequency Барух

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

mapgetMetaClass()

ВЫВОДЫ

1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis

- intellij IDEA5 Rtfm6 Donrsquot code like my brother

Мы только начали (надо еще форму придумать)

Засылайте Ваши паззлеры поделки и рисунки

- puzzlers jfrogcom- Groovypuzzlers

ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ

Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch

Вам не поравилосьdevnull

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ЧИНИМ

(-3)abs()

ИЛИ

int value = -3valueabs()

ИДЕЯ НИЧЕГО НЕ ПЕЧАТАЕТ ПОЧЕМУ

A-3B3C3 and

NullPointerExceptionD-3 and

NullPointerException

ДОБАВИМ PRINTLN

println (-3)abs()

УБЕЙТЕ ВСЕ СКОБКИ

КОМПИЛЯТОР РАЗБЕРЕТСЯ

-3Caught javalangNullPointerException Cannot invoke method abs() on null objectjavalangNullPointerException Cannot invoke method abs() on null object

at AbsolutelyGroovyrun(AbsolutelyGroovygroovy7)at comintellijrtexecutionapplicationAppMainmain(AppMainjava134)

println (-3)abs()

ldquoВсе проблемы в программировании можно решить добавив пару скобокrdquo

John McCarthy изобретатель LISP

ПРОСТО ДОБАВЬ СКОБОК

println ((-3)abs())

ИЛИ

int value = -3println valueabs()

PRIME CUTS

PRIME CUTSboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

САМ В ШОКЕ

ПОСМОТРИМ ЕЩЕ РАЗboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

boolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

AtrueBfalse

CNumberFormatException

DMissingMethodException

КАК 4 МОГЛО ОКАЗАТЬСЯ ПРОСТЫМ ЧИСЛОМhellip

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

РЕШЕНИЕ ИСПОЛЬЗУЙ ANY() ИЛИ ПЕРЕОСМЫСЛИ АЛГОРИТМ

httpkousenitwordpresscom20140418responses-to-the-closure-of-no-return

class Conference def name def year

def gr = new Conference(name Greach year 2014)

greach println it

A class=class Conferencename=Greachyear=2014

B ConferenceXXXXXX

C Startup failure

D Greach 2014

КАКОЙ ЖЕ ЭТО ITERABLE

RTFS (READ THE FING SOURCE)

MAX POWER

MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

A ClassCastExceptionB 9C 56Dnull

РАСКУСИЛ

gtgroovysh ((9 as Character) as Integer)===gt 57

ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max

СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL

A ClassCastExceptionB 9C 56Dnull

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

КАК ЭТО ПОЛУЧИЛОСЬ

def random = new Random()

def randomList = []010each randomList ltlt randomnextInt()

assert randomListmax null == randomList[0]

ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО

ДЕТЕКТИВ

КТО УБИЙЦА

A NullPointerException

B ктоУбийцаI_closure1xxxxxxx

C Startup errorD Мориарти

Closure ктоУбийца() Мориарти println ктоУбийца()

ПИЧАЛЬКА

ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ

Closure ктоУбийца() -gt Мориарти

Closure ктоУбийца() return Мориарти

>

The Final Countdown - fragment

Europe

Top Disco Hits vol 1 track 17

9743676

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9D10

КАК ТАК ТО НУ КАК ТАК ТО

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648

ЛУЧШЕ НЕ СТАЛОhellip

ЧТО ПРОИЗОШЛО

ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

ПОЧИНИЛИclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9

D42

ЭТО ВООБЩЕ КАК

PUBLIC - PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

A publicPropertyproperty

B publicPropertyPublic__property

C publicPropertygetProperty()

D publicPropertyproperty

У МЕНЯ ДВА ВОПРОСА

1Что за дебильное имя

2 Откуда я мог это знать

ОТВЕТ НА 1 IN SOVIET RUSSIA

YOU DONrsquoT ACCESS PUBLIC

PROPERTY

ОТВЕТ НА 2

httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml

А ты документацию читать не пробовал

ГДЕ КАРТА БИЛЛИ

ГДЕ КАРТА БИЛЛИ

def key = xdef map = [key treasure]def value = mapget(key)println value

def key = xdef map = [key treasure]def value = mapget(key)println value

ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000

чертей

КАК ЭТО NULL

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ

ЧИНИМ

1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure

ЕЩЕ КАРТЫ БИЛЛИ

ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value

def map = [2 treasure]def key = 2def value = map$keyprintln value

ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку

А СЕЙЧАС ТО-ЧТО

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ

def map = [2 treasure]println mapkeySet()first()classname

javalangInteger

НАМ НУЖНА КАРТА

НАМ НУЖНА КАРТА

def key = xdef map = [$key treasure]def value = map[x]println value

ANoSuchElementExceptionBnullCtreasureDПолундра Startup error

def key = xdef map = [$key treasure]def value = map[x]println value

ЧТО ОПЯТЬ

STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН

def map = [$key treasure]println mapkeySet()first()classname

orgcodehausgroovyruntimeGStringImpl

OUT OF RANGE

AAssertion FailedBfalseCtrueDNullPointerException

OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3

Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()

10 20 30 40 50 60 70 80 90 100

РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ

GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56

ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100

bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно

bullИ пусть делегирует в containsWithinBounds

bullПочините наконец GROOVY-2771

bullThank you

POWER RANGE(RS)

УБИРАЕМ ЕДИНИЧКУ

A -1012345678

C[0 2 3 4 5 6 7 8 9]

D[-1 0 1 2 3 4 5 6 7 8]

[09]each println(it - 1)

B0123456789

[09]each println(it - 1)

Это неправильные скобки

(09)each println(it - 1)

Другое дело

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

[0 2 3 4 5 6 7 8 9]

SAVE THE DATE

JOKERCONF IS COMING

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

JAVA2 КТО ПОМНИТ

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

AStartup FailureB[1 2 3 WED Oct 17

161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException

А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ

ERASURE

ERASURE

А ГДЕ МОИ ПРОВЕРКИ

ВО ВРЕМЯ КОМПИЛЯЦИИ

laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo

ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname

[javalangLong javalangLong javalangLong javautilDate javalangString]

COMPILESTATIC

π ndash ТОРТ И ЧИСЛО

DOUBLE THE PI

double value = 3println $value14isDouble()

A trueB MissingPropertyExceptionC falseDMissingMethodException

ПРОСЁК

ПРОСЁК

ПРОСЁК

A trueB MissingPropertyExceptionC falseDMissingMethodException

DOUBLE THE PI

double value = 3println $value14isDouble()

ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ

ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE

ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP

СПРОСИ ФРАНЦУЗОВ

RSVP

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

A Startup FailureB 1C 2D MissingPropertyException

А ВОТ ПОЧЕМУ

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

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

НАПРИМЕР

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

def invite = new Invite()def attendees = inviteattending +1

НУ ИЛИ УБРАТЬ СКОБКИ

Как убрать скобки

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true

B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false

C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true

D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false

ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ

В КОДЕ MIXINMETACLASS

WHY SO PRIMITIVE

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

A Startup ErrorB int long

booleanC javalangInte

ger javalangLong javalangBoolean

Dint

НУ ЭТО ЯСНО А ПОЧЕМУ

порядокточно непорядок

А ЭТО

(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК

JUMP AKA ПРОПАВШИЕ СЛОВА

>

14863602

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

A Here are the lyrics

B Here are the null

C Startup failureD MissingMethodExcep

tion

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen

public static jump() Here are the $lyrics()

static $static_methodMissing(String name def args) lyrics

println VanHalenjump()

ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП

class VanHalen

public jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println new VanHalen()jump()

>

null

10161629

WHATrsquoS THE METACLASS БАРУХ

def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух

AMissingMethodExceptionBWhats the

orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух

CWhatrsquos the javautilLinkedHashMapXXXXXX Барух

DWhatrsquos the frequency Барух

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

mapgetMetaClass()

ВЫВОДЫ

1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis

- intellij IDEA5 Rtfm6 Donrsquot code like my brother

Мы только начали (надо еще форму придумать)

Засылайте Ваши паззлеры поделки и рисунки

- puzzlers jfrogcom- Groovypuzzlers

ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ

Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch

Вам не поравилосьdevnull

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ИДЕЯ НИЧЕГО НЕ ПЕЧАТАЕТ ПОЧЕМУ

A-3B3C3 and

NullPointerExceptionD-3 and

NullPointerException

ДОБАВИМ PRINTLN

println (-3)abs()

УБЕЙТЕ ВСЕ СКОБКИ

КОМПИЛЯТОР РАЗБЕРЕТСЯ

-3Caught javalangNullPointerException Cannot invoke method abs() on null objectjavalangNullPointerException Cannot invoke method abs() on null object

at AbsolutelyGroovyrun(AbsolutelyGroovygroovy7)at comintellijrtexecutionapplicationAppMainmain(AppMainjava134)

println (-3)abs()

ldquoВсе проблемы в программировании можно решить добавив пару скобокrdquo

John McCarthy изобретатель LISP

ПРОСТО ДОБАВЬ СКОБОК

println ((-3)abs())

ИЛИ

int value = -3println valueabs()

PRIME CUTS

PRIME CUTSboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

САМ В ШОКЕ

ПОСМОТРИМ ЕЩЕ РАЗboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

boolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

AtrueBfalse

CNumberFormatException

DMissingMethodException

КАК 4 МОГЛО ОКАЗАТЬСЯ ПРОСТЫМ ЧИСЛОМhellip

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

РЕШЕНИЕ ИСПОЛЬЗУЙ ANY() ИЛИ ПЕРЕОСМЫСЛИ АЛГОРИТМ

httpkousenitwordpresscom20140418responses-to-the-closure-of-no-return

class Conference def name def year

def gr = new Conference(name Greach year 2014)

greach println it

A class=class Conferencename=Greachyear=2014

B ConferenceXXXXXX

C Startup failure

D Greach 2014

КАКОЙ ЖЕ ЭТО ITERABLE

RTFS (READ THE FING SOURCE)

MAX POWER

MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

A ClassCastExceptionB 9C 56Dnull

РАСКУСИЛ

gtgroovysh ((9 as Character) as Integer)===gt 57

ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max

СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL

A ClassCastExceptionB 9C 56Dnull

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

КАК ЭТО ПОЛУЧИЛОСЬ

def random = new Random()

def randomList = []010each randomList ltlt randomnextInt()

assert randomListmax null == randomList[0]

ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО

ДЕТЕКТИВ

КТО УБИЙЦА

A NullPointerException

B ктоУбийцаI_closure1xxxxxxx

C Startup errorD Мориарти

Closure ктоУбийца() Мориарти println ктоУбийца()

ПИЧАЛЬКА

ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ

Closure ктоУбийца() -gt Мориарти

Closure ктоУбийца() return Мориарти

>

The Final Countdown - fragment

Europe

Top Disco Hits vol 1 track 17

9743676

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9D10

КАК ТАК ТО НУ КАК ТАК ТО

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648

ЛУЧШЕ НЕ СТАЛОhellip

ЧТО ПРОИЗОШЛО

ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

ПОЧИНИЛИclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9

D42

ЭТО ВООБЩЕ КАК

PUBLIC - PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

A publicPropertyproperty

B publicPropertyPublic__property

C publicPropertygetProperty()

D publicPropertyproperty

У МЕНЯ ДВА ВОПРОСА

1Что за дебильное имя

2 Откуда я мог это знать

ОТВЕТ НА 1 IN SOVIET RUSSIA

YOU DONrsquoT ACCESS PUBLIC

PROPERTY

ОТВЕТ НА 2

httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml

А ты документацию читать не пробовал

ГДЕ КАРТА БИЛЛИ

ГДЕ КАРТА БИЛЛИ

def key = xdef map = [key treasure]def value = mapget(key)println value

def key = xdef map = [key treasure]def value = mapget(key)println value

ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000

чертей

КАК ЭТО NULL

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ

ЧИНИМ

1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure

ЕЩЕ КАРТЫ БИЛЛИ

ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value

def map = [2 treasure]def key = 2def value = map$keyprintln value

ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку

А СЕЙЧАС ТО-ЧТО

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ

def map = [2 treasure]println mapkeySet()first()classname

javalangInteger

НАМ НУЖНА КАРТА

НАМ НУЖНА КАРТА

def key = xdef map = [$key treasure]def value = map[x]println value

ANoSuchElementExceptionBnullCtreasureDПолундра Startup error

def key = xdef map = [$key treasure]def value = map[x]println value

ЧТО ОПЯТЬ

STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН

def map = [$key treasure]println mapkeySet()first()classname

orgcodehausgroovyruntimeGStringImpl

OUT OF RANGE

AAssertion FailedBfalseCtrueDNullPointerException

OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3

Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()

10 20 30 40 50 60 70 80 90 100

РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ

GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56

ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100

bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно

bullИ пусть делегирует в containsWithinBounds

bullПочините наконец GROOVY-2771

bullThank you

POWER RANGE(RS)

УБИРАЕМ ЕДИНИЧКУ

A -1012345678

C[0 2 3 4 5 6 7 8 9]

D[-1 0 1 2 3 4 5 6 7 8]

[09]each println(it - 1)

B0123456789

[09]each println(it - 1)

Это неправильные скобки

(09)each println(it - 1)

Другое дело

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

[0 2 3 4 5 6 7 8 9]

SAVE THE DATE

JOKERCONF IS COMING

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

JAVA2 КТО ПОМНИТ

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

AStartup FailureB[1 2 3 WED Oct 17

161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException

А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ

ERASURE

ERASURE

А ГДЕ МОИ ПРОВЕРКИ

ВО ВРЕМЯ КОМПИЛЯЦИИ

laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo

ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname

[javalangLong javalangLong javalangLong javautilDate javalangString]

COMPILESTATIC

π ndash ТОРТ И ЧИСЛО

DOUBLE THE PI

double value = 3println $value14isDouble()

A trueB MissingPropertyExceptionC falseDMissingMethodException

ПРОСЁК

ПРОСЁК

ПРОСЁК

A trueB MissingPropertyExceptionC falseDMissingMethodException

DOUBLE THE PI

double value = 3println $value14isDouble()

ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ

ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE

ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP

СПРОСИ ФРАНЦУЗОВ

RSVP

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

A Startup FailureB 1C 2D MissingPropertyException

А ВОТ ПОЧЕМУ

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

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

НАПРИМЕР

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

def invite = new Invite()def attendees = inviteattending +1

НУ ИЛИ УБРАТЬ СКОБКИ

Как убрать скобки

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true

B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false

C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true

D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false

ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ

В КОДЕ MIXINMETACLASS

WHY SO PRIMITIVE

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

A Startup ErrorB int long

booleanC javalangInte

ger javalangLong javalangBoolean

Dint

НУ ЭТО ЯСНО А ПОЧЕМУ

порядокточно непорядок

А ЭТО

(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК

JUMP AKA ПРОПАВШИЕ СЛОВА

>

14863602

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

A Here are the lyrics

B Here are the null

C Startup failureD MissingMethodExcep

tion

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen

public static jump() Here are the $lyrics()

static $static_methodMissing(String name def args) lyrics

println VanHalenjump()

ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП

class VanHalen

public jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println new VanHalen()jump()

>

null

10161629

WHATrsquoS THE METACLASS БАРУХ

def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух

AMissingMethodExceptionBWhats the

orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух

CWhatrsquos the javautilLinkedHashMapXXXXXX Барух

DWhatrsquos the frequency Барух

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

mapgetMetaClass()

ВЫВОДЫ

1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis

- intellij IDEA5 Rtfm6 Donrsquot code like my brother

Мы только начали (надо еще форму придумать)

Засылайте Ваши паззлеры поделки и рисунки

- puzzlers jfrogcom- Groovypuzzlers

ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ

Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch

Вам не поравилосьdevnull

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

A-3B3C3 and

NullPointerExceptionD-3 and

NullPointerException

ДОБАВИМ PRINTLN

println (-3)abs()

УБЕЙТЕ ВСЕ СКОБКИ

КОМПИЛЯТОР РАЗБЕРЕТСЯ

-3Caught javalangNullPointerException Cannot invoke method abs() on null objectjavalangNullPointerException Cannot invoke method abs() on null object

at AbsolutelyGroovyrun(AbsolutelyGroovygroovy7)at comintellijrtexecutionapplicationAppMainmain(AppMainjava134)

println (-3)abs()

ldquoВсе проблемы в программировании можно решить добавив пару скобокrdquo

John McCarthy изобретатель LISP

ПРОСТО ДОБАВЬ СКОБОК

println ((-3)abs())

ИЛИ

int value = -3println valueabs()

PRIME CUTS

PRIME CUTSboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

САМ В ШОКЕ

ПОСМОТРИМ ЕЩЕ РАЗboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

boolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

AtrueBfalse

CNumberFormatException

DMissingMethodException

КАК 4 МОГЛО ОКАЗАТЬСЯ ПРОСТЫМ ЧИСЛОМhellip

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

РЕШЕНИЕ ИСПОЛЬЗУЙ ANY() ИЛИ ПЕРЕОСМЫСЛИ АЛГОРИТМ

httpkousenitwordpresscom20140418responses-to-the-closure-of-no-return

class Conference def name def year

def gr = new Conference(name Greach year 2014)

greach println it

A class=class Conferencename=Greachyear=2014

B ConferenceXXXXXX

C Startup failure

D Greach 2014

КАКОЙ ЖЕ ЭТО ITERABLE

RTFS (READ THE FING SOURCE)

MAX POWER

MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

A ClassCastExceptionB 9C 56Dnull

РАСКУСИЛ

gtgroovysh ((9 as Character) as Integer)===gt 57

ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max

СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL

A ClassCastExceptionB 9C 56Dnull

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

КАК ЭТО ПОЛУЧИЛОСЬ

def random = new Random()

def randomList = []010each randomList ltlt randomnextInt()

assert randomListmax null == randomList[0]

ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО

ДЕТЕКТИВ

КТО УБИЙЦА

A NullPointerException

B ктоУбийцаI_closure1xxxxxxx

C Startup errorD Мориарти

Closure ктоУбийца() Мориарти println ктоУбийца()

ПИЧАЛЬКА

ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ

Closure ктоУбийца() -gt Мориарти

Closure ктоУбийца() return Мориарти

>

The Final Countdown - fragment

Europe

Top Disco Hits vol 1 track 17

9743676

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9D10

КАК ТАК ТО НУ КАК ТАК ТО

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648

ЛУЧШЕ НЕ СТАЛОhellip

ЧТО ПРОИЗОШЛО

ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

ПОЧИНИЛИclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9

D42

ЭТО ВООБЩЕ КАК

PUBLIC - PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

A publicPropertyproperty

B publicPropertyPublic__property

C publicPropertygetProperty()

D publicPropertyproperty

У МЕНЯ ДВА ВОПРОСА

1Что за дебильное имя

2 Откуда я мог это знать

ОТВЕТ НА 1 IN SOVIET RUSSIA

YOU DONrsquoT ACCESS PUBLIC

PROPERTY

ОТВЕТ НА 2

httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml

А ты документацию читать не пробовал

ГДЕ КАРТА БИЛЛИ

ГДЕ КАРТА БИЛЛИ

def key = xdef map = [key treasure]def value = mapget(key)println value

def key = xdef map = [key treasure]def value = mapget(key)println value

ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000

чертей

КАК ЭТО NULL

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ

ЧИНИМ

1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure

ЕЩЕ КАРТЫ БИЛЛИ

ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value

def map = [2 treasure]def key = 2def value = map$keyprintln value

ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку

А СЕЙЧАС ТО-ЧТО

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ

def map = [2 treasure]println mapkeySet()first()classname

javalangInteger

НАМ НУЖНА КАРТА

НАМ НУЖНА КАРТА

def key = xdef map = [$key treasure]def value = map[x]println value

ANoSuchElementExceptionBnullCtreasureDПолундра Startup error

def key = xdef map = [$key treasure]def value = map[x]println value

ЧТО ОПЯТЬ

STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН

def map = [$key treasure]println mapkeySet()first()classname

orgcodehausgroovyruntimeGStringImpl

OUT OF RANGE

AAssertion FailedBfalseCtrueDNullPointerException

OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3

Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()

10 20 30 40 50 60 70 80 90 100

РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ

GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56

ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100

bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно

bullИ пусть делегирует в containsWithinBounds

bullПочините наконец GROOVY-2771

bullThank you

POWER RANGE(RS)

УБИРАЕМ ЕДИНИЧКУ

A -1012345678

C[0 2 3 4 5 6 7 8 9]

D[-1 0 1 2 3 4 5 6 7 8]

[09]each println(it - 1)

B0123456789

[09]each println(it - 1)

Это неправильные скобки

(09)each println(it - 1)

Другое дело

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

[0 2 3 4 5 6 7 8 9]

SAVE THE DATE

JOKERCONF IS COMING

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

JAVA2 КТО ПОМНИТ

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

AStartup FailureB[1 2 3 WED Oct 17

161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException

А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ

ERASURE

ERASURE

А ГДЕ МОИ ПРОВЕРКИ

ВО ВРЕМЯ КОМПИЛЯЦИИ

laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo

ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname

[javalangLong javalangLong javalangLong javautilDate javalangString]

COMPILESTATIC

π ndash ТОРТ И ЧИСЛО

DOUBLE THE PI

double value = 3println $value14isDouble()

A trueB MissingPropertyExceptionC falseDMissingMethodException

ПРОСЁК

ПРОСЁК

ПРОСЁК

A trueB MissingPropertyExceptionC falseDMissingMethodException

DOUBLE THE PI

double value = 3println $value14isDouble()

ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ

ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE

ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP

СПРОСИ ФРАНЦУЗОВ

RSVP

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

A Startup FailureB 1C 2D MissingPropertyException

А ВОТ ПОЧЕМУ

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

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

НАПРИМЕР

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

def invite = new Invite()def attendees = inviteattending +1

НУ ИЛИ УБРАТЬ СКОБКИ

Как убрать скобки

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true

B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false

C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true

D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false

ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ

В КОДЕ MIXINMETACLASS

WHY SO PRIMITIVE

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

A Startup ErrorB int long

booleanC javalangInte

ger javalangLong javalangBoolean

Dint

НУ ЭТО ЯСНО А ПОЧЕМУ

порядокточно непорядок

А ЭТО

(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК

JUMP AKA ПРОПАВШИЕ СЛОВА

>

14863602

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

A Here are the lyrics

B Here are the null

C Startup failureD MissingMethodExcep

tion

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen

public static jump() Here are the $lyrics()

static $static_methodMissing(String name def args) lyrics

println VanHalenjump()

ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП

class VanHalen

public jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println new VanHalen()jump()

>

null

10161629

WHATrsquoS THE METACLASS БАРУХ

def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух

AMissingMethodExceptionBWhats the

orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух

CWhatrsquos the javautilLinkedHashMapXXXXXX Барух

DWhatrsquos the frequency Барух

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

mapgetMetaClass()

ВЫВОДЫ

1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis

- intellij IDEA5 Rtfm6 Donrsquot code like my brother

Мы только начали (надо еще форму придумать)

Засылайте Ваши паззлеры поделки и рисунки

- puzzlers jfrogcom- Groovypuzzlers

ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ

Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch

Вам не поравилосьdevnull

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

УБЕЙТЕ ВСЕ СКОБКИ

КОМПИЛЯТОР РАЗБЕРЕТСЯ

-3Caught javalangNullPointerException Cannot invoke method abs() on null objectjavalangNullPointerException Cannot invoke method abs() on null object

at AbsolutelyGroovyrun(AbsolutelyGroovygroovy7)at comintellijrtexecutionapplicationAppMainmain(AppMainjava134)

println (-3)abs()

ldquoВсе проблемы в программировании можно решить добавив пару скобокrdquo

John McCarthy изобретатель LISP

ПРОСТО ДОБАВЬ СКОБОК

println ((-3)abs())

ИЛИ

int value = -3println valueabs()

PRIME CUTS

PRIME CUTSboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

САМ В ШОКЕ

ПОСМОТРИМ ЕЩЕ РАЗboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

boolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

AtrueBfalse

CNumberFormatException

DMissingMethodException

КАК 4 МОГЛО ОКАЗАТЬСЯ ПРОСТЫМ ЧИСЛОМhellip

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

РЕШЕНИЕ ИСПОЛЬЗУЙ ANY() ИЛИ ПЕРЕОСМЫСЛИ АЛГОРИТМ

httpkousenitwordpresscom20140418responses-to-the-closure-of-no-return

class Conference def name def year

def gr = new Conference(name Greach year 2014)

greach println it

A class=class Conferencename=Greachyear=2014

B ConferenceXXXXXX

C Startup failure

D Greach 2014

КАКОЙ ЖЕ ЭТО ITERABLE

RTFS (READ THE FING SOURCE)

MAX POWER

MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

A ClassCastExceptionB 9C 56Dnull

РАСКУСИЛ

gtgroovysh ((9 as Character) as Integer)===gt 57

ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max

СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL

A ClassCastExceptionB 9C 56Dnull

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

КАК ЭТО ПОЛУЧИЛОСЬ

def random = new Random()

def randomList = []010each randomList ltlt randomnextInt()

assert randomListmax null == randomList[0]

ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО

ДЕТЕКТИВ

КТО УБИЙЦА

A NullPointerException

B ктоУбийцаI_closure1xxxxxxx

C Startup errorD Мориарти

Closure ктоУбийца() Мориарти println ктоУбийца()

ПИЧАЛЬКА

ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ

Closure ктоУбийца() -gt Мориарти

Closure ктоУбийца() return Мориарти

>

The Final Countdown - fragment

Europe

Top Disco Hits vol 1 track 17

9743676

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9D10

КАК ТАК ТО НУ КАК ТАК ТО

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648

ЛУЧШЕ НЕ СТАЛОhellip

ЧТО ПРОИЗОШЛО

ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

ПОЧИНИЛИclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9

D42

ЭТО ВООБЩЕ КАК

PUBLIC - PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

A publicPropertyproperty

B publicPropertyPublic__property

C publicPropertygetProperty()

D publicPropertyproperty

У МЕНЯ ДВА ВОПРОСА

1Что за дебильное имя

2 Откуда я мог это знать

ОТВЕТ НА 1 IN SOVIET RUSSIA

YOU DONrsquoT ACCESS PUBLIC

PROPERTY

ОТВЕТ НА 2

httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml

А ты документацию читать не пробовал

ГДЕ КАРТА БИЛЛИ

ГДЕ КАРТА БИЛЛИ

def key = xdef map = [key treasure]def value = mapget(key)println value

def key = xdef map = [key treasure]def value = mapget(key)println value

ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000

чертей

КАК ЭТО NULL

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ

ЧИНИМ

1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure

ЕЩЕ КАРТЫ БИЛЛИ

ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value

def map = [2 treasure]def key = 2def value = map$keyprintln value

ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку

А СЕЙЧАС ТО-ЧТО

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ

def map = [2 treasure]println mapkeySet()first()classname

javalangInteger

НАМ НУЖНА КАРТА

НАМ НУЖНА КАРТА

def key = xdef map = [$key treasure]def value = map[x]println value

ANoSuchElementExceptionBnullCtreasureDПолундра Startup error

def key = xdef map = [$key treasure]def value = map[x]println value

ЧТО ОПЯТЬ

STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН

def map = [$key treasure]println mapkeySet()first()classname

orgcodehausgroovyruntimeGStringImpl

OUT OF RANGE

AAssertion FailedBfalseCtrueDNullPointerException

OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3

Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()

10 20 30 40 50 60 70 80 90 100

РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ

GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56

ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100

bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно

bullИ пусть делегирует в containsWithinBounds

bullПочините наконец GROOVY-2771

bullThank you

POWER RANGE(RS)

УБИРАЕМ ЕДИНИЧКУ

A -1012345678

C[0 2 3 4 5 6 7 8 9]

D[-1 0 1 2 3 4 5 6 7 8]

[09]each println(it - 1)

B0123456789

[09]each println(it - 1)

Это неправильные скобки

(09)each println(it - 1)

Другое дело

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

[0 2 3 4 5 6 7 8 9]

SAVE THE DATE

JOKERCONF IS COMING

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

JAVA2 КТО ПОМНИТ

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

AStartup FailureB[1 2 3 WED Oct 17

161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException

А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ

ERASURE

ERASURE

А ГДЕ МОИ ПРОВЕРКИ

ВО ВРЕМЯ КОМПИЛЯЦИИ

laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo

ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname

[javalangLong javalangLong javalangLong javautilDate javalangString]

COMPILESTATIC

π ndash ТОРТ И ЧИСЛО

DOUBLE THE PI

double value = 3println $value14isDouble()

A trueB MissingPropertyExceptionC falseDMissingMethodException

ПРОСЁК

ПРОСЁК

ПРОСЁК

A trueB MissingPropertyExceptionC falseDMissingMethodException

DOUBLE THE PI

double value = 3println $value14isDouble()

ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ

ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE

ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP

СПРОСИ ФРАНЦУЗОВ

RSVP

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

A Startup FailureB 1C 2D MissingPropertyException

А ВОТ ПОЧЕМУ

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

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

НАПРИМЕР

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

def invite = new Invite()def attendees = inviteattending +1

НУ ИЛИ УБРАТЬ СКОБКИ

Как убрать скобки

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true

B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false

C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true

D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false

ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ

В КОДЕ MIXINMETACLASS

WHY SO PRIMITIVE

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

A Startup ErrorB int long

booleanC javalangInte

ger javalangLong javalangBoolean

Dint

НУ ЭТО ЯСНО А ПОЧЕМУ

порядокточно непорядок

А ЭТО

(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК

JUMP AKA ПРОПАВШИЕ СЛОВА

>

14863602

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

A Here are the lyrics

B Here are the null

C Startup failureD MissingMethodExcep

tion

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen

public static jump() Here are the $lyrics()

static $static_methodMissing(String name def args) lyrics

println VanHalenjump()

ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП

class VanHalen

public jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println new VanHalen()jump()

>

null

10161629

WHATrsquoS THE METACLASS БАРУХ

def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух

AMissingMethodExceptionBWhats the

orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух

CWhatrsquos the javautilLinkedHashMapXXXXXX Барух

DWhatrsquos the frequency Барух

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

mapgetMetaClass()

ВЫВОДЫ

1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis

- intellij IDEA5 Rtfm6 Donrsquot code like my brother

Мы только начали (надо еще форму придумать)

Засылайте Ваши паззлеры поделки и рисунки

- puzzlers jfrogcom- Groovypuzzlers

ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ

Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch

Вам не поравилосьdevnull

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

-3Caught javalangNullPointerException Cannot invoke method abs() on null objectjavalangNullPointerException Cannot invoke method abs() on null object

at AbsolutelyGroovyrun(AbsolutelyGroovygroovy7)at comintellijrtexecutionapplicationAppMainmain(AppMainjava134)

println (-3)abs()

ldquoВсе проблемы в программировании можно решить добавив пару скобокrdquo

John McCarthy изобретатель LISP

ПРОСТО ДОБАВЬ СКОБОК

println ((-3)abs())

ИЛИ

int value = -3println valueabs()

PRIME CUTS

PRIME CUTSboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

САМ В ШОКЕ

ПОСМОТРИМ ЕЩЕ РАЗboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

boolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

AtrueBfalse

CNumberFormatException

DMissingMethodException

КАК 4 МОГЛО ОКАЗАТЬСЯ ПРОСТЫМ ЧИСЛОМhellip

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

РЕШЕНИЕ ИСПОЛЬЗУЙ ANY() ИЛИ ПЕРЕОСМЫСЛИ АЛГОРИТМ

httpkousenitwordpresscom20140418responses-to-the-closure-of-no-return

class Conference def name def year

def gr = new Conference(name Greach year 2014)

greach println it

A class=class Conferencename=Greachyear=2014

B ConferenceXXXXXX

C Startup failure

D Greach 2014

КАКОЙ ЖЕ ЭТО ITERABLE

RTFS (READ THE FING SOURCE)

MAX POWER

MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

A ClassCastExceptionB 9C 56Dnull

РАСКУСИЛ

gtgroovysh ((9 as Character) as Integer)===gt 57

ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max

СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL

A ClassCastExceptionB 9C 56Dnull

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

КАК ЭТО ПОЛУЧИЛОСЬ

def random = new Random()

def randomList = []010each randomList ltlt randomnextInt()

assert randomListmax null == randomList[0]

ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО

ДЕТЕКТИВ

КТО УБИЙЦА

A NullPointerException

B ктоУбийцаI_closure1xxxxxxx

C Startup errorD Мориарти

Closure ктоУбийца() Мориарти println ктоУбийца()

ПИЧАЛЬКА

ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ

Closure ктоУбийца() -gt Мориарти

Closure ктоУбийца() return Мориарти

>

The Final Countdown - fragment

Europe

Top Disco Hits vol 1 track 17

9743676

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9D10

КАК ТАК ТО НУ КАК ТАК ТО

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648

ЛУЧШЕ НЕ СТАЛОhellip

ЧТО ПРОИЗОШЛО

ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

ПОЧИНИЛИclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9

D42

ЭТО ВООБЩЕ КАК

PUBLIC - PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

A publicPropertyproperty

B publicPropertyPublic__property

C publicPropertygetProperty()

D publicPropertyproperty

У МЕНЯ ДВА ВОПРОСА

1Что за дебильное имя

2 Откуда я мог это знать

ОТВЕТ НА 1 IN SOVIET RUSSIA

YOU DONrsquoT ACCESS PUBLIC

PROPERTY

ОТВЕТ НА 2

httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml

А ты документацию читать не пробовал

ГДЕ КАРТА БИЛЛИ

ГДЕ КАРТА БИЛЛИ

def key = xdef map = [key treasure]def value = mapget(key)println value

def key = xdef map = [key treasure]def value = mapget(key)println value

ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000

чертей

КАК ЭТО NULL

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ

ЧИНИМ

1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure

ЕЩЕ КАРТЫ БИЛЛИ

ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value

def map = [2 treasure]def key = 2def value = map$keyprintln value

ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку

А СЕЙЧАС ТО-ЧТО

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ

def map = [2 treasure]println mapkeySet()first()classname

javalangInteger

НАМ НУЖНА КАРТА

НАМ НУЖНА КАРТА

def key = xdef map = [$key treasure]def value = map[x]println value

ANoSuchElementExceptionBnullCtreasureDПолундра Startup error

def key = xdef map = [$key treasure]def value = map[x]println value

ЧТО ОПЯТЬ

STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН

def map = [$key treasure]println mapkeySet()first()classname

orgcodehausgroovyruntimeGStringImpl

OUT OF RANGE

AAssertion FailedBfalseCtrueDNullPointerException

OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3

Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()

10 20 30 40 50 60 70 80 90 100

РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ

GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56

ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100

bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно

bullИ пусть делегирует в containsWithinBounds

bullПочините наконец GROOVY-2771

bullThank you

POWER RANGE(RS)

УБИРАЕМ ЕДИНИЧКУ

A -1012345678

C[0 2 3 4 5 6 7 8 9]

D[-1 0 1 2 3 4 5 6 7 8]

[09]each println(it - 1)

B0123456789

[09]each println(it - 1)

Это неправильные скобки

(09)each println(it - 1)

Другое дело

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

[0 2 3 4 5 6 7 8 9]

SAVE THE DATE

JOKERCONF IS COMING

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

JAVA2 КТО ПОМНИТ

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

AStartup FailureB[1 2 3 WED Oct 17

161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException

А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ

ERASURE

ERASURE

А ГДЕ МОИ ПРОВЕРКИ

ВО ВРЕМЯ КОМПИЛЯЦИИ

laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo

ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname

[javalangLong javalangLong javalangLong javautilDate javalangString]

COMPILESTATIC

π ndash ТОРТ И ЧИСЛО

DOUBLE THE PI

double value = 3println $value14isDouble()

A trueB MissingPropertyExceptionC falseDMissingMethodException

ПРОСЁК

ПРОСЁК

ПРОСЁК

A trueB MissingPropertyExceptionC falseDMissingMethodException

DOUBLE THE PI

double value = 3println $value14isDouble()

ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ

ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE

ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP

СПРОСИ ФРАНЦУЗОВ

RSVP

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

A Startup FailureB 1C 2D MissingPropertyException

А ВОТ ПОЧЕМУ

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

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

НАПРИМЕР

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

def invite = new Invite()def attendees = inviteattending +1

НУ ИЛИ УБРАТЬ СКОБКИ

Как убрать скобки

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true

B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false

C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true

D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false

ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ

В КОДЕ MIXINMETACLASS

WHY SO PRIMITIVE

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

A Startup ErrorB int long

booleanC javalangInte

ger javalangLong javalangBoolean

Dint

НУ ЭТО ЯСНО А ПОЧЕМУ

порядокточно непорядок

А ЭТО

(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК

JUMP AKA ПРОПАВШИЕ СЛОВА

>

14863602

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

A Here are the lyrics

B Here are the null

C Startup failureD MissingMethodExcep

tion

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen

public static jump() Here are the $lyrics()

static $static_methodMissing(String name def args) lyrics

println VanHalenjump()

ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП

class VanHalen

public jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println new VanHalen()jump()

>

null

10161629

WHATrsquoS THE METACLASS БАРУХ

def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух

AMissingMethodExceptionBWhats the

orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух

CWhatrsquos the javautilLinkedHashMapXXXXXX Барух

DWhatrsquos the frequency Барух

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

mapgetMetaClass()

ВЫВОДЫ

1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis

- intellij IDEA5 Rtfm6 Donrsquot code like my brother

Мы только начали (надо еще форму придумать)

Засылайте Ваши паззлеры поделки и рисунки

- puzzlers jfrogcom- Groovypuzzlers

ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ

Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch

Вам не поравилосьdevnull

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ldquoВсе проблемы в программировании можно решить добавив пару скобокrdquo

John McCarthy изобретатель LISP

ПРОСТО ДОБАВЬ СКОБОК

println ((-3)abs())

ИЛИ

int value = -3println valueabs()

PRIME CUTS

PRIME CUTSboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

САМ В ШОКЕ

ПОСМОТРИМ ЕЩЕ РАЗboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

boolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

AtrueBfalse

CNumberFormatException

DMissingMethodException

КАК 4 МОГЛО ОКАЗАТЬСЯ ПРОСТЫМ ЧИСЛОМhellip

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

РЕШЕНИЕ ИСПОЛЬЗУЙ ANY() ИЛИ ПЕРЕОСМЫСЛИ АЛГОРИТМ

httpkousenitwordpresscom20140418responses-to-the-closure-of-no-return

class Conference def name def year

def gr = new Conference(name Greach year 2014)

greach println it

A class=class Conferencename=Greachyear=2014

B ConferenceXXXXXX

C Startup failure

D Greach 2014

КАКОЙ ЖЕ ЭТО ITERABLE

RTFS (READ THE FING SOURCE)

MAX POWER

MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

A ClassCastExceptionB 9C 56Dnull

РАСКУСИЛ

gtgroovysh ((9 as Character) as Integer)===gt 57

ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max

СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL

A ClassCastExceptionB 9C 56Dnull

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

КАК ЭТО ПОЛУЧИЛОСЬ

def random = new Random()

def randomList = []010each randomList ltlt randomnextInt()

assert randomListmax null == randomList[0]

ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО

ДЕТЕКТИВ

КТО УБИЙЦА

A NullPointerException

B ктоУбийцаI_closure1xxxxxxx

C Startup errorD Мориарти

Closure ктоУбийца() Мориарти println ктоУбийца()

ПИЧАЛЬКА

ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ

Closure ктоУбийца() -gt Мориарти

Closure ктоУбийца() return Мориарти

>

The Final Countdown - fragment

Europe

Top Disco Hits vol 1 track 17

9743676

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9D10

КАК ТАК ТО НУ КАК ТАК ТО

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648

ЛУЧШЕ НЕ СТАЛОhellip

ЧТО ПРОИЗОШЛО

ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

ПОЧИНИЛИclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9

D42

ЭТО ВООБЩЕ КАК

PUBLIC - PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

A publicPropertyproperty

B publicPropertyPublic__property

C publicPropertygetProperty()

D publicPropertyproperty

У МЕНЯ ДВА ВОПРОСА

1Что за дебильное имя

2 Откуда я мог это знать

ОТВЕТ НА 1 IN SOVIET RUSSIA

YOU DONrsquoT ACCESS PUBLIC

PROPERTY

ОТВЕТ НА 2

httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml

А ты документацию читать не пробовал

ГДЕ КАРТА БИЛЛИ

ГДЕ КАРТА БИЛЛИ

def key = xdef map = [key treasure]def value = mapget(key)println value

def key = xdef map = [key treasure]def value = mapget(key)println value

ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000

чертей

КАК ЭТО NULL

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ

ЧИНИМ

1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure

ЕЩЕ КАРТЫ БИЛЛИ

ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value

def map = [2 treasure]def key = 2def value = map$keyprintln value

ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку

А СЕЙЧАС ТО-ЧТО

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ

def map = [2 treasure]println mapkeySet()first()classname

javalangInteger

НАМ НУЖНА КАРТА

НАМ НУЖНА КАРТА

def key = xdef map = [$key treasure]def value = map[x]println value

ANoSuchElementExceptionBnullCtreasureDПолундра Startup error

def key = xdef map = [$key treasure]def value = map[x]println value

ЧТО ОПЯТЬ

STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН

def map = [$key treasure]println mapkeySet()first()classname

orgcodehausgroovyruntimeGStringImpl

OUT OF RANGE

AAssertion FailedBfalseCtrueDNullPointerException

OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3

Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()

10 20 30 40 50 60 70 80 90 100

РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ

GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56

ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100

bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно

bullИ пусть делегирует в containsWithinBounds

bullПочините наконец GROOVY-2771

bullThank you

POWER RANGE(RS)

УБИРАЕМ ЕДИНИЧКУ

A -1012345678

C[0 2 3 4 5 6 7 8 9]

D[-1 0 1 2 3 4 5 6 7 8]

[09]each println(it - 1)

B0123456789

[09]each println(it - 1)

Это неправильные скобки

(09)each println(it - 1)

Другое дело

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

[0 2 3 4 5 6 7 8 9]

SAVE THE DATE

JOKERCONF IS COMING

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

JAVA2 КТО ПОМНИТ

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

AStartup FailureB[1 2 3 WED Oct 17

161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException

А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ

ERASURE

ERASURE

А ГДЕ МОИ ПРОВЕРКИ

ВО ВРЕМЯ КОМПИЛЯЦИИ

laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo

ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname

[javalangLong javalangLong javalangLong javautilDate javalangString]

COMPILESTATIC

π ndash ТОРТ И ЧИСЛО

DOUBLE THE PI

double value = 3println $value14isDouble()

A trueB MissingPropertyExceptionC falseDMissingMethodException

ПРОСЁК

ПРОСЁК

ПРОСЁК

A trueB MissingPropertyExceptionC falseDMissingMethodException

DOUBLE THE PI

double value = 3println $value14isDouble()

ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ

ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE

ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP

СПРОСИ ФРАНЦУЗОВ

RSVP

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

A Startup FailureB 1C 2D MissingPropertyException

А ВОТ ПОЧЕМУ

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

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

НАПРИМЕР

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

def invite = new Invite()def attendees = inviteattending +1

НУ ИЛИ УБРАТЬ СКОБКИ

Как убрать скобки

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true

B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false

C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true

D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false

ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ

В КОДЕ MIXINMETACLASS

WHY SO PRIMITIVE

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

A Startup ErrorB int long

booleanC javalangInte

ger javalangLong javalangBoolean

Dint

НУ ЭТО ЯСНО А ПОЧЕМУ

порядокточно непорядок

А ЭТО

(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК

JUMP AKA ПРОПАВШИЕ СЛОВА

>

14863602

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

A Here are the lyrics

B Here are the null

C Startup failureD MissingMethodExcep

tion

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen

public static jump() Here are the $lyrics()

static $static_methodMissing(String name def args) lyrics

println VanHalenjump()

ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП

class VanHalen

public jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println new VanHalen()jump()

>

null

10161629

WHATrsquoS THE METACLASS БАРУХ

def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух

AMissingMethodExceptionBWhats the

orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух

CWhatrsquos the javautilLinkedHashMapXXXXXX Барух

DWhatrsquos the frequency Барух

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

mapgetMetaClass()

ВЫВОДЫ

1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis

- intellij IDEA5 Rtfm6 Donrsquot code like my brother

Мы только начали (надо еще форму придумать)

Засылайте Ваши паззлеры поделки и рисунки

- puzzlers jfrogcom- Groovypuzzlers

ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ

Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch

Вам не поравилосьdevnull

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ПРОСТО ДОБАВЬ СКОБОК

println ((-3)abs())

ИЛИ

int value = -3println valueabs()

PRIME CUTS

PRIME CUTSboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

САМ В ШОКЕ

ПОСМОТРИМ ЕЩЕ РАЗboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

boolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

AtrueBfalse

CNumberFormatException

DMissingMethodException

КАК 4 МОГЛО ОКАЗАТЬСЯ ПРОСТЫМ ЧИСЛОМhellip

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

РЕШЕНИЕ ИСПОЛЬЗУЙ ANY() ИЛИ ПЕРЕОСМЫСЛИ АЛГОРИТМ

httpkousenitwordpresscom20140418responses-to-the-closure-of-no-return

class Conference def name def year

def gr = new Conference(name Greach year 2014)

greach println it

A class=class Conferencename=Greachyear=2014

B ConferenceXXXXXX

C Startup failure

D Greach 2014

КАКОЙ ЖЕ ЭТО ITERABLE

RTFS (READ THE FING SOURCE)

MAX POWER

MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

A ClassCastExceptionB 9C 56Dnull

РАСКУСИЛ

gtgroovysh ((9 as Character) as Integer)===gt 57

ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max

СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL

A ClassCastExceptionB 9C 56Dnull

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

КАК ЭТО ПОЛУЧИЛОСЬ

def random = new Random()

def randomList = []010each randomList ltlt randomnextInt()

assert randomListmax null == randomList[0]

ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО

ДЕТЕКТИВ

КТО УБИЙЦА

A NullPointerException

B ктоУбийцаI_closure1xxxxxxx

C Startup errorD Мориарти

Closure ктоУбийца() Мориарти println ктоУбийца()

ПИЧАЛЬКА

ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ

Closure ктоУбийца() -gt Мориарти

Closure ктоУбийца() return Мориарти

>

The Final Countdown - fragment

Europe

Top Disco Hits vol 1 track 17

9743676

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9D10

КАК ТАК ТО НУ КАК ТАК ТО

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648

ЛУЧШЕ НЕ СТАЛОhellip

ЧТО ПРОИЗОШЛО

ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

ПОЧИНИЛИclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9

D42

ЭТО ВООБЩЕ КАК

PUBLIC - PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

A publicPropertyproperty

B publicPropertyPublic__property

C publicPropertygetProperty()

D publicPropertyproperty

У МЕНЯ ДВА ВОПРОСА

1Что за дебильное имя

2 Откуда я мог это знать

ОТВЕТ НА 1 IN SOVIET RUSSIA

YOU DONrsquoT ACCESS PUBLIC

PROPERTY

ОТВЕТ НА 2

httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml

А ты документацию читать не пробовал

ГДЕ КАРТА БИЛЛИ

ГДЕ КАРТА БИЛЛИ

def key = xdef map = [key treasure]def value = mapget(key)println value

def key = xdef map = [key treasure]def value = mapget(key)println value

ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000

чертей

КАК ЭТО NULL

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ

ЧИНИМ

1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure

ЕЩЕ КАРТЫ БИЛЛИ

ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value

def map = [2 treasure]def key = 2def value = map$keyprintln value

ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку

А СЕЙЧАС ТО-ЧТО

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ

def map = [2 treasure]println mapkeySet()first()classname

javalangInteger

НАМ НУЖНА КАРТА

НАМ НУЖНА КАРТА

def key = xdef map = [$key treasure]def value = map[x]println value

ANoSuchElementExceptionBnullCtreasureDПолундра Startup error

def key = xdef map = [$key treasure]def value = map[x]println value

ЧТО ОПЯТЬ

STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН

def map = [$key treasure]println mapkeySet()first()classname

orgcodehausgroovyruntimeGStringImpl

OUT OF RANGE

AAssertion FailedBfalseCtrueDNullPointerException

OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3

Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()

10 20 30 40 50 60 70 80 90 100

РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ

GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56

ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100

bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно

bullИ пусть делегирует в containsWithinBounds

bullПочините наконец GROOVY-2771

bullThank you

POWER RANGE(RS)

УБИРАЕМ ЕДИНИЧКУ

A -1012345678

C[0 2 3 4 5 6 7 8 9]

D[-1 0 1 2 3 4 5 6 7 8]

[09]each println(it - 1)

B0123456789

[09]each println(it - 1)

Это неправильные скобки

(09)each println(it - 1)

Другое дело

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

[0 2 3 4 5 6 7 8 9]

SAVE THE DATE

JOKERCONF IS COMING

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

JAVA2 КТО ПОМНИТ

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

AStartup FailureB[1 2 3 WED Oct 17

161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException

А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ

ERASURE

ERASURE

А ГДЕ МОИ ПРОВЕРКИ

ВО ВРЕМЯ КОМПИЛЯЦИИ

laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo

ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname

[javalangLong javalangLong javalangLong javautilDate javalangString]

COMPILESTATIC

π ndash ТОРТ И ЧИСЛО

DOUBLE THE PI

double value = 3println $value14isDouble()

A trueB MissingPropertyExceptionC falseDMissingMethodException

ПРОСЁК

ПРОСЁК

ПРОСЁК

A trueB MissingPropertyExceptionC falseDMissingMethodException

DOUBLE THE PI

double value = 3println $value14isDouble()

ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ

ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE

ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP

СПРОСИ ФРАНЦУЗОВ

RSVP

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

A Startup FailureB 1C 2D MissingPropertyException

А ВОТ ПОЧЕМУ

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

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

НАПРИМЕР

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

def invite = new Invite()def attendees = inviteattending +1

НУ ИЛИ УБРАТЬ СКОБКИ

Как убрать скобки

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true

B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false

C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true

D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false

ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ

В КОДЕ MIXINMETACLASS

WHY SO PRIMITIVE

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

A Startup ErrorB int long

booleanC javalangInte

ger javalangLong javalangBoolean

Dint

НУ ЭТО ЯСНО А ПОЧЕМУ

порядокточно непорядок

А ЭТО

(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК

JUMP AKA ПРОПАВШИЕ СЛОВА

>

14863602

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

A Here are the lyrics

B Here are the null

C Startup failureD MissingMethodExcep

tion

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen

public static jump() Here are the $lyrics()

static $static_methodMissing(String name def args) lyrics

println VanHalenjump()

ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП

class VanHalen

public jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println new VanHalen()jump()

>

null

10161629

WHATrsquoS THE METACLASS БАРУХ

def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух

AMissingMethodExceptionBWhats the

orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух

CWhatrsquos the javautilLinkedHashMapXXXXXX Барух

DWhatrsquos the frequency Барух

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

mapgetMetaClass()

ВЫВОДЫ

1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis

- intellij IDEA5 Rtfm6 Donrsquot code like my brother

Мы только начали (надо еще форму придумать)

Засылайте Ваши паззлеры поделки и рисунки

- puzzlers jfrogcom- Groovypuzzlers

ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ

Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch

Вам не поравилосьdevnull

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

PRIME CUTS

PRIME CUTSboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

САМ В ШОКЕ

ПОСМОТРИМ ЕЩЕ РАЗboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

boolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

AtrueBfalse

CNumberFormatException

DMissingMethodException

КАК 4 МОГЛО ОКАЗАТЬСЯ ПРОСТЫМ ЧИСЛОМhellip

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

РЕШЕНИЕ ИСПОЛЬЗУЙ ANY() ИЛИ ПЕРЕОСМЫСЛИ АЛГОРИТМ

httpkousenitwordpresscom20140418responses-to-the-closure-of-no-return

class Conference def name def year

def gr = new Conference(name Greach year 2014)

greach println it

A class=class Conferencename=Greachyear=2014

B ConferenceXXXXXX

C Startup failure

D Greach 2014

КАКОЙ ЖЕ ЭТО ITERABLE

RTFS (READ THE FING SOURCE)

MAX POWER

MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

A ClassCastExceptionB 9C 56Dnull

РАСКУСИЛ

gtgroovysh ((9 as Character) as Integer)===gt 57

ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max

СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL

A ClassCastExceptionB 9C 56Dnull

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

КАК ЭТО ПОЛУЧИЛОСЬ

def random = new Random()

def randomList = []010each randomList ltlt randomnextInt()

assert randomListmax null == randomList[0]

ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО

ДЕТЕКТИВ

КТО УБИЙЦА

A NullPointerException

B ктоУбийцаI_closure1xxxxxxx

C Startup errorD Мориарти

Closure ктоУбийца() Мориарти println ктоУбийца()

ПИЧАЛЬКА

ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ

Closure ктоУбийца() -gt Мориарти

Closure ктоУбийца() return Мориарти

>

The Final Countdown - fragment

Europe

Top Disco Hits vol 1 track 17

9743676

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9D10

КАК ТАК ТО НУ КАК ТАК ТО

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648

ЛУЧШЕ НЕ СТАЛОhellip

ЧТО ПРОИЗОШЛО

ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

ПОЧИНИЛИclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9

D42

ЭТО ВООБЩЕ КАК

PUBLIC - PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

A publicPropertyproperty

B publicPropertyPublic__property

C publicPropertygetProperty()

D publicPropertyproperty

У МЕНЯ ДВА ВОПРОСА

1Что за дебильное имя

2 Откуда я мог это знать

ОТВЕТ НА 1 IN SOVIET RUSSIA

YOU DONrsquoT ACCESS PUBLIC

PROPERTY

ОТВЕТ НА 2

httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml

А ты документацию читать не пробовал

ГДЕ КАРТА БИЛЛИ

ГДЕ КАРТА БИЛЛИ

def key = xdef map = [key treasure]def value = mapget(key)println value

def key = xdef map = [key treasure]def value = mapget(key)println value

ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000

чертей

КАК ЭТО NULL

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ

ЧИНИМ

1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure

ЕЩЕ КАРТЫ БИЛЛИ

ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value

def map = [2 treasure]def key = 2def value = map$keyprintln value

ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку

А СЕЙЧАС ТО-ЧТО

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ

def map = [2 treasure]println mapkeySet()first()classname

javalangInteger

НАМ НУЖНА КАРТА

НАМ НУЖНА КАРТА

def key = xdef map = [$key treasure]def value = map[x]println value

ANoSuchElementExceptionBnullCtreasureDПолундра Startup error

def key = xdef map = [$key treasure]def value = map[x]println value

ЧТО ОПЯТЬ

STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН

def map = [$key treasure]println mapkeySet()first()classname

orgcodehausgroovyruntimeGStringImpl

OUT OF RANGE

AAssertion FailedBfalseCtrueDNullPointerException

OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3

Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()

10 20 30 40 50 60 70 80 90 100

РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ

GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56

ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100

bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно

bullИ пусть делегирует в containsWithinBounds

bullПочините наконец GROOVY-2771

bullThank you

POWER RANGE(RS)

УБИРАЕМ ЕДИНИЧКУ

A -1012345678

C[0 2 3 4 5 6 7 8 9]

D[-1 0 1 2 3 4 5 6 7 8]

[09]each println(it - 1)

B0123456789

[09]each println(it - 1)

Это неправильные скобки

(09)each println(it - 1)

Другое дело

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

[0 2 3 4 5 6 7 8 9]

SAVE THE DATE

JOKERCONF IS COMING

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

JAVA2 КТО ПОМНИТ

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

AStartup FailureB[1 2 3 WED Oct 17

161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException

А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ

ERASURE

ERASURE

А ГДЕ МОИ ПРОВЕРКИ

ВО ВРЕМЯ КОМПИЛЯЦИИ

laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo

ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname

[javalangLong javalangLong javalangLong javautilDate javalangString]

COMPILESTATIC

π ndash ТОРТ И ЧИСЛО

DOUBLE THE PI

double value = 3println $value14isDouble()

A trueB MissingPropertyExceptionC falseDMissingMethodException

ПРОСЁК

ПРОСЁК

ПРОСЁК

A trueB MissingPropertyExceptionC falseDMissingMethodException

DOUBLE THE PI

double value = 3println $value14isDouble()

ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ

ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE

ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP

СПРОСИ ФРАНЦУЗОВ

RSVP

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

A Startup FailureB 1C 2D MissingPropertyException

А ВОТ ПОЧЕМУ

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

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

НАПРИМЕР

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

def invite = new Invite()def attendees = inviteattending +1

НУ ИЛИ УБРАТЬ СКОБКИ

Как убрать скобки

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true

B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false

C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true

D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false

ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ

В КОДЕ MIXINMETACLASS

WHY SO PRIMITIVE

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

A Startup ErrorB int long

booleanC javalangInte

ger javalangLong javalangBoolean

Dint

НУ ЭТО ЯСНО А ПОЧЕМУ

порядокточно непорядок

А ЭТО

(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК

JUMP AKA ПРОПАВШИЕ СЛОВА

>

14863602

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

A Here are the lyrics

B Here are the null

C Startup failureD MissingMethodExcep

tion

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen

public static jump() Here are the $lyrics()

static $static_methodMissing(String name def args) lyrics

println VanHalenjump()

ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП

class VanHalen

public jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println new VanHalen()jump()

>

null

10161629

WHATrsquoS THE METACLASS БАРУХ

def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух

AMissingMethodExceptionBWhats the

orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух

CWhatrsquos the javautilLinkedHashMapXXXXXX Барух

DWhatrsquos the frequency Барух

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

mapgetMetaClass()

ВЫВОДЫ

1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis

- intellij IDEA5 Rtfm6 Donrsquot code like my brother

Мы только начали (надо еще форму придумать)

Засылайте Ваши паззлеры поделки и рисунки

- puzzlers jfrogcom- Groovypuzzlers

ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ

Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch

Вам не поравилосьdevnull

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

PRIME CUTSboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

САМ В ШОКЕ

ПОСМОТРИМ ЕЩЕ РАЗboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

boolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

AtrueBfalse

CNumberFormatException

DMissingMethodException

КАК 4 МОГЛО ОКАЗАТЬСЯ ПРОСТЫМ ЧИСЛОМhellip

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

РЕШЕНИЕ ИСПОЛЬЗУЙ ANY() ИЛИ ПЕРЕОСМЫСЛИ АЛГОРИТМ

httpkousenitwordpresscom20140418responses-to-the-closure-of-no-return

class Conference def name def year

def gr = new Conference(name Greach year 2014)

greach println it

A class=class Conferencename=Greachyear=2014

B ConferenceXXXXXX

C Startup failure

D Greach 2014

КАКОЙ ЖЕ ЭТО ITERABLE

RTFS (READ THE FING SOURCE)

MAX POWER

MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

A ClassCastExceptionB 9C 56Dnull

РАСКУСИЛ

gtgroovysh ((9 as Character) as Integer)===gt 57

ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max

СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL

A ClassCastExceptionB 9C 56Dnull

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

КАК ЭТО ПОЛУЧИЛОСЬ

def random = new Random()

def randomList = []010each randomList ltlt randomnextInt()

assert randomListmax null == randomList[0]

ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО

ДЕТЕКТИВ

КТО УБИЙЦА

A NullPointerException

B ктоУбийцаI_closure1xxxxxxx

C Startup errorD Мориарти

Closure ктоУбийца() Мориарти println ктоУбийца()

ПИЧАЛЬКА

ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ

Closure ктоУбийца() -gt Мориарти

Closure ктоУбийца() return Мориарти

>

The Final Countdown - fragment

Europe

Top Disco Hits vol 1 track 17

9743676

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9D10

КАК ТАК ТО НУ КАК ТАК ТО

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648

ЛУЧШЕ НЕ СТАЛОhellip

ЧТО ПРОИЗОШЛО

ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

ПОЧИНИЛИclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9

D42

ЭТО ВООБЩЕ КАК

PUBLIC - PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

A publicPropertyproperty

B publicPropertyPublic__property

C publicPropertygetProperty()

D publicPropertyproperty

У МЕНЯ ДВА ВОПРОСА

1Что за дебильное имя

2 Откуда я мог это знать

ОТВЕТ НА 1 IN SOVIET RUSSIA

YOU DONrsquoT ACCESS PUBLIC

PROPERTY

ОТВЕТ НА 2

httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml

А ты документацию читать не пробовал

ГДЕ КАРТА БИЛЛИ

ГДЕ КАРТА БИЛЛИ

def key = xdef map = [key treasure]def value = mapget(key)println value

def key = xdef map = [key treasure]def value = mapget(key)println value

ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000

чертей

КАК ЭТО NULL

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ

ЧИНИМ

1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure

ЕЩЕ КАРТЫ БИЛЛИ

ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value

def map = [2 treasure]def key = 2def value = map$keyprintln value

ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку

А СЕЙЧАС ТО-ЧТО

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ

def map = [2 treasure]println mapkeySet()first()classname

javalangInteger

НАМ НУЖНА КАРТА

НАМ НУЖНА КАРТА

def key = xdef map = [$key treasure]def value = map[x]println value

ANoSuchElementExceptionBnullCtreasureDПолундра Startup error

def key = xdef map = [$key treasure]def value = map[x]println value

ЧТО ОПЯТЬ

STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН

def map = [$key treasure]println mapkeySet()first()classname

orgcodehausgroovyruntimeGStringImpl

OUT OF RANGE

AAssertion FailedBfalseCtrueDNullPointerException

OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3

Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()

10 20 30 40 50 60 70 80 90 100

РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ

GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56

ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100

bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно

bullИ пусть делегирует в containsWithinBounds

bullПочините наконец GROOVY-2771

bullThank you

POWER RANGE(RS)

УБИРАЕМ ЕДИНИЧКУ

A -1012345678

C[0 2 3 4 5 6 7 8 9]

D[-1 0 1 2 3 4 5 6 7 8]

[09]each println(it - 1)

B0123456789

[09]each println(it - 1)

Это неправильные скобки

(09)each println(it - 1)

Другое дело

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

[0 2 3 4 5 6 7 8 9]

SAVE THE DATE

JOKERCONF IS COMING

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

JAVA2 КТО ПОМНИТ

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

AStartup FailureB[1 2 3 WED Oct 17

161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException

А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ

ERASURE

ERASURE

А ГДЕ МОИ ПРОВЕРКИ

ВО ВРЕМЯ КОМПИЛЯЦИИ

laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo

ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname

[javalangLong javalangLong javalangLong javautilDate javalangString]

COMPILESTATIC

π ndash ТОРТ И ЧИСЛО

DOUBLE THE PI

double value = 3println $value14isDouble()

A trueB MissingPropertyExceptionC falseDMissingMethodException

ПРОСЁК

ПРОСЁК

ПРОСЁК

A trueB MissingPropertyExceptionC falseDMissingMethodException

DOUBLE THE PI

double value = 3println $value14isDouble()

ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ

ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE

ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP

СПРОСИ ФРАНЦУЗОВ

RSVP

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

A Startup FailureB 1C 2D MissingPropertyException

А ВОТ ПОЧЕМУ

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

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

НАПРИМЕР

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

def invite = new Invite()def attendees = inviteattending +1

НУ ИЛИ УБРАТЬ СКОБКИ

Как убрать скобки

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true

B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false

C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true

D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false

ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ

В КОДЕ MIXINMETACLASS

WHY SO PRIMITIVE

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

A Startup ErrorB int long

booleanC javalangInte

ger javalangLong javalangBoolean

Dint

НУ ЭТО ЯСНО А ПОЧЕМУ

порядокточно непорядок

А ЭТО

(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК

JUMP AKA ПРОПАВШИЕ СЛОВА

>

14863602

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

A Here are the lyrics

B Here are the null

C Startup failureD MissingMethodExcep

tion

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen

public static jump() Here are the $lyrics()

static $static_methodMissing(String name def args) lyrics

println VanHalenjump()

ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП

class VanHalen

public jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println new VanHalen()jump()

>

null

10161629

WHATrsquoS THE METACLASS БАРУХ

def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух

AMissingMethodExceptionBWhats the

orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух

CWhatrsquos the javautilLinkedHashMapXXXXXX Барух

DWhatrsquos the frequency Барух

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

mapgetMetaClass()

ВЫВОДЫ

1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis

- intellij IDEA5 Rtfm6 Donrsquot code like my brother

Мы только начали (надо еще форму придумать)

Засылайте Ваши паззлеры поделки и рисунки

- puzzlers jfrogcom- Groovypuzzlers

ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ

Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch

Вам не поравилосьdevnull

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

САМ В ШОКЕ

ПОСМОТРИМ ЕЩЕ РАЗboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

boolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

AtrueBfalse

CNumberFormatException

DMissingMethodException

КАК 4 МОГЛО ОКАЗАТЬСЯ ПРОСТЫМ ЧИСЛОМhellip

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

РЕШЕНИЕ ИСПОЛЬЗУЙ ANY() ИЛИ ПЕРЕОСМЫСЛИ АЛГОРИТМ

httpkousenitwordpresscom20140418responses-to-the-closure-of-no-return

class Conference def name def year

def gr = new Conference(name Greach year 2014)

greach println it

A class=class Conferencename=Greachyear=2014

B ConferenceXXXXXX

C Startup failure

D Greach 2014

КАКОЙ ЖЕ ЭТО ITERABLE

RTFS (READ THE FING SOURCE)

MAX POWER

MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

A ClassCastExceptionB 9C 56Dnull

РАСКУСИЛ

gtgroovysh ((9 as Character) as Integer)===gt 57

ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max

СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL

A ClassCastExceptionB 9C 56Dnull

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

КАК ЭТО ПОЛУЧИЛОСЬ

def random = new Random()

def randomList = []010each randomList ltlt randomnextInt()

assert randomListmax null == randomList[0]

ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО

ДЕТЕКТИВ

КТО УБИЙЦА

A NullPointerException

B ктоУбийцаI_closure1xxxxxxx

C Startup errorD Мориарти

Closure ктоУбийца() Мориарти println ктоУбийца()

ПИЧАЛЬКА

ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ

Closure ктоУбийца() -gt Мориарти

Closure ктоУбийца() return Мориарти

>

The Final Countdown - fragment

Europe

Top Disco Hits vol 1 track 17

9743676

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9D10

КАК ТАК ТО НУ КАК ТАК ТО

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648

ЛУЧШЕ НЕ СТАЛОhellip

ЧТО ПРОИЗОШЛО

ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

ПОЧИНИЛИclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9

D42

ЭТО ВООБЩЕ КАК

PUBLIC - PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

A publicPropertyproperty

B publicPropertyPublic__property

C publicPropertygetProperty()

D publicPropertyproperty

У МЕНЯ ДВА ВОПРОСА

1Что за дебильное имя

2 Откуда я мог это знать

ОТВЕТ НА 1 IN SOVIET RUSSIA

YOU DONrsquoT ACCESS PUBLIC

PROPERTY

ОТВЕТ НА 2

httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml

А ты документацию читать не пробовал

ГДЕ КАРТА БИЛЛИ

ГДЕ КАРТА БИЛЛИ

def key = xdef map = [key treasure]def value = mapget(key)println value

def key = xdef map = [key treasure]def value = mapget(key)println value

ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000

чертей

КАК ЭТО NULL

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ

ЧИНИМ

1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure

ЕЩЕ КАРТЫ БИЛЛИ

ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value

def map = [2 treasure]def key = 2def value = map$keyprintln value

ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку

А СЕЙЧАС ТО-ЧТО

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ

def map = [2 treasure]println mapkeySet()first()classname

javalangInteger

НАМ НУЖНА КАРТА

НАМ НУЖНА КАРТА

def key = xdef map = [$key treasure]def value = map[x]println value

ANoSuchElementExceptionBnullCtreasureDПолундра Startup error

def key = xdef map = [$key treasure]def value = map[x]println value

ЧТО ОПЯТЬ

STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН

def map = [$key treasure]println mapkeySet()first()classname

orgcodehausgroovyruntimeGStringImpl

OUT OF RANGE

AAssertion FailedBfalseCtrueDNullPointerException

OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3

Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()

10 20 30 40 50 60 70 80 90 100

РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ

GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56

ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100

bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно

bullИ пусть делегирует в containsWithinBounds

bullПочините наконец GROOVY-2771

bullThank you

POWER RANGE(RS)

УБИРАЕМ ЕДИНИЧКУ

A -1012345678

C[0 2 3 4 5 6 7 8 9]

D[-1 0 1 2 3 4 5 6 7 8]

[09]each println(it - 1)

B0123456789

[09]each println(it - 1)

Это неправильные скобки

(09)each println(it - 1)

Другое дело

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

[0 2 3 4 5 6 7 8 9]

SAVE THE DATE

JOKERCONF IS COMING

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

JAVA2 КТО ПОМНИТ

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

AStartup FailureB[1 2 3 WED Oct 17

161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException

А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ

ERASURE

ERASURE

А ГДЕ МОИ ПРОВЕРКИ

ВО ВРЕМЯ КОМПИЛЯЦИИ

laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo

ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname

[javalangLong javalangLong javalangLong javautilDate javalangString]

COMPILESTATIC

π ndash ТОРТ И ЧИСЛО

DOUBLE THE PI

double value = 3println $value14isDouble()

A trueB MissingPropertyExceptionC falseDMissingMethodException

ПРОСЁК

ПРОСЁК

ПРОСЁК

A trueB MissingPropertyExceptionC falseDMissingMethodException

DOUBLE THE PI

double value = 3println $value14isDouble()

ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ

ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE

ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP

СПРОСИ ФРАНЦУЗОВ

RSVP

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

A Startup FailureB 1C 2D MissingPropertyException

А ВОТ ПОЧЕМУ

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

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

НАПРИМЕР

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

def invite = new Invite()def attendees = inviteattending +1

НУ ИЛИ УБРАТЬ СКОБКИ

Как убрать скобки

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true

B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false

C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true

D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false

ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ

В КОДЕ MIXINMETACLASS

WHY SO PRIMITIVE

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

A Startup ErrorB int long

booleanC javalangInte

ger javalangLong javalangBoolean

Dint

НУ ЭТО ЯСНО А ПОЧЕМУ

порядокточно непорядок

А ЭТО

(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК

JUMP AKA ПРОПАВШИЕ СЛОВА

>

14863602

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

A Here are the lyrics

B Here are the null

C Startup failureD MissingMethodExcep

tion

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen

public static jump() Here are the $lyrics()

static $static_methodMissing(String name def args) lyrics

println VanHalenjump()

ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП

class VanHalen

public jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println new VanHalen()jump()

>

null

10161629

WHATrsquoS THE METACLASS БАРУХ

def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух

AMissingMethodExceptionBWhats the

orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух

CWhatrsquos the javautilLinkedHashMapXXXXXX Барух

DWhatrsquos the frequency Барух

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

mapgetMetaClass()

ВЫВОДЫ

1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis

- intellij IDEA5 Rtfm6 Donrsquot code like my brother

Мы только начали (надо еще форму придумать)

Засылайте Ваши паззлеры поделки и рисунки

- puzzlers jfrogcom- Groovypuzzlers

ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ

Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch

Вам не поравилосьdevnull

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ПОСМОТРИМ ЕЩЕ РАЗboolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

boolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

AtrueBfalse

CNumberFormatException

DMissingMethodException

КАК 4 МОГЛО ОКАЗАТЬСЯ ПРОСТЫМ ЧИСЛОМhellip

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

РЕШЕНИЕ ИСПОЛЬЗУЙ ANY() ИЛИ ПЕРЕОСМЫСЛИ АЛГОРИТМ

httpkousenitwordpresscom20140418responses-to-the-closure-of-no-return

class Conference def name def year

def gr = new Conference(name Greach year 2014)

greach println it

A class=class Conferencename=Greachyear=2014

B ConferenceXXXXXX

C Startup failure

D Greach 2014

КАКОЙ ЖЕ ЭТО ITERABLE

RTFS (READ THE FING SOURCE)

MAX POWER

MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

A ClassCastExceptionB 9C 56Dnull

РАСКУСИЛ

gtgroovysh ((9 as Character) as Integer)===gt 57

ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max

СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL

A ClassCastExceptionB 9C 56Dnull

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

КАК ЭТО ПОЛУЧИЛОСЬ

def random = new Random()

def randomList = []010each randomList ltlt randomnextInt()

assert randomListmax null == randomList[0]

ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО

ДЕТЕКТИВ

КТО УБИЙЦА

A NullPointerException

B ктоУбийцаI_closure1xxxxxxx

C Startup errorD Мориарти

Closure ктоУбийца() Мориарти println ктоУбийца()

ПИЧАЛЬКА

ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ

Closure ктоУбийца() -gt Мориарти

Closure ктоУбийца() return Мориарти

>

The Final Countdown - fragment

Europe

Top Disco Hits vol 1 track 17

9743676

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9D10

КАК ТАК ТО НУ КАК ТАК ТО

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648

ЛУЧШЕ НЕ СТАЛОhellip

ЧТО ПРОИЗОШЛО

ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

ПОЧИНИЛИclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9

D42

ЭТО ВООБЩЕ КАК

PUBLIC - PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

A publicPropertyproperty

B publicPropertyPublic__property

C publicPropertygetProperty()

D publicPropertyproperty

У МЕНЯ ДВА ВОПРОСА

1Что за дебильное имя

2 Откуда я мог это знать

ОТВЕТ НА 1 IN SOVIET RUSSIA

YOU DONrsquoT ACCESS PUBLIC

PROPERTY

ОТВЕТ НА 2

httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml

А ты документацию читать не пробовал

ГДЕ КАРТА БИЛЛИ

ГДЕ КАРТА БИЛЛИ

def key = xdef map = [key treasure]def value = mapget(key)println value

def key = xdef map = [key treasure]def value = mapget(key)println value

ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000

чертей

КАК ЭТО NULL

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ

ЧИНИМ

1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure

ЕЩЕ КАРТЫ БИЛЛИ

ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value

def map = [2 treasure]def key = 2def value = map$keyprintln value

ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку

А СЕЙЧАС ТО-ЧТО

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ

def map = [2 treasure]println mapkeySet()first()classname

javalangInteger

НАМ НУЖНА КАРТА

НАМ НУЖНА КАРТА

def key = xdef map = [$key treasure]def value = map[x]println value

ANoSuchElementExceptionBnullCtreasureDПолундра Startup error

def key = xdef map = [$key treasure]def value = map[x]println value

ЧТО ОПЯТЬ

STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН

def map = [$key treasure]println mapkeySet()first()classname

orgcodehausgroovyruntimeGStringImpl

OUT OF RANGE

AAssertion FailedBfalseCtrueDNullPointerException

OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3

Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()

10 20 30 40 50 60 70 80 90 100

РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ

GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56

ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100

bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно

bullИ пусть делегирует в containsWithinBounds

bullПочините наконец GROOVY-2771

bullThank you

POWER RANGE(RS)

УБИРАЕМ ЕДИНИЧКУ

A -1012345678

C[0 2 3 4 5 6 7 8 9]

D[-1 0 1 2 3 4 5 6 7 8]

[09]each println(it - 1)

B0123456789

[09]each println(it - 1)

Это неправильные скобки

(09)each println(it - 1)

Другое дело

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

[0 2 3 4 5 6 7 8 9]

SAVE THE DATE

JOKERCONF IS COMING

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

JAVA2 КТО ПОМНИТ

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

AStartup FailureB[1 2 3 WED Oct 17

161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException

А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ

ERASURE

ERASURE

А ГДЕ МОИ ПРОВЕРКИ

ВО ВРЕМЯ КОМПИЛЯЦИИ

laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo

ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname

[javalangLong javalangLong javalangLong javautilDate javalangString]

COMPILESTATIC

π ndash ТОРТ И ЧИСЛО

DOUBLE THE PI

double value = 3println $value14isDouble()

A trueB MissingPropertyExceptionC falseDMissingMethodException

ПРОСЁК

ПРОСЁК

ПРОСЁК

A trueB MissingPropertyExceptionC falseDMissingMethodException

DOUBLE THE PI

double value = 3println $value14isDouble()

ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ

ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE

ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP

СПРОСИ ФРАНЦУЗОВ

RSVP

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

A Startup FailureB 1C 2D MissingPropertyException

А ВОТ ПОЧЕМУ

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

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

НАПРИМЕР

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

def invite = new Invite()def attendees = inviteattending +1

НУ ИЛИ УБРАТЬ СКОБКИ

Как убрать скобки

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true

B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false

C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true

D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false

ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ

В КОДЕ MIXINMETACLASS

WHY SO PRIMITIVE

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

A Startup ErrorB int long

booleanC javalangInte

ger javalangLong javalangBoolean

Dint

НУ ЭТО ЯСНО А ПОЧЕМУ

порядокточно непорядок

А ЭТО

(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК

JUMP AKA ПРОПАВШИЕ СЛОВА

>

14863602

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

A Here are the lyrics

B Here are the null

C Startup failureD MissingMethodExcep

tion

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen

public static jump() Here are the $lyrics()

static $static_methodMissing(String name def args) lyrics

println VanHalenjump()

ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП

class VanHalen

public jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println new VanHalen()jump()

>

null

10161629

WHATrsquoS THE METACLASS БАРУХ

def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух

AMissingMethodExceptionBWhats the

orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух

CWhatrsquos the javautilLinkedHashMapXXXXXX Барух

DWhatrsquos the frequency Барух

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

mapgetMetaClass()

ВЫВОДЫ

1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis

- intellij IDEA5 Rtfm6 Donrsquot code like my brother

Мы только начали (надо еще форму придумать)

Засылайте Ваши паззлеры поделки и рисунки

- puzzlers jfrogcom- Groovypuzzlers

ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ

Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch

Вам не поравилосьdevnull

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

boolean isPrime(def x) if (x == 2) return true int limit = Mathsqrt(x) + 1 (2limit)each if (x it == 0) return false true

println isPrime(4 as Double)

AtrueBfalse

CNumberFormatException

DMissingMethodException

КАК 4 МОГЛО ОКАЗАТЬСЯ ПРОСТЫМ ЧИСЛОМhellip

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

РЕШЕНИЕ ИСПОЛЬЗУЙ ANY() ИЛИ ПЕРЕОСМЫСЛИ АЛГОРИТМ

httpkousenitwordpresscom20140418responses-to-the-closure-of-no-return

class Conference def name def year

def gr = new Conference(name Greach year 2014)

greach println it

A class=class Conferencename=Greachyear=2014

B ConferenceXXXXXX

C Startup failure

D Greach 2014

КАКОЙ ЖЕ ЭТО ITERABLE

RTFS (READ THE FING SOURCE)

MAX POWER

MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

A ClassCastExceptionB 9C 56Dnull

РАСКУСИЛ

gtgroovysh ((9 as Character) as Integer)===gt 57

ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max

СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL

A ClassCastExceptionB 9C 56Dnull

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

КАК ЭТО ПОЛУЧИЛОСЬ

def random = new Random()

def randomList = []010each randomList ltlt randomnextInt()

assert randomListmax null == randomList[0]

ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО

ДЕТЕКТИВ

КТО УБИЙЦА

A NullPointerException

B ктоУбийцаI_closure1xxxxxxx

C Startup errorD Мориарти

Closure ктоУбийца() Мориарти println ктоУбийца()

ПИЧАЛЬКА

ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ

Closure ктоУбийца() -gt Мориарти

Closure ктоУбийца() return Мориарти

>

The Final Countdown - fragment

Europe

Top Disco Hits vol 1 track 17

9743676

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9D10

КАК ТАК ТО НУ КАК ТАК ТО

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648

ЛУЧШЕ НЕ СТАЛОhellip

ЧТО ПРОИЗОШЛО

ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

ПОЧИНИЛИclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9

D42

ЭТО ВООБЩЕ КАК

PUBLIC - PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

A publicPropertyproperty

B publicPropertyPublic__property

C publicPropertygetProperty()

D publicPropertyproperty

У МЕНЯ ДВА ВОПРОСА

1Что за дебильное имя

2 Откуда я мог это знать

ОТВЕТ НА 1 IN SOVIET RUSSIA

YOU DONrsquoT ACCESS PUBLIC

PROPERTY

ОТВЕТ НА 2

httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml

А ты документацию читать не пробовал

ГДЕ КАРТА БИЛЛИ

ГДЕ КАРТА БИЛЛИ

def key = xdef map = [key treasure]def value = mapget(key)println value

def key = xdef map = [key treasure]def value = mapget(key)println value

ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000

чертей

КАК ЭТО NULL

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ

ЧИНИМ

1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure

ЕЩЕ КАРТЫ БИЛЛИ

ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value

def map = [2 treasure]def key = 2def value = map$keyprintln value

ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку

А СЕЙЧАС ТО-ЧТО

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ

def map = [2 treasure]println mapkeySet()first()classname

javalangInteger

НАМ НУЖНА КАРТА

НАМ НУЖНА КАРТА

def key = xdef map = [$key treasure]def value = map[x]println value

ANoSuchElementExceptionBnullCtreasureDПолундра Startup error

def key = xdef map = [$key treasure]def value = map[x]println value

ЧТО ОПЯТЬ

STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН

def map = [$key treasure]println mapkeySet()first()classname

orgcodehausgroovyruntimeGStringImpl

OUT OF RANGE

AAssertion FailedBfalseCtrueDNullPointerException

OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3

Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()

10 20 30 40 50 60 70 80 90 100

РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ

GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56

ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100

bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно

bullИ пусть делегирует в containsWithinBounds

bullПочините наконец GROOVY-2771

bullThank you

POWER RANGE(RS)

УБИРАЕМ ЕДИНИЧКУ

A -1012345678

C[0 2 3 4 5 6 7 8 9]

D[-1 0 1 2 3 4 5 6 7 8]

[09]each println(it - 1)

B0123456789

[09]each println(it - 1)

Это неправильные скобки

(09)each println(it - 1)

Другое дело

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

[0 2 3 4 5 6 7 8 9]

SAVE THE DATE

JOKERCONF IS COMING

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

JAVA2 КТО ПОМНИТ

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

AStartup FailureB[1 2 3 WED Oct 17

161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException

А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ

ERASURE

ERASURE

А ГДЕ МОИ ПРОВЕРКИ

ВО ВРЕМЯ КОМПИЛЯЦИИ

laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo

ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname

[javalangLong javalangLong javalangLong javautilDate javalangString]

COMPILESTATIC

π ndash ТОРТ И ЧИСЛО

DOUBLE THE PI

double value = 3println $value14isDouble()

A trueB MissingPropertyExceptionC falseDMissingMethodException

ПРОСЁК

ПРОСЁК

ПРОСЁК

A trueB MissingPropertyExceptionC falseDMissingMethodException

DOUBLE THE PI

double value = 3println $value14isDouble()

ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ

ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE

ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP

СПРОСИ ФРАНЦУЗОВ

RSVP

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

A Startup FailureB 1C 2D MissingPropertyException

А ВОТ ПОЧЕМУ

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

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

НАПРИМЕР

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

def invite = new Invite()def attendees = inviteattending +1

НУ ИЛИ УБРАТЬ СКОБКИ

Как убрать скобки

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true

B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false

C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true

D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false

ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ

В КОДЕ MIXINMETACLASS

WHY SO PRIMITIVE

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

A Startup ErrorB int long

booleanC javalangInte

ger javalangLong javalangBoolean

Dint

НУ ЭТО ЯСНО А ПОЧЕМУ

порядокточно непорядок

А ЭТО

(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК

JUMP AKA ПРОПАВШИЕ СЛОВА

>

14863602

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

A Here are the lyrics

B Here are the null

C Startup failureD MissingMethodExcep

tion

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen

public static jump() Here are the $lyrics()

static $static_methodMissing(String name def args) lyrics

println VanHalenjump()

ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП

class VanHalen

public jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println new VanHalen()jump()

>

null

10161629

WHATrsquoS THE METACLASS БАРУХ

def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух

AMissingMethodExceptionBWhats the

orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух

CWhatrsquos the javautilLinkedHashMapXXXXXX Барух

DWhatrsquos the frequency Барух

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

mapgetMetaClass()

ВЫВОДЫ

1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis

- intellij IDEA5 Rtfm6 Donrsquot code like my brother

Мы только начали (надо еще форму придумать)

Засылайте Ваши паззлеры поделки и рисунки

- puzzlers jfrogcom- Groovypuzzlers

ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ

Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch

Вам не поравилосьdevnull

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

КАК 4 МОГЛО ОКАЗАТЬСЯ ПРОСТЫМ ЧИСЛОМhellip

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

РЕШЕНИЕ ИСПОЛЬЗУЙ ANY() ИЛИ ПЕРЕОСМЫСЛИ АЛГОРИТМ

httpkousenitwordpresscom20140418responses-to-the-closure-of-no-return

class Conference def name def year

def gr = new Conference(name Greach year 2014)

greach println it

A class=class Conferencename=Greachyear=2014

B ConferenceXXXXXX

C Startup failure

D Greach 2014

КАКОЙ ЖЕ ЭТО ITERABLE

RTFS (READ THE FING SOURCE)

MAX POWER

MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

A ClassCastExceptionB 9C 56Dnull

РАСКУСИЛ

gtgroovysh ((9 as Character) as Integer)===gt 57

ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max

СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL

A ClassCastExceptionB 9C 56Dnull

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

КАК ЭТО ПОЛУЧИЛОСЬ

def random = new Random()

def randomList = []010each randomList ltlt randomnextInt()

assert randomListmax null == randomList[0]

ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО

ДЕТЕКТИВ

КТО УБИЙЦА

A NullPointerException

B ктоУбийцаI_closure1xxxxxxx

C Startup errorD Мориарти

Closure ктоУбийца() Мориарти println ктоУбийца()

ПИЧАЛЬКА

ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ

Closure ктоУбийца() -gt Мориарти

Closure ктоУбийца() return Мориарти

>

The Final Countdown - fragment

Europe

Top Disco Hits vol 1 track 17

9743676

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9D10

КАК ТАК ТО НУ КАК ТАК ТО

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648

ЛУЧШЕ НЕ СТАЛОhellip

ЧТО ПРОИЗОШЛО

ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

ПОЧИНИЛИclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9

D42

ЭТО ВООБЩЕ КАК

PUBLIC - PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

A publicPropertyproperty

B publicPropertyPublic__property

C publicPropertygetProperty()

D publicPropertyproperty

У МЕНЯ ДВА ВОПРОСА

1Что за дебильное имя

2 Откуда я мог это знать

ОТВЕТ НА 1 IN SOVIET RUSSIA

YOU DONrsquoT ACCESS PUBLIC

PROPERTY

ОТВЕТ НА 2

httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml

А ты документацию читать не пробовал

ГДЕ КАРТА БИЛЛИ

ГДЕ КАРТА БИЛЛИ

def key = xdef map = [key treasure]def value = mapget(key)println value

def key = xdef map = [key treasure]def value = mapget(key)println value

ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000

чертей

КАК ЭТО NULL

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ

ЧИНИМ

1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure

ЕЩЕ КАРТЫ БИЛЛИ

ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value

def map = [2 treasure]def key = 2def value = map$keyprintln value

ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку

А СЕЙЧАС ТО-ЧТО

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ

def map = [2 treasure]println mapkeySet()first()classname

javalangInteger

НАМ НУЖНА КАРТА

НАМ НУЖНА КАРТА

def key = xdef map = [$key treasure]def value = map[x]println value

ANoSuchElementExceptionBnullCtreasureDПолундра Startup error

def key = xdef map = [$key treasure]def value = map[x]println value

ЧТО ОПЯТЬ

STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН

def map = [$key treasure]println mapkeySet()first()classname

orgcodehausgroovyruntimeGStringImpl

OUT OF RANGE

AAssertion FailedBfalseCtrueDNullPointerException

OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3

Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()

10 20 30 40 50 60 70 80 90 100

РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ

GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56

ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100

bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно

bullИ пусть делегирует в containsWithinBounds

bullПочините наконец GROOVY-2771

bullThank you

POWER RANGE(RS)

УБИРАЕМ ЕДИНИЧКУ

A -1012345678

C[0 2 3 4 5 6 7 8 9]

D[-1 0 1 2 3 4 5 6 7 8]

[09]each println(it - 1)

B0123456789

[09]each println(it - 1)

Это неправильные скобки

(09)each println(it - 1)

Другое дело

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

[0 2 3 4 5 6 7 8 9]

SAVE THE DATE

JOKERCONF IS COMING

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

JAVA2 КТО ПОМНИТ

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

AStartup FailureB[1 2 3 WED Oct 17

161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException

А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ

ERASURE

ERASURE

А ГДЕ МОИ ПРОВЕРКИ

ВО ВРЕМЯ КОМПИЛЯЦИИ

laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo

ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname

[javalangLong javalangLong javalangLong javautilDate javalangString]

COMPILESTATIC

π ndash ТОРТ И ЧИСЛО

DOUBLE THE PI

double value = 3println $value14isDouble()

A trueB MissingPropertyExceptionC falseDMissingMethodException

ПРОСЁК

ПРОСЁК

ПРОСЁК

A trueB MissingPropertyExceptionC falseDMissingMethodException

DOUBLE THE PI

double value = 3println $value14isDouble()

ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ

ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE

ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP

СПРОСИ ФРАНЦУЗОВ

RSVP

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

A Startup FailureB 1C 2D MissingPropertyException

А ВОТ ПОЧЕМУ

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

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

НАПРИМЕР

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

def invite = new Invite()def attendees = inviteattending +1

НУ ИЛИ УБРАТЬ СКОБКИ

Как убрать скобки

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true

B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false

C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true

D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false

ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ

В КОДЕ MIXINMETACLASS

WHY SO PRIMITIVE

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

A Startup ErrorB int long

booleanC javalangInte

ger javalangLong javalangBoolean

Dint

НУ ЭТО ЯСНО А ПОЧЕМУ

порядокточно непорядок

А ЭТО

(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК

JUMP AKA ПРОПАВШИЕ СЛОВА

>

14863602

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

A Here are the lyrics

B Here are the null

C Startup failureD MissingMethodExcep

tion

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen

public static jump() Here are the $lyrics()

static $static_methodMissing(String name def args) lyrics

println VanHalenjump()

ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП

class VanHalen

public jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println new VanHalen()jump()

>

null

10161629

WHATrsquoS THE METACLASS БАРУХ

def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух

AMissingMethodExceptionBWhats the

orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух

CWhatrsquos the javautilLinkedHashMapXXXXXX Барух

DWhatrsquos the frequency Барух

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

mapgetMetaClass()

ВЫВОДЫ

1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis

- intellij IDEA5 Rtfm6 Donrsquot code like my brother

Мы только начали (надо еще форму придумать)

Засылайте Ваши паззлеры поделки и рисунки

- puzzlers jfrogcom- Groovypuzzlers

ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ

Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch

Вам не поравилосьdevnull

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

РЕШЕНИЕ ИСПОЛЬЗУЙ ANY() ИЛИ ПЕРЕОСМЫСЛИ АЛГОРИТМ

httpkousenitwordpresscom20140418responses-to-the-closure-of-no-return

class Conference def name def year

def gr = new Conference(name Greach year 2014)

greach println it

A class=class Conferencename=Greachyear=2014

B ConferenceXXXXXX

C Startup failure

D Greach 2014

КАКОЙ ЖЕ ЭТО ITERABLE

RTFS (READ THE FING SOURCE)

MAX POWER

MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

A ClassCastExceptionB 9C 56Dnull

РАСКУСИЛ

gtgroovysh ((9 as Character) as Integer)===gt 57

ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max

СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL

A ClassCastExceptionB 9C 56Dnull

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

КАК ЭТО ПОЛУЧИЛОСЬ

def random = new Random()

def randomList = []010each randomList ltlt randomnextInt()

assert randomListmax null == randomList[0]

ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО

ДЕТЕКТИВ

КТО УБИЙЦА

A NullPointerException

B ктоУбийцаI_closure1xxxxxxx

C Startup errorD Мориарти

Closure ктоУбийца() Мориарти println ктоУбийца()

ПИЧАЛЬКА

ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ

Closure ктоУбийца() -gt Мориарти

Closure ктоУбийца() return Мориарти

>

The Final Countdown - fragment

Europe

Top Disco Hits vol 1 track 17

9743676

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9D10

КАК ТАК ТО НУ КАК ТАК ТО

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648

ЛУЧШЕ НЕ СТАЛОhellip

ЧТО ПРОИЗОШЛО

ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

ПОЧИНИЛИclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9

D42

ЭТО ВООБЩЕ КАК

PUBLIC - PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

A publicPropertyproperty

B publicPropertyPublic__property

C publicPropertygetProperty()

D publicPropertyproperty

У МЕНЯ ДВА ВОПРОСА

1Что за дебильное имя

2 Откуда я мог это знать

ОТВЕТ НА 1 IN SOVIET RUSSIA

YOU DONrsquoT ACCESS PUBLIC

PROPERTY

ОТВЕТ НА 2

httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml

А ты документацию читать не пробовал

ГДЕ КАРТА БИЛЛИ

ГДЕ КАРТА БИЛЛИ

def key = xdef map = [key treasure]def value = mapget(key)println value

def key = xdef map = [key treasure]def value = mapget(key)println value

ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000

чертей

КАК ЭТО NULL

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ

ЧИНИМ

1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure

ЕЩЕ КАРТЫ БИЛЛИ

ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value

def map = [2 treasure]def key = 2def value = map$keyprintln value

ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку

А СЕЙЧАС ТО-ЧТО

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ

def map = [2 treasure]println mapkeySet()first()classname

javalangInteger

НАМ НУЖНА КАРТА

НАМ НУЖНА КАРТА

def key = xdef map = [$key treasure]def value = map[x]println value

ANoSuchElementExceptionBnullCtreasureDПолундра Startup error

def key = xdef map = [$key treasure]def value = map[x]println value

ЧТО ОПЯТЬ

STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН

def map = [$key treasure]println mapkeySet()first()classname

orgcodehausgroovyruntimeGStringImpl

OUT OF RANGE

AAssertion FailedBfalseCtrueDNullPointerException

OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3

Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()

10 20 30 40 50 60 70 80 90 100

РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ

GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56

ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100

bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно

bullИ пусть делегирует в containsWithinBounds

bullПочините наконец GROOVY-2771

bullThank you

POWER RANGE(RS)

УБИРАЕМ ЕДИНИЧКУ

A -1012345678

C[0 2 3 4 5 6 7 8 9]

D[-1 0 1 2 3 4 5 6 7 8]

[09]each println(it - 1)

B0123456789

[09]each println(it - 1)

Это неправильные скобки

(09)each println(it - 1)

Другое дело

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

[0 2 3 4 5 6 7 8 9]

SAVE THE DATE

JOKERCONF IS COMING

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

JAVA2 КТО ПОМНИТ

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

AStartup FailureB[1 2 3 WED Oct 17

161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException

А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ

ERASURE

ERASURE

А ГДЕ МОИ ПРОВЕРКИ

ВО ВРЕМЯ КОМПИЛЯЦИИ

laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo

ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname

[javalangLong javalangLong javalangLong javautilDate javalangString]

COMPILESTATIC

π ndash ТОРТ И ЧИСЛО

DOUBLE THE PI

double value = 3println $value14isDouble()

A trueB MissingPropertyExceptionC falseDMissingMethodException

ПРОСЁК

ПРОСЁК

ПРОСЁК

A trueB MissingPropertyExceptionC falseDMissingMethodException

DOUBLE THE PI

double value = 3println $value14isDouble()

ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ

ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE

ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP

СПРОСИ ФРАНЦУЗОВ

RSVP

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

A Startup FailureB 1C 2D MissingPropertyException

А ВОТ ПОЧЕМУ

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

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

НАПРИМЕР

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

def invite = new Invite()def attendees = inviteattending +1

НУ ИЛИ УБРАТЬ СКОБКИ

Как убрать скобки

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true

B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false

C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true

D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false

ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ

В КОДЕ MIXINMETACLASS

WHY SO PRIMITIVE

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

A Startup ErrorB int long

booleanC javalangInte

ger javalangLong javalangBoolean

Dint

НУ ЭТО ЯСНО А ПОЧЕМУ

порядокточно непорядок

А ЭТО

(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК

JUMP AKA ПРОПАВШИЕ СЛОВА

>

14863602

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

A Here are the lyrics

B Here are the null

C Startup failureD MissingMethodExcep

tion

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen

public static jump() Here are the $lyrics()

static $static_methodMissing(String name def args) lyrics

println VanHalenjump()

ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП

class VanHalen

public jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println new VanHalen()jump()

>

null

10161629

WHATrsquoS THE METACLASS БАРУХ

def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух

AMissingMethodExceptionBWhats the

orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух

CWhatrsquos the javautilLinkedHashMapXXXXXX Барух

DWhatrsquos the frequency Барух

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

mapgetMetaClass()

ВЫВОДЫ

1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis

- intellij IDEA5 Rtfm6 Donrsquot code like my brother

Мы только начали (надо еще форму придумать)

Засылайте Ваши паззлеры поделки и рисунки

- puzzlers jfrogcom- Groovypuzzlers

ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ

Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch

Вам не поравилосьdevnull

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

РЕШЕНИЕ ИСПОЛЬЗУЙ ANY() ИЛИ ПЕРЕОСМЫСЛИ АЛГОРИТМ

httpkousenitwordpresscom20140418responses-to-the-closure-of-no-return

class Conference def name def year

def gr = new Conference(name Greach year 2014)

greach println it

A class=class Conferencename=Greachyear=2014

B ConferenceXXXXXX

C Startup failure

D Greach 2014

КАКОЙ ЖЕ ЭТО ITERABLE

RTFS (READ THE FING SOURCE)

MAX POWER

MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

A ClassCastExceptionB 9C 56Dnull

РАСКУСИЛ

gtgroovysh ((9 as Character) as Integer)===gt 57

ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max

СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL

A ClassCastExceptionB 9C 56Dnull

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

КАК ЭТО ПОЛУЧИЛОСЬ

def random = new Random()

def randomList = []010each randomList ltlt randomnextInt()

assert randomListmax null == randomList[0]

ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО

ДЕТЕКТИВ

КТО УБИЙЦА

A NullPointerException

B ктоУбийцаI_closure1xxxxxxx

C Startup errorD Мориарти

Closure ктоУбийца() Мориарти println ктоУбийца()

ПИЧАЛЬКА

ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ

Closure ктоУбийца() -gt Мориарти

Closure ктоУбийца() return Мориарти

>

The Final Countdown - fragment

Europe

Top Disco Hits vol 1 track 17

9743676

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9D10

КАК ТАК ТО НУ КАК ТАК ТО

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648

ЛУЧШЕ НЕ СТАЛОhellip

ЧТО ПРОИЗОШЛО

ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

ПОЧИНИЛИclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9

D42

ЭТО ВООБЩЕ КАК

PUBLIC - PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

A publicPropertyproperty

B publicPropertyPublic__property

C publicPropertygetProperty()

D publicPropertyproperty

У МЕНЯ ДВА ВОПРОСА

1Что за дебильное имя

2 Откуда я мог это знать

ОТВЕТ НА 1 IN SOVIET RUSSIA

YOU DONrsquoT ACCESS PUBLIC

PROPERTY

ОТВЕТ НА 2

httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml

А ты документацию читать не пробовал

ГДЕ КАРТА БИЛЛИ

ГДЕ КАРТА БИЛЛИ

def key = xdef map = [key treasure]def value = mapget(key)println value

def key = xdef map = [key treasure]def value = mapget(key)println value

ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000

чертей

КАК ЭТО NULL

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ

ЧИНИМ

1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure

ЕЩЕ КАРТЫ БИЛЛИ

ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value

def map = [2 treasure]def key = 2def value = map$keyprintln value

ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку

А СЕЙЧАС ТО-ЧТО

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ

def map = [2 treasure]println mapkeySet()first()classname

javalangInteger

НАМ НУЖНА КАРТА

НАМ НУЖНА КАРТА

def key = xdef map = [$key treasure]def value = map[x]println value

ANoSuchElementExceptionBnullCtreasureDПолундра Startup error

def key = xdef map = [$key treasure]def value = map[x]println value

ЧТО ОПЯТЬ

STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН

def map = [$key treasure]println mapkeySet()first()classname

orgcodehausgroovyruntimeGStringImpl

OUT OF RANGE

AAssertion FailedBfalseCtrueDNullPointerException

OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3

Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()

10 20 30 40 50 60 70 80 90 100

РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ

GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56

ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100

bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно

bullИ пусть делегирует в containsWithinBounds

bullПочините наконец GROOVY-2771

bullThank you

POWER RANGE(RS)

УБИРАЕМ ЕДИНИЧКУ

A -1012345678

C[0 2 3 4 5 6 7 8 9]

D[-1 0 1 2 3 4 5 6 7 8]

[09]each println(it - 1)

B0123456789

[09]each println(it - 1)

Это неправильные скобки

(09)each println(it - 1)

Другое дело

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

[0 2 3 4 5 6 7 8 9]

SAVE THE DATE

JOKERCONF IS COMING

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

JAVA2 КТО ПОМНИТ

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

AStartup FailureB[1 2 3 WED Oct 17

161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException

А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ

ERASURE

ERASURE

А ГДЕ МОИ ПРОВЕРКИ

ВО ВРЕМЯ КОМПИЛЯЦИИ

laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo

ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname

[javalangLong javalangLong javalangLong javautilDate javalangString]

COMPILESTATIC

π ndash ТОРТ И ЧИСЛО

DOUBLE THE PI

double value = 3println $value14isDouble()

A trueB MissingPropertyExceptionC falseDMissingMethodException

ПРОСЁК

ПРОСЁК

ПРОСЁК

A trueB MissingPropertyExceptionC falseDMissingMethodException

DOUBLE THE PI

double value = 3println $value14isDouble()

ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ

ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE

ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP

СПРОСИ ФРАНЦУЗОВ

RSVP

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

A Startup FailureB 1C 2D MissingPropertyException

А ВОТ ПОЧЕМУ

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

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

НАПРИМЕР

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

def invite = new Invite()def attendees = inviteattending +1

НУ ИЛИ УБРАТЬ СКОБКИ

Как убрать скобки

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true

B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false

C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true

D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false

ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ

В КОДЕ MIXINMETACLASS

WHY SO PRIMITIVE

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

A Startup ErrorB int long

booleanC javalangInte

ger javalangLong javalangBoolean

Dint

НУ ЭТО ЯСНО А ПОЧЕМУ

порядокточно непорядок

А ЭТО

(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК

JUMP AKA ПРОПАВШИЕ СЛОВА

>

14863602

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

A Here are the lyrics

B Here are the null

C Startup failureD MissingMethodExcep

tion

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen

public static jump() Here are the $lyrics()

static $static_methodMissing(String name def args) lyrics

println VanHalenjump()

ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП

class VanHalen

public jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println new VanHalen()jump()

>

null

10161629

WHATrsquoS THE METACLASS БАРУХ

def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух

AMissingMethodExceptionBWhats the

orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух

CWhatrsquos the javautilLinkedHashMapXXXXXX Барух

DWhatrsquos the frequency Барух

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

mapgetMetaClass()

ВЫВОДЫ

1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis

- intellij IDEA5 Rtfm6 Donrsquot code like my brother

Мы только начали (надо еще форму придумать)

Засылайте Ваши паззлеры поделки и рисунки

- puzzlers jfrogcom- Groovypuzzlers

ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ

Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch

Вам не поравилосьdevnull

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

РЕШЕНИЕ ИСПОЛЬЗУЙ ANY() ИЛИ ПЕРЕОСМЫСЛИ АЛГОРИТМ

httpkousenitwordpresscom20140418responses-to-the-closure-of-no-return

class Conference def name def year

def gr = new Conference(name Greach year 2014)

greach println it

A class=class Conferencename=Greachyear=2014

B ConferenceXXXXXX

C Startup failure

D Greach 2014

КАКОЙ ЖЕ ЭТО ITERABLE

RTFS (READ THE FING SOURCE)

MAX POWER

MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

A ClassCastExceptionB 9C 56Dnull

РАСКУСИЛ

gtgroovysh ((9 as Character) as Integer)===gt 57

ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max

СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL

A ClassCastExceptionB 9C 56Dnull

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

КАК ЭТО ПОЛУЧИЛОСЬ

def random = new Random()

def randomList = []010each randomList ltlt randomnextInt()

assert randomListmax null == randomList[0]

ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО

ДЕТЕКТИВ

КТО УБИЙЦА

A NullPointerException

B ктоУбийцаI_closure1xxxxxxx

C Startup errorD Мориарти

Closure ктоУбийца() Мориарти println ктоУбийца()

ПИЧАЛЬКА

ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ

Closure ктоУбийца() -gt Мориарти

Closure ктоУбийца() return Мориарти

>

The Final Countdown - fragment

Europe

Top Disco Hits vol 1 track 17

9743676

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9D10

КАК ТАК ТО НУ КАК ТАК ТО

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648

ЛУЧШЕ НЕ СТАЛОhellip

ЧТО ПРОИЗОШЛО

ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

ПОЧИНИЛИclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9

D42

ЭТО ВООБЩЕ КАК

PUBLIC - PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

A publicPropertyproperty

B publicPropertyPublic__property

C publicPropertygetProperty()

D publicPropertyproperty

У МЕНЯ ДВА ВОПРОСА

1Что за дебильное имя

2 Откуда я мог это знать

ОТВЕТ НА 1 IN SOVIET RUSSIA

YOU DONrsquoT ACCESS PUBLIC

PROPERTY

ОТВЕТ НА 2

httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml

А ты документацию читать не пробовал

ГДЕ КАРТА БИЛЛИ

ГДЕ КАРТА БИЛЛИ

def key = xdef map = [key treasure]def value = mapget(key)println value

def key = xdef map = [key treasure]def value = mapget(key)println value

ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000

чертей

КАК ЭТО NULL

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ

ЧИНИМ

1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure

ЕЩЕ КАРТЫ БИЛЛИ

ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value

def map = [2 treasure]def key = 2def value = map$keyprintln value

ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку

А СЕЙЧАС ТО-ЧТО

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ

def map = [2 treasure]println mapkeySet()first()classname

javalangInteger

НАМ НУЖНА КАРТА

НАМ НУЖНА КАРТА

def key = xdef map = [$key treasure]def value = map[x]println value

ANoSuchElementExceptionBnullCtreasureDПолундра Startup error

def key = xdef map = [$key treasure]def value = map[x]println value

ЧТО ОПЯТЬ

STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН

def map = [$key treasure]println mapkeySet()first()classname

orgcodehausgroovyruntimeGStringImpl

OUT OF RANGE

AAssertion FailedBfalseCtrueDNullPointerException

OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3

Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()

10 20 30 40 50 60 70 80 90 100

РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ

GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56

ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100

bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно

bullИ пусть делегирует в containsWithinBounds

bullПочините наконец GROOVY-2771

bullThank you

POWER RANGE(RS)

УБИРАЕМ ЕДИНИЧКУ

A -1012345678

C[0 2 3 4 5 6 7 8 9]

D[-1 0 1 2 3 4 5 6 7 8]

[09]each println(it - 1)

B0123456789

[09]each println(it - 1)

Это неправильные скобки

(09)each println(it - 1)

Другое дело

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

[0 2 3 4 5 6 7 8 9]

SAVE THE DATE

JOKERCONF IS COMING

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

JAVA2 КТО ПОМНИТ

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

AStartup FailureB[1 2 3 WED Oct 17

161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException

А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ

ERASURE

ERASURE

А ГДЕ МОИ ПРОВЕРКИ

ВО ВРЕМЯ КОМПИЛЯЦИИ

laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo

ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname

[javalangLong javalangLong javalangLong javautilDate javalangString]

COMPILESTATIC

π ndash ТОРТ И ЧИСЛО

DOUBLE THE PI

double value = 3println $value14isDouble()

A trueB MissingPropertyExceptionC falseDMissingMethodException

ПРОСЁК

ПРОСЁК

ПРОСЁК

A trueB MissingPropertyExceptionC falseDMissingMethodException

DOUBLE THE PI

double value = 3println $value14isDouble()

ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ

ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE

ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP

СПРОСИ ФРАНЦУЗОВ

RSVP

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

A Startup FailureB 1C 2D MissingPropertyException

А ВОТ ПОЧЕМУ

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

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

НАПРИМЕР

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

def invite = new Invite()def attendees = inviteattending +1

НУ ИЛИ УБРАТЬ СКОБКИ

Как убрать скобки

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true

B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false

C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true

D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false

ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ

В КОДЕ MIXINMETACLASS

WHY SO PRIMITIVE

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

A Startup ErrorB int long

booleanC javalangInte

ger javalangLong javalangBoolean

Dint

НУ ЭТО ЯСНО А ПОЧЕМУ

порядокточно непорядок

А ЭТО

(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК

JUMP AKA ПРОПАВШИЕ СЛОВА

>

14863602

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

A Here are the lyrics

B Here are the null

C Startup failureD MissingMethodExcep

tion

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen

public static jump() Here are the $lyrics()

static $static_methodMissing(String name def args) lyrics

println VanHalenjump()

ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП

class VanHalen

public jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println new VanHalen()jump()

>

null

10161629

WHATrsquoS THE METACLASS БАРУХ

def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух

AMissingMethodExceptionBWhats the

orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух

CWhatrsquos the javautilLinkedHashMapXXXXXX Барух

DWhatrsquos the frequency Барух

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

mapgetMetaClass()

ВЫВОДЫ

1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis

- intellij IDEA5 Rtfm6 Donrsquot code like my brother

Мы только начали (надо еще форму придумать)

Засылайте Ваши паззлеры поделки и рисунки

- puzzlers jfrogcom- Groovypuzzlers

ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ

Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch

Вам не поравилосьdevnull

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ДАВАЙТЕ РАЗБИРАТЬСЯ

ДАВАЙТЕ РАЗБИРАТЬСЯ

РЕШЕНИЕ ИСПОЛЬЗУЙ ANY() ИЛИ ПЕРЕОСМЫСЛИ АЛГОРИТМ

httpkousenitwordpresscom20140418responses-to-the-closure-of-no-return

class Conference def name def year

def gr = new Conference(name Greach year 2014)

greach println it

A class=class Conferencename=Greachyear=2014

B ConferenceXXXXXX

C Startup failure

D Greach 2014

КАКОЙ ЖЕ ЭТО ITERABLE

RTFS (READ THE FING SOURCE)

MAX POWER

MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

A ClassCastExceptionB 9C 56Dnull

РАСКУСИЛ

gtgroovysh ((9 as Character) as Integer)===gt 57

ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max

СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL

A ClassCastExceptionB 9C 56Dnull

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

КАК ЭТО ПОЛУЧИЛОСЬ

def random = new Random()

def randomList = []010each randomList ltlt randomnextInt()

assert randomListmax null == randomList[0]

ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО

ДЕТЕКТИВ

КТО УБИЙЦА

A NullPointerException

B ктоУбийцаI_closure1xxxxxxx

C Startup errorD Мориарти

Closure ктоУбийца() Мориарти println ктоУбийца()

ПИЧАЛЬКА

ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ

Closure ктоУбийца() -gt Мориарти

Closure ктоУбийца() return Мориарти

>

The Final Countdown - fragment

Europe

Top Disco Hits vol 1 track 17

9743676

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9D10

КАК ТАК ТО НУ КАК ТАК ТО

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648

ЛУЧШЕ НЕ СТАЛОhellip

ЧТО ПРОИЗОШЛО

ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

ПОЧИНИЛИclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9

D42

ЭТО ВООБЩЕ КАК

PUBLIC - PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

A publicPropertyproperty

B publicPropertyPublic__property

C publicPropertygetProperty()

D publicPropertyproperty

У МЕНЯ ДВА ВОПРОСА

1Что за дебильное имя

2 Откуда я мог это знать

ОТВЕТ НА 1 IN SOVIET RUSSIA

YOU DONrsquoT ACCESS PUBLIC

PROPERTY

ОТВЕТ НА 2

httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml

А ты документацию читать не пробовал

ГДЕ КАРТА БИЛЛИ

ГДЕ КАРТА БИЛЛИ

def key = xdef map = [key treasure]def value = mapget(key)println value

def key = xdef map = [key treasure]def value = mapget(key)println value

ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000

чертей

КАК ЭТО NULL

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ

ЧИНИМ

1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure

ЕЩЕ КАРТЫ БИЛЛИ

ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value

def map = [2 treasure]def key = 2def value = map$keyprintln value

ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку

А СЕЙЧАС ТО-ЧТО

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ

def map = [2 treasure]println mapkeySet()first()classname

javalangInteger

НАМ НУЖНА КАРТА

НАМ НУЖНА КАРТА

def key = xdef map = [$key treasure]def value = map[x]println value

ANoSuchElementExceptionBnullCtreasureDПолундра Startup error

def key = xdef map = [$key treasure]def value = map[x]println value

ЧТО ОПЯТЬ

STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН

def map = [$key treasure]println mapkeySet()first()classname

orgcodehausgroovyruntimeGStringImpl

OUT OF RANGE

AAssertion FailedBfalseCtrueDNullPointerException

OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3

Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()

10 20 30 40 50 60 70 80 90 100

РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ

GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56

ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100

bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно

bullИ пусть делегирует в containsWithinBounds

bullПочините наконец GROOVY-2771

bullThank you

POWER RANGE(RS)

УБИРАЕМ ЕДИНИЧКУ

A -1012345678

C[0 2 3 4 5 6 7 8 9]

D[-1 0 1 2 3 4 5 6 7 8]

[09]each println(it - 1)

B0123456789

[09]each println(it - 1)

Это неправильные скобки

(09)each println(it - 1)

Другое дело

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

[0 2 3 4 5 6 7 8 9]

SAVE THE DATE

JOKERCONF IS COMING

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

JAVA2 КТО ПОМНИТ

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

AStartup FailureB[1 2 3 WED Oct 17

161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException

А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ

ERASURE

ERASURE

А ГДЕ МОИ ПРОВЕРКИ

ВО ВРЕМЯ КОМПИЛЯЦИИ

laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo

ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname

[javalangLong javalangLong javalangLong javautilDate javalangString]

COMPILESTATIC

π ndash ТОРТ И ЧИСЛО

DOUBLE THE PI

double value = 3println $value14isDouble()

A trueB MissingPropertyExceptionC falseDMissingMethodException

ПРОСЁК

ПРОСЁК

ПРОСЁК

A trueB MissingPropertyExceptionC falseDMissingMethodException

DOUBLE THE PI

double value = 3println $value14isDouble()

ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ

ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE

ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP

СПРОСИ ФРАНЦУЗОВ

RSVP

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

A Startup FailureB 1C 2D MissingPropertyException

А ВОТ ПОЧЕМУ

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

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

НАПРИМЕР

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

def invite = new Invite()def attendees = inviteattending +1

НУ ИЛИ УБРАТЬ СКОБКИ

Как убрать скобки

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true

B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false

C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true

D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false

ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ

В КОДЕ MIXINMETACLASS

WHY SO PRIMITIVE

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

A Startup ErrorB int long

booleanC javalangInte

ger javalangLong javalangBoolean

Dint

НУ ЭТО ЯСНО А ПОЧЕМУ

порядокточно непорядок

А ЭТО

(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК

JUMP AKA ПРОПАВШИЕ СЛОВА

>

14863602

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

A Here are the lyrics

B Here are the null

C Startup failureD MissingMethodExcep

tion

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen

public static jump() Here are the $lyrics()

static $static_methodMissing(String name def args) lyrics

println VanHalenjump()

ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП

class VanHalen

public jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println new VanHalen()jump()

>

null

10161629

WHATrsquoS THE METACLASS БАРУХ

def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух

AMissingMethodExceptionBWhats the

orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух

CWhatrsquos the javautilLinkedHashMapXXXXXX Барух

DWhatrsquos the frequency Барух

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

mapgetMetaClass()

ВЫВОДЫ

1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis

- intellij IDEA5 Rtfm6 Donrsquot code like my brother

Мы только начали (надо еще форму придумать)

Засылайте Ваши паззлеры поделки и рисунки

- puzzlers jfrogcom- Groovypuzzlers

ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ

Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch

Вам не поравилосьdevnull

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ДАВАЙТЕ РАЗБИРАТЬСЯ

РЕШЕНИЕ ИСПОЛЬЗУЙ ANY() ИЛИ ПЕРЕОСМЫСЛИ АЛГОРИТМ

httpkousenitwordpresscom20140418responses-to-the-closure-of-no-return

class Conference def name def year

def gr = new Conference(name Greach year 2014)

greach println it

A class=class Conferencename=Greachyear=2014

B ConferenceXXXXXX

C Startup failure

D Greach 2014

КАКОЙ ЖЕ ЭТО ITERABLE

RTFS (READ THE FING SOURCE)

MAX POWER

MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

A ClassCastExceptionB 9C 56Dnull

РАСКУСИЛ

gtgroovysh ((9 as Character) as Integer)===gt 57

ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max

СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL

A ClassCastExceptionB 9C 56Dnull

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

КАК ЭТО ПОЛУЧИЛОСЬ

def random = new Random()

def randomList = []010each randomList ltlt randomnextInt()

assert randomListmax null == randomList[0]

ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО

ДЕТЕКТИВ

КТО УБИЙЦА

A NullPointerException

B ктоУбийцаI_closure1xxxxxxx

C Startup errorD Мориарти

Closure ктоУбийца() Мориарти println ктоУбийца()

ПИЧАЛЬКА

ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ

Closure ктоУбийца() -gt Мориарти

Closure ктоУбийца() return Мориарти

>

The Final Countdown - fragment

Europe

Top Disco Hits vol 1 track 17

9743676

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9D10

КАК ТАК ТО НУ КАК ТАК ТО

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648

ЛУЧШЕ НЕ СТАЛОhellip

ЧТО ПРОИЗОШЛО

ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

ПОЧИНИЛИclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9

D42

ЭТО ВООБЩЕ КАК

PUBLIC - PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

A publicPropertyproperty

B publicPropertyPublic__property

C publicPropertygetProperty()

D publicPropertyproperty

У МЕНЯ ДВА ВОПРОСА

1Что за дебильное имя

2 Откуда я мог это знать

ОТВЕТ НА 1 IN SOVIET RUSSIA

YOU DONrsquoT ACCESS PUBLIC

PROPERTY

ОТВЕТ НА 2

httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml

А ты документацию читать не пробовал

ГДЕ КАРТА БИЛЛИ

ГДЕ КАРТА БИЛЛИ

def key = xdef map = [key treasure]def value = mapget(key)println value

def key = xdef map = [key treasure]def value = mapget(key)println value

ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000

чертей

КАК ЭТО NULL

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ

ЧИНИМ

1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure

ЕЩЕ КАРТЫ БИЛЛИ

ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value

def map = [2 treasure]def key = 2def value = map$keyprintln value

ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку

А СЕЙЧАС ТО-ЧТО

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ

def map = [2 treasure]println mapkeySet()first()classname

javalangInteger

НАМ НУЖНА КАРТА

НАМ НУЖНА КАРТА

def key = xdef map = [$key treasure]def value = map[x]println value

ANoSuchElementExceptionBnullCtreasureDПолундра Startup error

def key = xdef map = [$key treasure]def value = map[x]println value

ЧТО ОПЯТЬ

STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН

def map = [$key treasure]println mapkeySet()first()classname

orgcodehausgroovyruntimeGStringImpl

OUT OF RANGE

AAssertion FailedBfalseCtrueDNullPointerException

OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3

Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()

10 20 30 40 50 60 70 80 90 100

РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ

GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56

ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100

bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно

bullИ пусть делегирует в containsWithinBounds

bullПочините наконец GROOVY-2771

bullThank you

POWER RANGE(RS)

УБИРАЕМ ЕДИНИЧКУ

A -1012345678

C[0 2 3 4 5 6 7 8 9]

D[-1 0 1 2 3 4 5 6 7 8]

[09]each println(it - 1)

B0123456789

[09]each println(it - 1)

Это неправильные скобки

(09)each println(it - 1)

Другое дело

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

[0 2 3 4 5 6 7 8 9]

SAVE THE DATE

JOKERCONF IS COMING

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

JAVA2 КТО ПОМНИТ

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

AStartup FailureB[1 2 3 WED Oct 17

161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException

А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ

ERASURE

ERASURE

А ГДЕ МОИ ПРОВЕРКИ

ВО ВРЕМЯ КОМПИЛЯЦИИ

laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo

ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname

[javalangLong javalangLong javalangLong javautilDate javalangString]

COMPILESTATIC

π ndash ТОРТ И ЧИСЛО

DOUBLE THE PI

double value = 3println $value14isDouble()

A trueB MissingPropertyExceptionC falseDMissingMethodException

ПРОСЁК

ПРОСЁК

ПРОСЁК

A trueB MissingPropertyExceptionC falseDMissingMethodException

DOUBLE THE PI

double value = 3println $value14isDouble()

ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ

ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE

ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP

СПРОСИ ФРАНЦУЗОВ

RSVP

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

A Startup FailureB 1C 2D MissingPropertyException

А ВОТ ПОЧЕМУ

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

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

НАПРИМЕР

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

def invite = new Invite()def attendees = inviteattending +1

НУ ИЛИ УБРАТЬ СКОБКИ

Как убрать скобки

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true

B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false

C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true

D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false

ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ

В КОДЕ MIXINMETACLASS

WHY SO PRIMITIVE

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

A Startup ErrorB int long

booleanC javalangInte

ger javalangLong javalangBoolean

Dint

НУ ЭТО ЯСНО А ПОЧЕМУ

порядокточно непорядок

А ЭТО

(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК

JUMP AKA ПРОПАВШИЕ СЛОВА

>

14863602

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

A Here are the lyrics

B Here are the null

C Startup failureD MissingMethodExcep

tion

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen

public static jump() Here are the $lyrics()

static $static_methodMissing(String name def args) lyrics

println VanHalenjump()

ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП

class VanHalen

public jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println new VanHalen()jump()

>

null

10161629

WHATrsquoS THE METACLASS БАРУХ

def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух

AMissingMethodExceptionBWhats the

orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух

CWhatrsquos the javautilLinkedHashMapXXXXXX Барух

DWhatrsquos the frequency Барух

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

mapgetMetaClass()

ВЫВОДЫ

1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis

- intellij IDEA5 Rtfm6 Donrsquot code like my brother

Мы только начали (надо еще форму придумать)

Засылайте Ваши паззлеры поделки и рисунки

- puzzlers jfrogcom- Groovypuzzlers

ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ

Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch

Вам не поравилосьdevnull

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

РЕШЕНИЕ ИСПОЛЬЗУЙ ANY() ИЛИ ПЕРЕОСМЫСЛИ АЛГОРИТМ

httpkousenitwordpresscom20140418responses-to-the-closure-of-no-return

class Conference def name def year

def gr = new Conference(name Greach year 2014)

greach println it

A class=class Conferencename=Greachyear=2014

B ConferenceXXXXXX

C Startup failure

D Greach 2014

КАКОЙ ЖЕ ЭТО ITERABLE

RTFS (READ THE FING SOURCE)

MAX POWER

MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

A ClassCastExceptionB 9C 56Dnull

РАСКУСИЛ

gtgroovysh ((9 as Character) as Integer)===gt 57

ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max

СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL

A ClassCastExceptionB 9C 56Dnull

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

КАК ЭТО ПОЛУЧИЛОСЬ

def random = new Random()

def randomList = []010each randomList ltlt randomnextInt()

assert randomListmax null == randomList[0]

ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО

ДЕТЕКТИВ

КТО УБИЙЦА

A NullPointerException

B ктоУбийцаI_closure1xxxxxxx

C Startup errorD Мориарти

Closure ктоУбийца() Мориарти println ктоУбийца()

ПИЧАЛЬКА

ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ

Closure ктоУбийца() -gt Мориарти

Closure ктоУбийца() return Мориарти

>

The Final Countdown - fragment

Europe

Top Disco Hits vol 1 track 17

9743676

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9D10

КАК ТАК ТО НУ КАК ТАК ТО

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648

ЛУЧШЕ НЕ СТАЛОhellip

ЧТО ПРОИЗОШЛО

ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

ПОЧИНИЛИclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9

D42

ЭТО ВООБЩЕ КАК

PUBLIC - PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

A publicPropertyproperty

B publicPropertyPublic__property

C publicPropertygetProperty()

D publicPropertyproperty

У МЕНЯ ДВА ВОПРОСА

1Что за дебильное имя

2 Откуда я мог это знать

ОТВЕТ НА 1 IN SOVIET RUSSIA

YOU DONrsquoT ACCESS PUBLIC

PROPERTY

ОТВЕТ НА 2

httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml

А ты документацию читать не пробовал

ГДЕ КАРТА БИЛЛИ

ГДЕ КАРТА БИЛЛИ

def key = xdef map = [key treasure]def value = mapget(key)println value

def key = xdef map = [key treasure]def value = mapget(key)println value

ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000

чертей

КАК ЭТО NULL

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ

ЧИНИМ

1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure

ЕЩЕ КАРТЫ БИЛЛИ

ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value

def map = [2 treasure]def key = 2def value = map$keyprintln value

ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку

А СЕЙЧАС ТО-ЧТО

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ

def map = [2 treasure]println mapkeySet()first()classname

javalangInteger

НАМ НУЖНА КАРТА

НАМ НУЖНА КАРТА

def key = xdef map = [$key treasure]def value = map[x]println value

ANoSuchElementExceptionBnullCtreasureDПолундра Startup error

def key = xdef map = [$key treasure]def value = map[x]println value

ЧТО ОПЯТЬ

STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН

def map = [$key treasure]println mapkeySet()first()classname

orgcodehausgroovyruntimeGStringImpl

OUT OF RANGE

AAssertion FailedBfalseCtrueDNullPointerException

OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3

Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()

10 20 30 40 50 60 70 80 90 100

РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ

GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56

ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100

bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно

bullИ пусть делегирует в containsWithinBounds

bullПочините наконец GROOVY-2771

bullThank you

POWER RANGE(RS)

УБИРАЕМ ЕДИНИЧКУ

A -1012345678

C[0 2 3 4 5 6 7 8 9]

D[-1 0 1 2 3 4 5 6 7 8]

[09]each println(it - 1)

B0123456789

[09]each println(it - 1)

Это неправильные скобки

(09)each println(it - 1)

Другое дело

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

[0 2 3 4 5 6 7 8 9]

SAVE THE DATE

JOKERCONF IS COMING

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

JAVA2 КТО ПОМНИТ

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

AStartup FailureB[1 2 3 WED Oct 17

161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException

А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ

ERASURE

ERASURE

А ГДЕ МОИ ПРОВЕРКИ

ВО ВРЕМЯ КОМПИЛЯЦИИ

laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo

ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname

[javalangLong javalangLong javalangLong javautilDate javalangString]

COMPILESTATIC

π ndash ТОРТ И ЧИСЛО

DOUBLE THE PI

double value = 3println $value14isDouble()

A trueB MissingPropertyExceptionC falseDMissingMethodException

ПРОСЁК

ПРОСЁК

ПРОСЁК

A trueB MissingPropertyExceptionC falseDMissingMethodException

DOUBLE THE PI

double value = 3println $value14isDouble()

ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ

ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE

ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP

СПРОСИ ФРАНЦУЗОВ

RSVP

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

A Startup FailureB 1C 2D MissingPropertyException

А ВОТ ПОЧЕМУ

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

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

НАПРИМЕР

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

def invite = new Invite()def attendees = inviteattending +1

НУ ИЛИ УБРАТЬ СКОБКИ

Как убрать скобки

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true

B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false

C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true

D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false

ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ

В КОДЕ MIXINMETACLASS

WHY SO PRIMITIVE

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

A Startup ErrorB int long

booleanC javalangInte

ger javalangLong javalangBoolean

Dint

НУ ЭТО ЯСНО А ПОЧЕМУ

порядокточно непорядок

А ЭТО

(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК

JUMP AKA ПРОПАВШИЕ СЛОВА

>

14863602

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

A Here are the lyrics

B Here are the null

C Startup failureD MissingMethodExcep

tion

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen

public static jump() Here are the $lyrics()

static $static_methodMissing(String name def args) lyrics

println VanHalenjump()

ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП

class VanHalen

public jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println new VanHalen()jump()

>

null

10161629

WHATrsquoS THE METACLASS БАРУХ

def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух

AMissingMethodExceptionBWhats the

orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух

CWhatrsquos the javautilLinkedHashMapXXXXXX Барух

DWhatrsquos the frequency Барух

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

mapgetMetaClass()

ВЫВОДЫ

1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis

- intellij IDEA5 Rtfm6 Donrsquot code like my brother

Мы только начали (надо еще форму придумать)

Засылайте Ваши паззлеры поделки и рисунки

- puzzlers jfrogcom- Groovypuzzlers

ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ

Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch

Вам не поравилосьdevnull

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

class Conference def name def year

def gr = new Conference(name Greach year 2014)

greach println it

A class=class Conferencename=Greachyear=2014

B ConferenceXXXXXX

C Startup failure

D Greach 2014

КАКОЙ ЖЕ ЭТО ITERABLE

RTFS (READ THE FING SOURCE)

MAX POWER

MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

A ClassCastExceptionB 9C 56Dnull

РАСКУСИЛ

gtgroovysh ((9 as Character) as Integer)===gt 57

ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max

СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL

A ClassCastExceptionB 9C 56Dnull

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

КАК ЭТО ПОЛУЧИЛОСЬ

def random = new Random()

def randomList = []010each randomList ltlt randomnextInt()

assert randomListmax null == randomList[0]

ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО

ДЕТЕКТИВ

КТО УБИЙЦА

A NullPointerException

B ктоУбийцаI_closure1xxxxxxx

C Startup errorD Мориарти

Closure ктоУбийца() Мориарти println ктоУбийца()

ПИЧАЛЬКА

ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ

Closure ктоУбийца() -gt Мориарти

Closure ктоУбийца() return Мориарти

>

The Final Countdown - fragment

Europe

Top Disco Hits vol 1 track 17

9743676

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9D10

КАК ТАК ТО НУ КАК ТАК ТО

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648

ЛУЧШЕ НЕ СТАЛОhellip

ЧТО ПРОИЗОШЛО

ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

ПОЧИНИЛИclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9

D42

ЭТО ВООБЩЕ КАК

PUBLIC - PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

A publicPropertyproperty

B publicPropertyPublic__property

C publicPropertygetProperty()

D publicPropertyproperty

У МЕНЯ ДВА ВОПРОСА

1Что за дебильное имя

2 Откуда я мог это знать

ОТВЕТ НА 1 IN SOVIET RUSSIA

YOU DONrsquoT ACCESS PUBLIC

PROPERTY

ОТВЕТ НА 2

httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml

А ты документацию читать не пробовал

ГДЕ КАРТА БИЛЛИ

ГДЕ КАРТА БИЛЛИ

def key = xdef map = [key treasure]def value = mapget(key)println value

def key = xdef map = [key treasure]def value = mapget(key)println value

ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000

чертей

КАК ЭТО NULL

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ

ЧИНИМ

1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure

ЕЩЕ КАРТЫ БИЛЛИ

ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value

def map = [2 treasure]def key = 2def value = map$keyprintln value

ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку

А СЕЙЧАС ТО-ЧТО

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ

def map = [2 treasure]println mapkeySet()first()classname

javalangInteger

НАМ НУЖНА КАРТА

НАМ НУЖНА КАРТА

def key = xdef map = [$key treasure]def value = map[x]println value

ANoSuchElementExceptionBnullCtreasureDПолундра Startup error

def key = xdef map = [$key treasure]def value = map[x]println value

ЧТО ОПЯТЬ

STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН

def map = [$key treasure]println mapkeySet()first()classname

orgcodehausgroovyruntimeGStringImpl

OUT OF RANGE

AAssertion FailedBfalseCtrueDNullPointerException

OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3

Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()

10 20 30 40 50 60 70 80 90 100

РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ

GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56

ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100

bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно

bullИ пусть делегирует в containsWithinBounds

bullПочините наконец GROOVY-2771

bullThank you

POWER RANGE(RS)

УБИРАЕМ ЕДИНИЧКУ

A -1012345678

C[0 2 3 4 5 6 7 8 9]

D[-1 0 1 2 3 4 5 6 7 8]

[09]each println(it - 1)

B0123456789

[09]each println(it - 1)

Это неправильные скобки

(09)each println(it - 1)

Другое дело

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

[0 2 3 4 5 6 7 8 9]

SAVE THE DATE

JOKERCONF IS COMING

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

JAVA2 КТО ПОМНИТ

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

AStartup FailureB[1 2 3 WED Oct 17

161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException

А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ

ERASURE

ERASURE

А ГДЕ МОИ ПРОВЕРКИ

ВО ВРЕМЯ КОМПИЛЯЦИИ

laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo

ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname

[javalangLong javalangLong javalangLong javautilDate javalangString]

COMPILESTATIC

π ndash ТОРТ И ЧИСЛО

DOUBLE THE PI

double value = 3println $value14isDouble()

A trueB MissingPropertyExceptionC falseDMissingMethodException

ПРОСЁК

ПРОСЁК

ПРОСЁК

A trueB MissingPropertyExceptionC falseDMissingMethodException

DOUBLE THE PI

double value = 3println $value14isDouble()

ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ

ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE

ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP

СПРОСИ ФРАНЦУЗОВ

RSVP

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

A Startup FailureB 1C 2D MissingPropertyException

А ВОТ ПОЧЕМУ

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

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

НАПРИМЕР

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

def invite = new Invite()def attendees = inviteattending +1

НУ ИЛИ УБРАТЬ СКОБКИ

Как убрать скобки

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true

B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false

C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true

D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false

ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ

В КОДЕ MIXINMETACLASS

WHY SO PRIMITIVE

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

A Startup ErrorB int long

booleanC javalangInte

ger javalangLong javalangBoolean

Dint

НУ ЭТО ЯСНО А ПОЧЕМУ

порядокточно непорядок

А ЭТО

(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК

JUMP AKA ПРОПАВШИЕ СЛОВА

>

14863602

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

A Here are the lyrics

B Here are the null

C Startup failureD MissingMethodExcep

tion

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen

public static jump() Here are the $lyrics()

static $static_methodMissing(String name def args) lyrics

println VanHalenjump()

ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП

class VanHalen

public jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println new VanHalen()jump()

>

null

10161629

WHATrsquoS THE METACLASS БАРУХ

def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух

AMissingMethodExceptionBWhats the

orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух

CWhatrsquos the javautilLinkedHashMapXXXXXX Барух

DWhatrsquos the frequency Барух

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

mapgetMetaClass()

ВЫВОДЫ

1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis

- intellij IDEA5 Rtfm6 Donrsquot code like my brother

Мы только начали (надо еще форму придумать)

Засылайте Ваши паззлеры поделки и рисунки

- puzzlers jfrogcom- Groovypuzzlers

ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ

Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch

Вам не поравилосьdevnull

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

КАКОЙ ЖЕ ЭТО ITERABLE

RTFS (READ THE FING SOURCE)

MAX POWER

MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

A ClassCastExceptionB 9C 56Dnull

РАСКУСИЛ

gtgroovysh ((9 as Character) as Integer)===gt 57

ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max

СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL

A ClassCastExceptionB 9C 56Dnull

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

КАК ЭТО ПОЛУЧИЛОСЬ

def random = new Random()

def randomList = []010each randomList ltlt randomnextInt()

assert randomListmax null == randomList[0]

ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО

ДЕТЕКТИВ

КТО УБИЙЦА

A NullPointerException

B ктоУбийцаI_closure1xxxxxxx

C Startup errorD Мориарти

Closure ктоУбийца() Мориарти println ктоУбийца()

ПИЧАЛЬКА

ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ

Closure ктоУбийца() -gt Мориарти

Closure ктоУбийца() return Мориарти

>

The Final Countdown - fragment

Europe

Top Disco Hits vol 1 track 17

9743676

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9D10

КАК ТАК ТО НУ КАК ТАК ТО

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648

ЛУЧШЕ НЕ СТАЛОhellip

ЧТО ПРОИЗОШЛО

ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

ПОЧИНИЛИclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9

D42

ЭТО ВООБЩЕ КАК

PUBLIC - PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

A publicPropertyproperty

B publicPropertyPublic__property

C publicPropertygetProperty()

D publicPropertyproperty

У МЕНЯ ДВА ВОПРОСА

1Что за дебильное имя

2 Откуда я мог это знать

ОТВЕТ НА 1 IN SOVIET RUSSIA

YOU DONrsquoT ACCESS PUBLIC

PROPERTY

ОТВЕТ НА 2

httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml

А ты документацию читать не пробовал

ГДЕ КАРТА БИЛЛИ

ГДЕ КАРТА БИЛЛИ

def key = xdef map = [key treasure]def value = mapget(key)println value

def key = xdef map = [key treasure]def value = mapget(key)println value

ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000

чертей

КАК ЭТО NULL

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ

ЧИНИМ

1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure

ЕЩЕ КАРТЫ БИЛЛИ

ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value

def map = [2 treasure]def key = 2def value = map$keyprintln value

ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку

А СЕЙЧАС ТО-ЧТО

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ

def map = [2 treasure]println mapkeySet()first()classname

javalangInteger

НАМ НУЖНА КАРТА

НАМ НУЖНА КАРТА

def key = xdef map = [$key treasure]def value = map[x]println value

ANoSuchElementExceptionBnullCtreasureDПолундра Startup error

def key = xdef map = [$key treasure]def value = map[x]println value

ЧТО ОПЯТЬ

STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН

def map = [$key treasure]println mapkeySet()first()classname

orgcodehausgroovyruntimeGStringImpl

OUT OF RANGE

AAssertion FailedBfalseCtrueDNullPointerException

OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3

Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()

10 20 30 40 50 60 70 80 90 100

РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ

GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56

ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100

bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно

bullИ пусть делегирует в containsWithinBounds

bullПочините наконец GROOVY-2771

bullThank you

POWER RANGE(RS)

УБИРАЕМ ЕДИНИЧКУ

A -1012345678

C[0 2 3 4 5 6 7 8 9]

D[-1 0 1 2 3 4 5 6 7 8]

[09]each println(it - 1)

B0123456789

[09]each println(it - 1)

Это неправильные скобки

(09)each println(it - 1)

Другое дело

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

[0 2 3 4 5 6 7 8 9]

SAVE THE DATE

JOKERCONF IS COMING

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

JAVA2 КТО ПОМНИТ

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

AStartup FailureB[1 2 3 WED Oct 17

161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException

А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ

ERASURE

ERASURE

А ГДЕ МОИ ПРОВЕРКИ

ВО ВРЕМЯ КОМПИЛЯЦИИ

laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo

ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname

[javalangLong javalangLong javalangLong javautilDate javalangString]

COMPILESTATIC

π ndash ТОРТ И ЧИСЛО

DOUBLE THE PI

double value = 3println $value14isDouble()

A trueB MissingPropertyExceptionC falseDMissingMethodException

ПРОСЁК

ПРОСЁК

ПРОСЁК

A trueB MissingPropertyExceptionC falseDMissingMethodException

DOUBLE THE PI

double value = 3println $value14isDouble()

ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ

ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE

ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP

СПРОСИ ФРАНЦУЗОВ

RSVP

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

A Startup FailureB 1C 2D MissingPropertyException

А ВОТ ПОЧЕМУ

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

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

НАПРИМЕР

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

def invite = new Invite()def attendees = inviteattending +1

НУ ИЛИ УБРАТЬ СКОБКИ

Как убрать скобки

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true

B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false

C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true

D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false

ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ

В КОДЕ MIXINMETACLASS

WHY SO PRIMITIVE

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

A Startup ErrorB int long

booleanC javalangInte

ger javalangLong javalangBoolean

Dint

НУ ЭТО ЯСНО А ПОЧЕМУ

порядокточно непорядок

А ЭТО

(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК

JUMP AKA ПРОПАВШИЕ СЛОВА

>

14863602

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

A Here are the lyrics

B Here are the null

C Startup failureD MissingMethodExcep

tion

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen

public static jump() Here are the $lyrics()

static $static_methodMissing(String name def args) lyrics

println VanHalenjump()

ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП

class VanHalen

public jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println new VanHalen()jump()

>

null

10161629

WHATrsquoS THE METACLASS БАРУХ

def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух

AMissingMethodExceptionBWhats the

orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух

CWhatrsquos the javautilLinkedHashMapXXXXXX Барух

DWhatrsquos the frequency Барух

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

mapgetMetaClass()

ВЫВОДЫ

1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis

- intellij IDEA5 Rtfm6 Donrsquot code like my brother

Мы только начали (надо еще форму придумать)

Засылайте Ваши паззлеры поделки и рисунки

- puzzlers jfrogcom- Groovypuzzlers

ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ

Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch

Вам не поравилосьdevnull

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

RTFS (READ THE FING SOURCE)

MAX POWER

MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

A ClassCastExceptionB 9C 56Dnull

РАСКУСИЛ

gtgroovysh ((9 as Character) as Integer)===gt 57

ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max

СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL

A ClassCastExceptionB 9C 56Dnull

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

КАК ЭТО ПОЛУЧИЛОСЬ

def random = new Random()

def randomList = []010each randomList ltlt randomnextInt()

assert randomListmax null == randomList[0]

ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО

ДЕТЕКТИВ

КТО УБИЙЦА

A NullPointerException

B ктоУбийцаI_closure1xxxxxxx

C Startup errorD Мориарти

Closure ктоУбийца() Мориарти println ктоУбийца()

ПИЧАЛЬКА

ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ

Closure ктоУбийца() -gt Мориарти

Closure ктоУбийца() return Мориарти

>

The Final Countdown - fragment

Europe

Top Disco Hits vol 1 track 17

9743676

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9D10

КАК ТАК ТО НУ КАК ТАК ТО

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648

ЛУЧШЕ НЕ СТАЛОhellip

ЧТО ПРОИЗОШЛО

ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

ПОЧИНИЛИclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9

D42

ЭТО ВООБЩЕ КАК

PUBLIC - PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

A publicPropertyproperty

B publicPropertyPublic__property

C publicPropertygetProperty()

D publicPropertyproperty

У МЕНЯ ДВА ВОПРОСА

1Что за дебильное имя

2 Откуда я мог это знать

ОТВЕТ НА 1 IN SOVIET RUSSIA

YOU DONrsquoT ACCESS PUBLIC

PROPERTY

ОТВЕТ НА 2

httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml

А ты документацию читать не пробовал

ГДЕ КАРТА БИЛЛИ

ГДЕ КАРТА БИЛЛИ

def key = xdef map = [key treasure]def value = mapget(key)println value

def key = xdef map = [key treasure]def value = mapget(key)println value

ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000

чертей

КАК ЭТО NULL

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ

ЧИНИМ

1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure

ЕЩЕ КАРТЫ БИЛЛИ

ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value

def map = [2 treasure]def key = 2def value = map$keyprintln value

ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку

А СЕЙЧАС ТО-ЧТО

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ

def map = [2 treasure]println mapkeySet()first()classname

javalangInteger

НАМ НУЖНА КАРТА

НАМ НУЖНА КАРТА

def key = xdef map = [$key treasure]def value = map[x]println value

ANoSuchElementExceptionBnullCtreasureDПолундра Startup error

def key = xdef map = [$key treasure]def value = map[x]println value

ЧТО ОПЯТЬ

STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН

def map = [$key treasure]println mapkeySet()first()classname

orgcodehausgroovyruntimeGStringImpl

OUT OF RANGE

AAssertion FailedBfalseCtrueDNullPointerException

OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3

Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()

10 20 30 40 50 60 70 80 90 100

РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ

GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56

ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100

bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно

bullИ пусть делегирует в containsWithinBounds

bullПочините наконец GROOVY-2771

bullThank you

POWER RANGE(RS)

УБИРАЕМ ЕДИНИЧКУ

A -1012345678

C[0 2 3 4 5 6 7 8 9]

D[-1 0 1 2 3 4 5 6 7 8]

[09]each println(it - 1)

B0123456789

[09]each println(it - 1)

Это неправильные скобки

(09)each println(it - 1)

Другое дело

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

[0 2 3 4 5 6 7 8 9]

SAVE THE DATE

JOKERCONF IS COMING

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

JAVA2 КТО ПОМНИТ

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

AStartup FailureB[1 2 3 WED Oct 17

161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException

А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ

ERASURE

ERASURE

А ГДЕ МОИ ПРОВЕРКИ

ВО ВРЕМЯ КОМПИЛЯЦИИ

laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo

ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname

[javalangLong javalangLong javalangLong javautilDate javalangString]

COMPILESTATIC

π ndash ТОРТ И ЧИСЛО

DOUBLE THE PI

double value = 3println $value14isDouble()

A trueB MissingPropertyExceptionC falseDMissingMethodException

ПРОСЁК

ПРОСЁК

ПРОСЁК

A trueB MissingPropertyExceptionC falseDMissingMethodException

DOUBLE THE PI

double value = 3println $value14isDouble()

ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ

ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE

ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP

СПРОСИ ФРАНЦУЗОВ

RSVP

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

A Startup FailureB 1C 2D MissingPropertyException

А ВОТ ПОЧЕМУ

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

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

НАПРИМЕР

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

def invite = new Invite()def attendees = inviteattending +1

НУ ИЛИ УБРАТЬ СКОБКИ

Как убрать скобки

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true

B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false

C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true

D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false

ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ

В КОДЕ MIXINMETACLASS

WHY SO PRIMITIVE

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

A Startup ErrorB int long

booleanC javalangInte

ger javalangLong javalangBoolean

Dint

НУ ЭТО ЯСНО А ПОЧЕМУ

порядокточно непорядок

А ЭТО

(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК

JUMP AKA ПРОПАВШИЕ СЛОВА

>

14863602

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

A Here are the lyrics

B Here are the null

C Startup failureD MissingMethodExcep

tion

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen

public static jump() Here are the $lyrics()

static $static_methodMissing(String name def args) lyrics

println VanHalenjump()

ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП

class VanHalen

public jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println new VanHalen()jump()

>

null

10161629

WHATrsquoS THE METACLASS БАРУХ

def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух

AMissingMethodExceptionBWhats the

orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух

CWhatrsquos the javautilLinkedHashMapXXXXXX Барух

DWhatrsquos the frequency Барух

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

mapgetMetaClass()

ВЫВОДЫ

1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis

- intellij IDEA5 Rtfm6 Donrsquot code like my brother

Мы только начали (надо еще форму придумать)

Засылайте Ваши паззлеры поделки и рисунки

- puzzlers jfrogcom- Groovypuzzlers

ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ

Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch

Вам не поравилосьdevnull

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

MAX POWER

MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

A ClassCastExceptionB 9C 56Dnull

РАСКУСИЛ

gtgroovysh ((9 as Character) as Integer)===gt 57

ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max

СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL

A ClassCastExceptionB 9C 56Dnull

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

КАК ЭТО ПОЛУЧИЛОСЬ

def random = new Random()

def randomList = []010each randomList ltlt randomnextInt()

assert randomListmax null == randomList[0]

ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО

ДЕТЕКТИВ

КТО УБИЙЦА

A NullPointerException

B ктоУбийцаI_closure1xxxxxxx

C Startup errorD Мориарти

Closure ктоУбийца() Мориарти println ктоУбийца()

ПИЧАЛЬКА

ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ

Closure ктоУбийца() -gt Мориарти

Closure ктоУбийца() return Мориарти

>

The Final Countdown - fragment

Europe

Top Disco Hits vol 1 track 17

9743676

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9D10

КАК ТАК ТО НУ КАК ТАК ТО

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648

ЛУЧШЕ НЕ СТАЛОhellip

ЧТО ПРОИЗОШЛО

ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

ПОЧИНИЛИclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9

D42

ЭТО ВООБЩЕ КАК

PUBLIC - PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

A publicPropertyproperty

B publicPropertyPublic__property

C publicPropertygetProperty()

D publicPropertyproperty

У МЕНЯ ДВА ВОПРОСА

1Что за дебильное имя

2 Откуда я мог это знать

ОТВЕТ НА 1 IN SOVIET RUSSIA

YOU DONrsquoT ACCESS PUBLIC

PROPERTY

ОТВЕТ НА 2

httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml

А ты документацию читать не пробовал

ГДЕ КАРТА БИЛЛИ

ГДЕ КАРТА БИЛЛИ

def key = xdef map = [key treasure]def value = mapget(key)println value

def key = xdef map = [key treasure]def value = mapget(key)println value

ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000

чертей

КАК ЭТО NULL

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ

ЧИНИМ

1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure

ЕЩЕ КАРТЫ БИЛЛИ

ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value

def map = [2 treasure]def key = 2def value = map$keyprintln value

ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку

А СЕЙЧАС ТО-ЧТО

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ

def map = [2 treasure]println mapkeySet()first()classname

javalangInteger

НАМ НУЖНА КАРТА

НАМ НУЖНА КАРТА

def key = xdef map = [$key treasure]def value = map[x]println value

ANoSuchElementExceptionBnullCtreasureDПолундра Startup error

def key = xdef map = [$key treasure]def value = map[x]println value

ЧТО ОПЯТЬ

STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН

def map = [$key treasure]println mapkeySet()first()classname

orgcodehausgroovyruntimeGStringImpl

OUT OF RANGE

AAssertion FailedBfalseCtrueDNullPointerException

OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3

Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()

10 20 30 40 50 60 70 80 90 100

РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ

GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56

ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100

bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно

bullИ пусть делегирует в containsWithinBounds

bullПочините наконец GROOVY-2771

bullThank you

POWER RANGE(RS)

УБИРАЕМ ЕДИНИЧКУ

A -1012345678

C[0 2 3 4 5 6 7 8 9]

D[-1 0 1 2 3 4 5 6 7 8]

[09]each println(it - 1)

B0123456789

[09]each println(it - 1)

Это неправильные скобки

(09)each println(it - 1)

Другое дело

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

[0 2 3 4 5 6 7 8 9]

SAVE THE DATE

JOKERCONF IS COMING

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

JAVA2 КТО ПОМНИТ

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

AStartup FailureB[1 2 3 WED Oct 17

161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException

А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ

ERASURE

ERASURE

А ГДЕ МОИ ПРОВЕРКИ

ВО ВРЕМЯ КОМПИЛЯЦИИ

laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo

ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname

[javalangLong javalangLong javalangLong javautilDate javalangString]

COMPILESTATIC

π ndash ТОРТ И ЧИСЛО

DOUBLE THE PI

double value = 3println $value14isDouble()

A trueB MissingPropertyExceptionC falseDMissingMethodException

ПРОСЁК

ПРОСЁК

ПРОСЁК

A trueB MissingPropertyExceptionC falseDMissingMethodException

DOUBLE THE PI

double value = 3println $value14isDouble()

ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ

ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE

ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP

СПРОСИ ФРАНЦУЗОВ

RSVP

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

A Startup FailureB 1C 2D MissingPropertyException

А ВОТ ПОЧЕМУ

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

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

НАПРИМЕР

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

def invite = new Invite()def attendees = inviteattending +1

НУ ИЛИ УБРАТЬ СКОБКИ

Как убрать скобки

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true

B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false

C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true

D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false

ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ

В КОДЕ MIXINMETACLASS

WHY SO PRIMITIVE

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

A Startup ErrorB int long

booleanC javalangInte

ger javalangLong javalangBoolean

Dint

НУ ЭТО ЯСНО А ПОЧЕМУ

порядокточно непорядок

А ЭТО

(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК

JUMP AKA ПРОПАВШИЕ СЛОВА

>

14863602

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

A Here are the lyrics

B Here are the null

C Startup failureD MissingMethodExcep

tion

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen

public static jump() Here are the $lyrics()

static $static_methodMissing(String name def args) lyrics

println VanHalenjump()

ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП

class VanHalen

public jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println new VanHalen()jump()

>

null

10161629

WHATrsquoS THE METACLASS БАРУХ

def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух

AMissingMethodExceptionBWhats the

orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух

CWhatrsquos the javautilLinkedHashMapXXXXXX Барух

DWhatrsquos the frequency Барух

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

mapgetMetaClass()

ВЫВОДЫ

1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis

- intellij IDEA5 Rtfm6 Donrsquot code like my brother

Мы только начали (надо еще форму придумать)

Засылайте Ваши паззлеры поделки и рисунки

- puzzlers jfrogcom- Groovypuzzlers

ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ

Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch

Вам не поравилосьdevnull

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

MAX POWERListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

A ClassCastExceptionB 9C 56Dnull

РАСКУСИЛ

gtgroovysh ((9 as Character) as Integer)===gt 57

ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max

СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL

A ClassCastExceptionB 9C 56Dnull

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

КАК ЭТО ПОЛУЧИЛОСЬ

def random = new Random()

def randomList = []010each randomList ltlt randomnextInt()

assert randomListmax null == randomList[0]

ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО

ДЕТЕКТИВ

КТО УБИЙЦА

A NullPointerException

B ктоУбийцаI_closure1xxxxxxx

C Startup errorD Мориарти

Closure ктоУбийца() Мориарти println ктоУбийца()

ПИЧАЛЬКА

ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ

Closure ктоУбийца() -gt Мориарти

Closure ктоУбийца() return Мориарти

>

The Final Countdown - fragment

Europe

Top Disco Hits vol 1 track 17

9743676

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9D10

КАК ТАК ТО НУ КАК ТАК ТО

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648

ЛУЧШЕ НЕ СТАЛОhellip

ЧТО ПРОИЗОШЛО

ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

ПОЧИНИЛИclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9

D42

ЭТО ВООБЩЕ КАК

PUBLIC - PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

A publicPropertyproperty

B publicPropertyPublic__property

C publicPropertygetProperty()

D publicPropertyproperty

У МЕНЯ ДВА ВОПРОСА

1Что за дебильное имя

2 Откуда я мог это знать

ОТВЕТ НА 1 IN SOVIET RUSSIA

YOU DONrsquoT ACCESS PUBLIC

PROPERTY

ОТВЕТ НА 2

httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml

А ты документацию читать не пробовал

ГДЕ КАРТА БИЛЛИ

ГДЕ КАРТА БИЛЛИ

def key = xdef map = [key treasure]def value = mapget(key)println value

def key = xdef map = [key treasure]def value = mapget(key)println value

ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000

чертей

КАК ЭТО NULL

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ

ЧИНИМ

1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure

ЕЩЕ КАРТЫ БИЛЛИ

ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value

def map = [2 treasure]def key = 2def value = map$keyprintln value

ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку

А СЕЙЧАС ТО-ЧТО

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ

def map = [2 treasure]println mapkeySet()first()classname

javalangInteger

НАМ НУЖНА КАРТА

НАМ НУЖНА КАРТА

def key = xdef map = [$key treasure]def value = map[x]println value

ANoSuchElementExceptionBnullCtreasureDПолундра Startup error

def key = xdef map = [$key treasure]def value = map[x]println value

ЧТО ОПЯТЬ

STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН

def map = [$key treasure]println mapkeySet()first()classname

orgcodehausgroovyruntimeGStringImpl

OUT OF RANGE

AAssertion FailedBfalseCtrueDNullPointerException

OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3

Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()

10 20 30 40 50 60 70 80 90 100

РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ

GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56

ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100

bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно

bullИ пусть делегирует в containsWithinBounds

bullПочините наконец GROOVY-2771

bullThank you

POWER RANGE(RS)

УБИРАЕМ ЕДИНИЧКУ

A -1012345678

C[0 2 3 4 5 6 7 8 9]

D[-1 0 1 2 3 4 5 6 7 8]

[09]each println(it - 1)

B0123456789

[09]each println(it - 1)

Это неправильные скобки

(09)each println(it - 1)

Другое дело

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

[0 2 3 4 5 6 7 8 9]

SAVE THE DATE

JOKERCONF IS COMING

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

JAVA2 КТО ПОМНИТ

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

AStartup FailureB[1 2 3 WED Oct 17

161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException

А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ

ERASURE

ERASURE

А ГДЕ МОИ ПРОВЕРКИ

ВО ВРЕМЯ КОМПИЛЯЦИИ

laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo

ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname

[javalangLong javalangLong javalangLong javautilDate javalangString]

COMPILESTATIC

π ndash ТОРТ И ЧИСЛО

DOUBLE THE PI

double value = 3println $value14isDouble()

A trueB MissingPropertyExceptionC falseDMissingMethodException

ПРОСЁК

ПРОСЁК

ПРОСЁК

A trueB MissingPropertyExceptionC falseDMissingMethodException

DOUBLE THE PI

double value = 3println $value14isDouble()

ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ

ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE

ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP

СПРОСИ ФРАНЦУЗОВ

RSVP

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

A Startup FailureB 1C 2D MissingPropertyException

А ВОТ ПОЧЕМУ

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

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

НАПРИМЕР

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

def invite = new Invite()def attendees = inviteattending +1

НУ ИЛИ УБРАТЬ СКОБКИ

Как убрать скобки

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true

B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false

C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true

D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false

ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ

В КОДЕ MIXINMETACLASS

WHY SO PRIMITIVE

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

A Startup ErrorB int long

booleanC javalangInte

ger javalangLong javalangBoolean

Dint

НУ ЭТО ЯСНО А ПОЧЕМУ

порядокточно непорядок

А ЭТО

(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК

JUMP AKA ПРОПАВШИЕ СЛОВА

>

14863602

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

A Here are the lyrics

B Here are the null

C Startup failureD MissingMethodExcep

tion

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen

public static jump() Here are the $lyrics()

static $static_methodMissing(String name def args) lyrics

println VanHalenjump()

ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП

class VanHalen

public jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println new VanHalen()jump()

>

null

10161629

WHATrsquoS THE METACLASS БАРУХ

def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух

AMissingMethodExceptionBWhats the

orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух

CWhatrsquos the javautilLinkedHashMapXXXXXX Барух

DWhatrsquos the frequency Барух

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

mapgetMetaClass()

ВЫВОДЫ

1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis

- intellij IDEA5 Rtfm6 Donrsquot code like my brother

Мы только начали (надо еще форму придумать)

Засылайте Ваши паззлеры поделки и рисунки

- puzzlers jfrogcom- Groovypuzzlers

ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ

Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch

Вам не поравилосьdevnull

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

A ClassCastExceptionB 9C 56Dnull

РАСКУСИЛ

gtgroovysh ((9 as Character) as Integer)===gt 57

ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max

СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL

A ClassCastExceptionB 9C 56Dnull

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

КАК ЭТО ПОЛУЧИЛОСЬ

def random = new Random()

def randomList = []010each randomList ltlt randomnextInt()

assert randomListmax null == randomList[0]

ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО

ДЕТЕКТИВ

КТО УБИЙЦА

A NullPointerException

B ктоУбийцаI_closure1xxxxxxx

C Startup errorD Мориарти

Closure ктоУбийца() Мориарти println ктоУбийца()

ПИЧАЛЬКА

ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ

Closure ктоУбийца() -gt Мориарти

Closure ктоУбийца() return Мориарти

>

The Final Countdown - fragment

Europe

Top Disco Hits vol 1 track 17

9743676

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9D10

КАК ТАК ТО НУ КАК ТАК ТО

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648

ЛУЧШЕ НЕ СТАЛОhellip

ЧТО ПРОИЗОШЛО

ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

ПОЧИНИЛИclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9

D42

ЭТО ВООБЩЕ КАК

PUBLIC - PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

A publicPropertyproperty

B publicPropertyPublic__property

C publicPropertygetProperty()

D publicPropertyproperty

У МЕНЯ ДВА ВОПРОСА

1Что за дебильное имя

2 Откуда я мог это знать

ОТВЕТ НА 1 IN SOVIET RUSSIA

YOU DONrsquoT ACCESS PUBLIC

PROPERTY

ОТВЕТ НА 2

httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml

А ты документацию читать не пробовал

ГДЕ КАРТА БИЛЛИ

ГДЕ КАРТА БИЛЛИ

def key = xdef map = [key treasure]def value = mapget(key)println value

def key = xdef map = [key treasure]def value = mapget(key)println value

ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000

чертей

КАК ЭТО NULL

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ

ЧИНИМ

1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure

ЕЩЕ КАРТЫ БИЛЛИ

ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value

def map = [2 treasure]def key = 2def value = map$keyprintln value

ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку

А СЕЙЧАС ТО-ЧТО

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ

def map = [2 treasure]println mapkeySet()first()classname

javalangInteger

НАМ НУЖНА КАРТА

НАМ НУЖНА КАРТА

def key = xdef map = [$key treasure]def value = map[x]println value

ANoSuchElementExceptionBnullCtreasureDПолундра Startup error

def key = xdef map = [$key treasure]def value = map[x]println value

ЧТО ОПЯТЬ

STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН

def map = [$key treasure]println mapkeySet()first()classname

orgcodehausgroovyruntimeGStringImpl

OUT OF RANGE

AAssertion FailedBfalseCtrueDNullPointerException

OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3

Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()

10 20 30 40 50 60 70 80 90 100

РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ

GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56

ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100

bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно

bullИ пусть делегирует в containsWithinBounds

bullПочините наконец GROOVY-2771

bullThank you

POWER RANGE(RS)

УБИРАЕМ ЕДИНИЧКУ

A -1012345678

C[0 2 3 4 5 6 7 8 9]

D[-1 0 1 2 3 4 5 6 7 8]

[09]each println(it - 1)

B0123456789

[09]each println(it - 1)

Это неправильные скобки

(09)each println(it - 1)

Другое дело

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

[0 2 3 4 5 6 7 8 9]

SAVE THE DATE

JOKERCONF IS COMING

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

JAVA2 КТО ПОМНИТ

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

AStartup FailureB[1 2 3 WED Oct 17

161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException

А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ

ERASURE

ERASURE

А ГДЕ МОИ ПРОВЕРКИ

ВО ВРЕМЯ КОМПИЛЯЦИИ

laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo

ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname

[javalangLong javalangLong javalangLong javautilDate javalangString]

COMPILESTATIC

π ndash ТОРТ И ЧИСЛО

DOUBLE THE PI

double value = 3println $value14isDouble()

A trueB MissingPropertyExceptionC falseDMissingMethodException

ПРОСЁК

ПРОСЁК

ПРОСЁК

A trueB MissingPropertyExceptionC falseDMissingMethodException

DOUBLE THE PI

double value = 3println $value14isDouble()

ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ

ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE

ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP

СПРОСИ ФРАНЦУЗОВ

RSVP

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

A Startup FailureB 1C 2D MissingPropertyException

А ВОТ ПОЧЕМУ

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

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

НАПРИМЕР

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

def invite = new Invite()def attendees = inviteattending +1

НУ ИЛИ УБРАТЬ СКОБКИ

Как убрать скобки

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true

B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false

C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true

D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false

ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ

В КОДЕ MIXINMETACLASS

WHY SO PRIMITIVE

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

A Startup ErrorB int long

booleanC javalangInte

ger javalangLong javalangBoolean

Dint

НУ ЭТО ЯСНО А ПОЧЕМУ

порядокточно непорядок

А ЭТО

(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК

JUMP AKA ПРОПАВШИЕ СЛОВА

>

14863602

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

A Here are the lyrics

B Here are the null

C Startup failureD MissingMethodExcep

tion

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen

public static jump() Here are the $lyrics()

static $static_methodMissing(String name def args) lyrics

println VanHalenjump()

ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП

class VanHalen

public jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println new VanHalen()jump()

>

null

10161629

WHATrsquoS THE METACLASS БАРУХ

def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух

AMissingMethodExceptionBWhats the

orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух

CWhatrsquos the javautilLinkedHashMapXXXXXX Барух

DWhatrsquos the frequency Барух

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

mapgetMetaClass()

ВЫВОДЫ

1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis

- intellij IDEA5 Rtfm6 Donrsquot code like my brother

Мы только начали (надо еще форму придумать)

Засылайте Ваши паззлеры поделки и рисунки

- puzzlers jfrogcom- Groovypuzzlers

ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ

Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch

Вам не поравилосьdevnull

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

РАСКУСИЛ

gtgroovysh ((9 as Character) as Integer)===gt 57

ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max

СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL

A ClassCastExceptionB 9C 56Dnull

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

КАК ЭТО ПОЛУЧИЛОСЬ

def random = new Random()

def randomList = []010each randomList ltlt randomnextInt()

assert randomListmax null == randomList[0]

ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО

ДЕТЕКТИВ

КТО УБИЙЦА

A NullPointerException

B ктоУбийцаI_closure1xxxxxxx

C Startup errorD Мориарти

Closure ктоУбийца() Мориарти println ктоУбийца()

ПИЧАЛЬКА

ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ

Closure ктоУбийца() -gt Мориарти

Closure ктоУбийца() return Мориарти

>

The Final Countdown - fragment

Europe

Top Disco Hits vol 1 track 17

9743676

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9D10

КАК ТАК ТО НУ КАК ТАК ТО

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648

ЛУЧШЕ НЕ СТАЛОhellip

ЧТО ПРОИЗОШЛО

ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

ПОЧИНИЛИclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9

D42

ЭТО ВООБЩЕ КАК

PUBLIC - PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

A publicPropertyproperty

B publicPropertyPublic__property

C publicPropertygetProperty()

D publicPropertyproperty

У МЕНЯ ДВА ВОПРОСА

1Что за дебильное имя

2 Откуда я мог это знать

ОТВЕТ НА 1 IN SOVIET RUSSIA

YOU DONrsquoT ACCESS PUBLIC

PROPERTY

ОТВЕТ НА 2

httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml

А ты документацию читать не пробовал

ГДЕ КАРТА БИЛЛИ

ГДЕ КАРТА БИЛЛИ

def key = xdef map = [key treasure]def value = mapget(key)println value

def key = xdef map = [key treasure]def value = mapget(key)println value

ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000

чертей

КАК ЭТО NULL

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ

ЧИНИМ

1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure

ЕЩЕ КАРТЫ БИЛЛИ

ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value

def map = [2 treasure]def key = 2def value = map$keyprintln value

ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку

А СЕЙЧАС ТО-ЧТО

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ

def map = [2 treasure]println mapkeySet()first()classname

javalangInteger

НАМ НУЖНА КАРТА

НАМ НУЖНА КАРТА

def key = xdef map = [$key treasure]def value = map[x]println value

ANoSuchElementExceptionBnullCtreasureDПолундра Startup error

def key = xdef map = [$key treasure]def value = map[x]println value

ЧТО ОПЯТЬ

STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН

def map = [$key treasure]println mapkeySet()first()classname

orgcodehausgroovyruntimeGStringImpl

OUT OF RANGE

AAssertion FailedBfalseCtrueDNullPointerException

OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3

Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()

10 20 30 40 50 60 70 80 90 100

РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ

GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56

ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100

bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно

bullИ пусть делегирует в containsWithinBounds

bullПочините наконец GROOVY-2771

bullThank you

POWER RANGE(RS)

УБИРАЕМ ЕДИНИЧКУ

A -1012345678

C[0 2 3 4 5 6 7 8 9]

D[-1 0 1 2 3 4 5 6 7 8]

[09]each println(it - 1)

B0123456789

[09]each println(it - 1)

Это неправильные скобки

(09)each println(it - 1)

Другое дело

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

[0 2 3 4 5 6 7 8 9]

SAVE THE DATE

JOKERCONF IS COMING

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

JAVA2 КТО ПОМНИТ

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

AStartup FailureB[1 2 3 WED Oct 17

161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException

А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ

ERASURE

ERASURE

А ГДЕ МОИ ПРОВЕРКИ

ВО ВРЕМЯ КОМПИЛЯЦИИ

laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo

ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname

[javalangLong javalangLong javalangLong javautilDate javalangString]

COMPILESTATIC

π ndash ТОРТ И ЧИСЛО

DOUBLE THE PI

double value = 3println $value14isDouble()

A trueB MissingPropertyExceptionC falseDMissingMethodException

ПРОСЁК

ПРОСЁК

ПРОСЁК

A trueB MissingPropertyExceptionC falseDMissingMethodException

DOUBLE THE PI

double value = 3println $value14isDouble()

ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ

ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE

ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP

СПРОСИ ФРАНЦУЗОВ

RSVP

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

A Startup FailureB 1C 2D MissingPropertyException

А ВОТ ПОЧЕМУ

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

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

НАПРИМЕР

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

def invite = new Invite()def attendees = inviteattending +1

НУ ИЛИ УБРАТЬ СКОБКИ

Как убрать скобки

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true

B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false

C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true

D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false

ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ

В КОДЕ MIXINMETACLASS

WHY SO PRIMITIVE

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

A Startup ErrorB int long

booleanC javalangInte

ger javalangLong javalangBoolean

Dint

НУ ЭТО ЯСНО А ПОЧЕМУ

порядокточно непорядок

А ЭТО

(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК

JUMP AKA ПРОПАВШИЕ СЛОВА

>

14863602

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

A Here are the lyrics

B Here are the null

C Startup failureD MissingMethodExcep

tion

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen

public static jump() Here are the $lyrics()

static $static_methodMissing(String name def args) lyrics

println VanHalenjump()

ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП

class VanHalen

public jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println new VanHalen()jump()

>

null

10161629

WHATrsquoS THE METACLASS БАРУХ

def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух

AMissingMethodExceptionBWhats the

orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух

CWhatrsquos the javautilLinkedHashMapXXXXXX Барух

DWhatrsquos the frequency Барух

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

mapgetMetaClass()

ВЫВОДЫ

1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis

- intellij IDEA5 Rtfm6 Donrsquot code like my brother

Мы только начали (надо еще форму придумать)

Засылайте Ваши паззлеры поделки и рисунки

- puzzlers jfrogcom- Groovypuzzlers

ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ

Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch

Вам не поравилосьdevnull

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ListltIntegergt list = [56 57 74]def max = listmax item -gt (item lt 50) item nullprintln max

СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL

A ClassCastExceptionB 9C 56Dnull

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

КАК ЭТО ПОЛУЧИЛОСЬ

def random = new Random()

def randomList = []010each randomList ltlt randomnextInt()

assert randomListmax null == randomList[0]

ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО

ДЕТЕКТИВ

КТО УБИЙЦА

A NullPointerException

B ктоУбийцаI_closure1xxxxxxx

C Startup errorD Мориарти

Closure ктоУбийца() Мориарти println ктоУбийца()

ПИЧАЛЬКА

ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ

Closure ктоУбийца() -gt Мориарти

Closure ктоУбийца() return Мориарти

>

The Final Countdown - fragment

Europe

Top Disco Hits vol 1 track 17

9743676

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9D10

КАК ТАК ТО НУ КАК ТАК ТО

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648

ЛУЧШЕ НЕ СТАЛОhellip

ЧТО ПРОИЗОШЛО

ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

ПОЧИНИЛИclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9

D42

ЭТО ВООБЩЕ КАК

PUBLIC - PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

A publicPropertyproperty

B publicPropertyPublic__property

C publicPropertygetProperty()

D publicPropertyproperty

У МЕНЯ ДВА ВОПРОСА

1Что за дебильное имя

2 Откуда я мог это знать

ОТВЕТ НА 1 IN SOVIET RUSSIA

YOU DONrsquoT ACCESS PUBLIC

PROPERTY

ОТВЕТ НА 2

httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml

А ты документацию читать не пробовал

ГДЕ КАРТА БИЛЛИ

ГДЕ КАРТА БИЛЛИ

def key = xdef map = [key treasure]def value = mapget(key)println value

def key = xdef map = [key treasure]def value = mapget(key)println value

ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000

чертей

КАК ЭТО NULL

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ

ЧИНИМ

1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure

ЕЩЕ КАРТЫ БИЛЛИ

ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value

def map = [2 treasure]def key = 2def value = map$keyprintln value

ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку

А СЕЙЧАС ТО-ЧТО

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ

def map = [2 treasure]println mapkeySet()first()classname

javalangInteger

НАМ НУЖНА КАРТА

НАМ НУЖНА КАРТА

def key = xdef map = [$key treasure]def value = map[x]println value

ANoSuchElementExceptionBnullCtreasureDПолундра Startup error

def key = xdef map = [$key treasure]def value = map[x]println value

ЧТО ОПЯТЬ

STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН

def map = [$key treasure]println mapkeySet()first()classname

orgcodehausgroovyruntimeGStringImpl

OUT OF RANGE

AAssertion FailedBfalseCtrueDNullPointerException

OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3

Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()

10 20 30 40 50 60 70 80 90 100

РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ

GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56

ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100

bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно

bullИ пусть делегирует в containsWithinBounds

bullПочините наконец GROOVY-2771

bullThank you

POWER RANGE(RS)

УБИРАЕМ ЕДИНИЧКУ

A -1012345678

C[0 2 3 4 5 6 7 8 9]

D[-1 0 1 2 3 4 5 6 7 8]

[09]each println(it - 1)

B0123456789

[09]each println(it - 1)

Это неправильные скобки

(09)each println(it - 1)

Другое дело

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

[0 2 3 4 5 6 7 8 9]

SAVE THE DATE

JOKERCONF IS COMING

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

JAVA2 КТО ПОМНИТ

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

AStartup FailureB[1 2 3 WED Oct 17

161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException

А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ

ERASURE

ERASURE

А ГДЕ МОИ ПРОВЕРКИ

ВО ВРЕМЯ КОМПИЛЯЦИИ

laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo

ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname

[javalangLong javalangLong javalangLong javautilDate javalangString]

COMPILESTATIC

π ndash ТОРТ И ЧИСЛО

DOUBLE THE PI

double value = 3println $value14isDouble()

A trueB MissingPropertyExceptionC falseDMissingMethodException

ПРОСЁК

ПРОСЁК

ПРОСЁК

A trueB MissingPropertyExceptionC falseDMissingMethodException

DOUBLE THE PI

double value = 3println $value14isDouble()

ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ

ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE

ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP

СПРОСИ ФРАНЦУЗОВ

RSVP

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

A Startup FailureB 1C 2D MissingPropertyException

А ВОТ ПОЧЕМУ

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

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

НАПРИМЕР

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

def invite = new Invite()def attendees = inviteattending +1

НУ ИЛИ УБРАТЬ СКОБКИ

Как убрать скобки

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true

B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false

C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true

D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false

ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ

В КОДЕ MIXINMETACLASS

WHY SO PRIMITIVE

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

A Startup ErrorB int long

booleanC javalangInte

ger javalangLong javalangBoolean

Dint

НУ ЭТО ЯСНО А ПОЧЕМУ

порядокточно непорядок

А ЭТО

(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК

JUMP AKA ПРОПАВШИЕ СЛОВА

>

14863602

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

A Here are the lyrics

B Here are the null

C Startup failureD MissingMethodExcep

tion

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen

public static jump() Here are the $lyrics()

static $static_methodMissing(String name def args) lyrics

println VanHalenjump()

ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП

class VanHalen

public jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println new VanHalen()jump()

>

null

10161629

WHATrsquoS THE METACLASS БАРУХ

def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух

AMissingMethodExceptionBWhats the

orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух

CWhatrsquos the javautilLinkedHashMapXXXXXX Барух

DWhatrsquos the frequency Барух

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

mapgetMetaClass()

ВЫВОДЫ

1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis

- intellij IDEA5 Rtfm6 Donrsquot code like my brother

Мы только начали (надо еще форму придумать)

Засылайте Ваши паззлеры поделки и рисунки

- puzzlers jfrogcom- Groovypuzzlers

ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ

Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch

Вам не поравилосьdevnull

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

СЕКУНДОЧКУ ТЕПЕРЬ ОНИ ВСЕ NULL

A ClassCastExceptionB 9C 56Dnull

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

КАК ЭТО ПОЛУЧИЛОСЬ

def random = new Random()

def randomList = []010each randomList ltlt randomnextInt()

assert randomListmax null == randomList[0]

ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО

ДЕТЕКТИВ

КТО УБИЙЦА

A NullPointerException

B ктоУбийцаI_closure1xxxxxxx

C Startup errorD Мориарти

Closure ктоУбийца() Мориарти println ктоУбийца()

ПИЧАЛЬКА

ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ

Closure ктоУбийца() -gt Мориарти

Closure ктоУбийца() return Мориарти

>

The Final Countdown - fragment

Europe

Top Disco Hits vol 1 track 17

9743676

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9D10

КАК ТАК ТО НУ КАК ТАК ТО

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648

ЛУЧШЕ НЕ СТАЛОhellip

ЧТО ПРОИЗОШЛО

ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

ПОЧИНИЛИclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9

D42

ЭТО ВООБЩЕ КАК

PUBLIC - PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

A publicPropertyproperty

B publicPropertyPublic__property

C publicPropertygetProperty()

D publicPropertyproperty

У МЕНЯ ДВА ВОПРОСА

1Что за дебильное имя

2 Откуда я мог это знать

ОТВЕТ НА 1 IN SOVIET RUSSIA

YOU DONrsquoT ACCESS PUBLIC

PROPERTY

ОТВЕТ НА 2

httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml

А ты документацию читать не пробовал

ГДЕ КАРТА БИЛЛИ

ГДЕ КАРТА БИЛЛИ

def key = xdef map = [key treasure]def value = mapget(key)println value

def key = xdef map = [key treasure]def value = mapget(key)println value

ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000

чертей

КАК ЭТО NULL

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ

ЧИНИМ

1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure

ЕЩЕ КАРТЫ БИЛЛИ

ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value

def map = [2 treasure]def key = 2def value = map$keyprintln value

ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку

А СЕЙЧАС ТО-ЧТО

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ

def map = [2 treasure]println mapkeySet()first()classname

javalangInteger

НАМ НУЖНА КАРТА

НАМ НУЖНА КАРТА

def key = xdef map = [$key treasure]def value = map[x]println value

ANoSuchElementExceptionBnullCtreasureDПолундра Startup error

def key = xdef map = [$key treasure]def value = map[x]println value

ЧТО ОПЯТЬ

STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН

def map = [$key treasure]println mapkeySet()first()classname

orgcodehausgroovyruntimeGStringImpl

OUT OF RANGE

AAssertion FailedBfalseCtrueDNullPointerException

OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3

Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()

10 20 30 40 50 60 70 80 90 100

РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ

GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56

ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100

bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно

bullИ пусть делегирует в containsWithinBounds

bullПочините наконец GROOVY-2771

bullThank you

POWER RANGE(RS)

УБИРАЕМ ЕДИНИЧКУ

A -1012345678

C[0 2 3 4 5 6 7 8 9]

D[-1 0 1 2 3 4 5 6 7 8]

[09]each println(it - 1)

B0123456789

[09]each println(it - 1)

Это неправильные скобки

(09)each println(it - 1)

Другое дело

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

[0 2 3 4 5 6 7 8 9]

SAVE THE DATE

JOKERCONF IS COMING

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

JAVA2 КТО ПОМНИТ

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

AStartup FailureB[1 2 3 WED Oct 17

161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException

А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ

ERASURE

ERASURE

А ГДЕ МОИ ПРОВЕРКИ

ВО ВРЕМЯ КОМПИЛЯЦИИ

laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo

ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname

[javalangLong javalangLong javalangLong javautilDate javalangString]

COMPILESTATIC

π ndash ТОРТ И ЧИСЛО

DOUBLE THE PI

double value = 3println $value14isDouble()

A trueB MissingPropertyExceptionC falseDMissingMethodException

ПРОСЁК

ПРОСЁК

ПРОСЁК

A trueB MissingPropertyExceptionC falseDMissingMethodException

DOUBLE THE PI

double value = 3println $value14isDouble()

ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ

ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE

ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP

СПРОСИ ФРАНЦУЗОВ

RSVP

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

A Startup FailureB 1C 2D MissingPropertyException

А ВОТ ПОЧЕМУ

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

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

НАПРИМЕР

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

def invite = new Invite()def attendees = inviteattending +1

НУ ИЛИ УБРАТЬ СКОБКИ

Как убрать скобки

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true

B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false

C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true

D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false

ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ

В КОДЕ MIXINMETACLASS

WHY SO PRIMITIVE

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

A Startup ErrorB int long

booleanC javalangInte

ger javalangLong javalangBoolean

Dint

НУ ЭТО ЯСНО А ПОЧЕМУ

порядокточно непорядок

А ЭТО

(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК

JUMP AKA ПРОПАВШИЕ СЛОВА

>

14863602

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

A Here are the lyrics

B Here are the null

C Startup failureD MissingMethodExcep

tion

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen

public static jump() Here are the $lyrics()

static $static_methodMissing(String name def args) lyrics

println VanHalenjump()

ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП

class VanHalen

public jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println new VanHalen()jump()

>

null

10161629

WHATrsquoS THE METACLASS БАРУХ

def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух

AMissingMethodExceptionBWhats the

orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух

CWhatrsquos the javautilLinkedHashMapXXXXXX Барух

DWhatrsquos the frequency Барух

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

mapgetMetaClass()

ВЫВОДЫ

1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis

- intellij IDEA5 Rtfm6 Donrsquot code like my brother

Мы только начали (надо еще форму придумать)

Засылайте Ваши паззлеры поделки и рисунки

- puzzlers jfrogcom- Groovypuzzlers

ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ

Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch

Вам не поравилосьdevnull

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

A ClassCastExceptionB 9C 56Dnull

ListltIntegergt list = [56 9 74]def max = listmax item -gt (item lt 50) item nullprintln max

КАК ЭТО ПОЛУЧИЛОСЬ

def random = new Random()

def randomList = []010each randomList ltlt randomnextInt()

assert randomListmax null == randomList[0]

ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО

ДЕТЕКТИВ

КТО УБИЙЦА

A NullPointerException

B ктоУбийцаI_closure1xxxxxxx

C Startup errorD Мориарти

Closure ктоУбийца() Мориарти println ктоУбийца()

ПИЧАЛЬКА

ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ

Closure ктоУбийца() -gt Мориарти

Closure ктоУбийца() return Мориарти

>

The Final Countdown - fragment

Europe

Top Disco Hits vol 1 track 17

9743676

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9D10

КАК ТАК ТО НУ КАК ТАК ТО

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648

ЛУЧШЕ НЕ СТАЛОhellip

ЧТО ПРОИЗОШЛО

ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

ПОЧИНИЛИclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9

D42

ЭТО ВООБЩЕ КАК

PUBLIC - PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

A publicPropertyproperty

B publicPropertyPublic__property

C publicPropertygetProperty()

D publicPropertyproperty

У МЕНЯ ДВА ВОПРОСА

1Что за дебильное имя

2 Откуда я мог это знать

ОТВЕТ НА 1 IN SOVIET RUSSIA

YOU DONrsquoT ACCESS PUBLIC

PROPERTY

ОТВЕТ НА 2

httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml

А ты документацию читать не пробовал

ГДЕ КАРТА БИЛЛИ

ГДЕ КАРТА БИЛЛИ

def key = xdef map = [key treasure]def value = mapget(key)println value

def key = xdef map = [key treasure]def value = mapget(key)println value

ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000

чертей

КАК ЭТО NULL

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ

ЧИНИМ

1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure

ЕЩЕ КАРТЫ БИЛЛИ

ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value

def map = [2 treasure]def key = 2def value = map$keyprintln value

ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку

А СЕЙЧАС ТО-ЧТО

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ

def map = [2 treasure]println mapkeySet()first()classname

javalangInteger

НАМ НУЖНА КАРТА

НАМ НУЖНА КАРТА

def key = xdef map = [$key treasure]def value = map[x]println value

ANoSuchElementExceptionBnullCtreasureDПолундра Startup error

def key = xdef map = [$key treasure]def value = map[x]println value

ЧТО ОПЯТЬ

STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН

def map = [$key treasure]println mapkeySet()first()classname

orgcodehausgroovyruntimeGStringImpl

OUT OF RANGE

AAssertion FailedBfalseCtrueDNullPointerException

OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3

Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()

10 20 30 40 50 60 70 80 90 100

РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ

GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56

ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100

bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно

bullИ пусть делегирует в containsWithinBounds

bullПочините наконец GROOVY-2771

bullThank you

POWER RANGE(RS)

УБИРАЕМ ЕДИНИЧКУ

A -1012345678

C[0 2 3 4 5 6 7 8 9]

D[-1 0 1 2 3 4 5 6 7 8]

[09]each println(it - 1)

B0123456789

[09]each println(it - 1)

Это неправильные скобки

(09)each println(it - 1)

Другое дело

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

[0 2 3 4 5 6 7 8 9]

SAVE THE DATE

JOKERCONF IS COMING

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

JAVA2 КТО ПОМНИТ

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

AStartup FailureB[1 2 3 WED Oct 17

161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException

А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ

ERASURE

ERASURE

А ГДЕ МОИ ПРОВЕРКИ

ВО ВРЕМЯ КОМПИЛЯЦИИ

laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo

ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname

[javalangLong javalangLong javalangLong javautilDate javalangString]

COMPILESTATIC

π ndash ТОРТ И ЧИСЛО

DOUBLE THE PI

double value = 3println $value14isDouble()

A trueB MissingPropertyExceptionC falseDMissingMethodException

ПРОСЁК

ПРОСЁК

ПРОСЁК

A trueB MissingPropertyExceptionC falseDMissingMethodException

DOUBLE THE PI

double value = 3println $value14isDouble()

ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ

ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE

ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP

СПРОСИ ФРАНЦУЗОВ

RSVP

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

A Startup FailureB 1C 2D MissingPropertyException

А ВОТ ПОЧЕМУ

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

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

НАПРИМЕР

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

def invite = new Invite()def attendees = inviteattending +1

НУ ИЛИ УБРАТЬ СКОБКИ

Как убрать скобки

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true

B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false

C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true

D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false

ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ

В КОДЕ MIXINMETACLASS

WHY SO PRIMITIVE

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

A Startup ErrorB int long

booleanC javalangInte

ger javalangLong javalangBoolean

Dint

НУ ЭТО ЯСНО А ПОЧЕМУ

порядокточно непорядок

А ЭТО

(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК

JUMP AKA ПРОПАВШИЕ СЛОВА

>

14863602

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

A Here are the lyrics

B Here are the null

C Startup failureD MissingMethodExcep

tion

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen

public static jump() Here are the $lyrics()

static $static_methodMissing(String name def args) lyrics

println VanHalenjump()

ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП

class VanHalen

public jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println new VanHalen()jump()

>

null

10161629

WHATrsquoS THE METACLASS БАРУХ

def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух

AMissingMethodExceptionBWhats the

orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух

CWhatrsquos the javautilLinkedHashMapXXXXXX Барух

DWhatrsquos the frequency Барух

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

mapgetMetaClass()

ВЫВОДЫ

1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis

- intellij IDEA5 Rtfm6 Donrsquot code like my brother

Мы только начали (надо еще форму придумать)

Засылайте Ваши паззлеры поделки и рисунки

- puzzlers jfrogcom- Groovypuzzlers

ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ

Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch

Вам не поравилосьdevnull

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

КАК ЭТО ПОЛУЧИЛОСЬ

def random = new Random()

def randomList = []010each randomList ltlt randomnextInt()

assert randomListmax null == randomList[0]

ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО

ДЕТЕКТИВ

КТО УБИЙЦА

A NullPointerException

B ктоУбийцаI_closure1xxxxxxx

C Startup errorD Мориарти

Closure ктоУбийца() Мориарти println ктоУбийца()

ПИЧАЛЬКА

ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ

Closure ктоУбийца() -gt Мориарти

Closure ктоУбийца() return Мориарти

>

The Final Countdown - fragment

Europe

Top Disco Hits vol 1 track 17

9743676

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9D10

КАК ТАК ТО НУ КАК ТАК ТО

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648

ЛУЧШЕ НЕ СТАЛОhellip

ЧТО ПРОИЗОШЛО

ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

ПОЧИНИЛИclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9

D42

ЭТО ВООБЩЕ КАК

PUBLIC - PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

A publicPropertyproperty

B publicPropertyPublic__property

C publicPropertygetProperty()

D publicPropertyproperty

У МЕНЯ ДВА ВОПРОСА

1Что за дебильное имя

2 Откуда я мог это знать

ОТВЕТ НА 1 IN SOVIET RUSSIA

YOU DONrsquoT ACCESS PUBLIC

PROPERTY

ОТВЕТ НА 2

httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml

А ты документацию читать не пробовал

ГДЕ КАРТА БИЛЛИ

ГДЕ КАРТА БИЛЛИ

def key = xdef map = [key treasure]def value = mapget(key)println value

def key = xdef map = [key treasure]def value = mapget(key)println value

ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000

чертей

КАК ЭТО NULL

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ

ЧИНИМ

1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure

ЕЩЕ КАРТЫ БИЛЛИ

ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value

def map = [2 treasure]def key = 2def value = map$keyprintln value

ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку

А СЕЙЧАС ТО-ЧТО

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ

def map = [2 treasure]println mapkeySet()first()classname

javalangInteger

НАМ НУЖНА КАРТА

НАМ НУЖНА КАРТА

def key = xdef map = [$key treasure]def value = map[x]println value

ANoSuchElementExceptionBnullCtreasureDПолундра Startup error

def key = xdef map = [$key treasure]def value = map[x]println value

ЧТО ОПЯТЬ

STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН

def map = [$key treasure]println mapkeySet()first()classname

orgcodehausgroovyruntimeGStringImpl

OUT OF RANGE

AAssertion FailedBfalseCtrueDNullPointerException

OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3

Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()

10 20 30 40 50 60 70 80 90 100

РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ

GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56

ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100

bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно

bullИ пусть делегирует в containsWithinBounds

bullПочините наконец GROOVY-2771

bullThank you

POWER RANGE(RS)

УБИРАЕМ ЕДИНИЧКУ

A -1012345678

C[0 2 3 4 5 6 7 8 9]

D[-1 0 1 2 3 4 5 6 7 8]

[09]each println(it - 1)

B0123456789

[09]each println(it - 1)

Это неправильные скобки

(09)each println(it - 1)

Другое дело

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

[0 2 3 4 5 6 7 8 9]

SAVE THE DATE

JOKERCONF IS COMING

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

JAVA2 КТО ПОМНИТ

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

AStartup FailureB[1 2 3 WED Oct 17

161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException

А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ

ERASURE

ERASURE

А ГДЕ МОИ ПРОВЕРКИ

ВО ВРЕМЯ КОМПИЛЯЦИИ

laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo

ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname

[javalangLong javalangLong javalangLong javautilDate javalangString]

COMPILESTATIC

π ndash ТОРТ И ЧИСЛО

DOUBLE THE PI

double value = 3println $value14isDouble()

A trueB MissingPropertyExceptionC falseDMissingMethodException

ПРОСЁК

ПРОСЁК

ПРОСЁК

A trueB MissingPropertyExceptionC falseDMissingMethodException

DOUBLE THE PI

double value = 3println $value14isDouble()

ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ

ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE

ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP

СПРОСИ ФРАНЦУЗОВ

RSVP

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

A Startup FailureB 1C 2D MissingPropertyException

А ВОТ ПОЧЕМУ

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

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

НАПРИМЕР

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

def invite = new Invite()def attendees = inviteattending +1

НУ ИЛИ УБРАТЬ СКОБКИ

Как убрать скобки

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true

B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false

C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true

D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false

ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ

В КОДЕ MIXINMETACLASS

WHY SO PRIMITIVE

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

A Startup ErrorB int long

booleanC javalangInte

ger javalangLong javalangBoolean

Dint

НУ ЭТО ЯСНО А ПОЧЕМУ

порядокточно непорядок

А ЭТО

(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК

JUMP AKA ПРОПАВШИЕ СЛОВА

>

14863602

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

A Here are the lyrics

B Here are the null

C Startup failureD MissingMethodExcep

tion

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen

public static jump() Here are the $lyrics()

static $static_methodMissing(String name def args) lyrics

println VanHalenjump()

ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП

class VanHalen

public jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println new VanHalen()jump()

>

null

10161629

WHATrsquoS THE METACLASS БАРУХ

def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух

AMissingMethodExceptionBWhats the

orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух

CWhatrsquos the javautilLinkedHashMapXXXXXX Барух

DWhatrsquos the frequency Барух

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

mapgetMetaClass()

ВЫВОДЫ

1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis

- intellij IDEA5 Rtfm6 Donrsquot code like my brother

Мы только начали (надо еще форму придумать)

Засылайте Ваши паззлеры поделки и рисунки

- puzzlers jfrogcom- Groovypuzzlers

ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ

Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch

Вам не поравилосьdevnull

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ПЛОХОЕ ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ НИГДЕ НЕ ОПИСАНО

ДЕТЕКТИВ

КТО УБИЙЦА

A NullPointerException

B ктоУбийцаI_closure1xxxxxxx

C Startup errorD Мориарти

Closure ктоУбийца() Мориарти println ктоУбийца()

ПИЧАЛЬКА

ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ

Closure ктоУбийца() -gt Мориарти

Closure ктоУбийца() return Мориарти

>

The Final Countdown - fragment

Europe

Top Disco Hits vol 1 track 17

9743676

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9D10

КАК ТАК ТО НУ КАК ТАК ТО

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648

ЛУЧШЕ НЕ СТАЛОhellip

ЧТО ПРОИЗОШЛО

ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

ПОЧИНИЛИclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9

D42

ЭТО ВООБЩЕ КАК

PUBLIC - PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

A publicPropertyproperty

B publicPropertyPublic__property

C publicPropertygetProperty()

D publicPropertyproperty

У МЕНЯ ДВА ВОПРОСА

1Что за дебильное имя

2 Откуда я мог это знать

ОТВЕТ НА 1 IN SOVIET RUSSIA

YOU DONrsquoT ACCESS PUBLIC

PROPERTY

ОТВЕТ НА 2

httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml

А ты документацию читать не пробовал

ГДЕ КАРТА БИЛЛИ

ГДЕ КАРТА БИЛЛИ

def key = xdef map = [key treasure]def value = mapget(key)println value

def key = xdef map = [key treasure]def value = mapget(key)println value

ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000

чертей

КАК ЭТО NULL

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ

ЧИНИМ

1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure

ЕЩЕ КАРТЫ БИЛЛИ

ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value

def map = [2 treasure]def key = 2def value = map$keyprintln value

ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку

А СЕЙЧАС ТО-ЧТО

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ

def map = [2 treasure]println mapkeySet()first()classname

javalangInteger

НАМ НУЖНА КАРТА

НАМ НУЖНА КАРТА

def key = xdef map = [$key treasure]def value = map[x]println value

ANoSuchElementExceptionBnullCtreasureDПолундра Startup error

def key = xdef map = [$key treasure]def value = map[x]println value

ЧТО ОПЯТЬ

STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН

def map = [$key treasure]println mapkeySet()first()classname

orgcodehausgroovyruntimeGStringImpl

OUT OF RANGE

AAssertion FailedBfalseCtrueDNullPointerException

OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3

Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()

10 20 30 40 50 60 70 80 90 100

РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ

GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56

ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100

bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно

bullИ пусть делегирует в containsWithinBounds

bullПочините наконец GROOVY-2771

bullThank you

POWER RANGE(RS)

УБИРАЕМ ЕДИНИЧКУ

A -1012345678

C[0 2 3 4 5 6 7 8 9]

D[-1 0 1 2 3 4 5 6 7 8]

[09]each println(it - 1)

B0123456789

[09]each println(it - 1)

Это неправильные скобки

(09)each println(it - 1)

Другое дело

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

[0 2 3 4 5 6 7 8 9]

SAVE THE DATE

JOKERCONF IS COMING

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

JAVA2 КТО ПОМНИТ

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

AStartup FailureB[1 2 3 WED Oct 17

161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException

А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ

ERASURE

ERASURE

А ГДЕ МОИ ПРОВЕРКИ

ВО ВРЕМЯ КОМПИЛЯЦИИ

laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo

ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname

[javalangLong javalangLong javalangLong javautilDate javalangString]

COMPILESTATIC

π ndash ТОРТ И ЧИСЛО

DOUBLE THE PI

double value = 3println $value14isDouble()

A trueB MissingPropertyExceptionC falseDMissingMethodException

ПРОСЁК

ПРОСЁК

ПРОСЁК

A trueB MissingPropertyExceptionC falseDMissingMethodException

DOUBLE THE PI

double value = 3println $value14isDouble()

ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ

ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE

ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP

СПРОСИ ФРАНЦУЗОВ

RSVP

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

A Startup FailureB 1C 2D MissingPropertyException

А ВОТ ПОЧЕМУ

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

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

НАПРИМЕР

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

def invite = new Invite()def attendees = inviteattending +1

НУ ИЛИ УБРАТЬ СКОБКИ

Как убрать скобки

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true

B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false

C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true

D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false

ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ

В КОДЕ MIXINMETACLASS

WHY SO PRIMITIVE

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

A Startup ErrorB int long

booleanC javalangInte

ger javalangLong javalangBoolean

Dint

НУ ЭТО ЯСНО А ПОЧЕМУ

порядокточно непорядок

А ЭТО

(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК

JUMP AKA ПРОПАВШИЕ СЛОВА

>

14863602

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

A Here are the lyrics

B Here are the null

C Startup failureD MissingMethodExcep

tion

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen

public static jump() Here are the $lyrics()

static $static_methodMissing(String name def args) lyrics

println VanHalenjump()

ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП

class VanHalen

public jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println new VanHalen()jump()

>

null

10161629

WHATrsquoS THE METACLASS БАРУХ

def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух

AMissingMethodExceptionBWhats the

orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух

CWhatrsquos the javautilLinkedHashMapXXXXXX Барух

DWhatrsquos the frequency Барух

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

mapgetMetaClass()

ВЫВОДЫ

1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis

- intellij IDEA5 Rtfm6 Donrsquot code like my brother

Мы только начали (надо еще форму придумать)

Засылайте Ваши паззлеры поделки и рисунки

- puzzlers jfrogcom- Groovypuzzlers

ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ

Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch

Вам не поравилосьdevnull

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ДЕТЕКТИВ

КТО УБИЙЦА

A NullPointerException

B ктоУбийцаI_closure1xxxxxxx

C Startup errorD Мориарти

Closure ктоУбийца() Мориарти println ктоУбийца()

ПИЧАЛЬКА

ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ

Closure ктоУбийца() -gt Мориарти

Closure ктоУбийца() return Мориарти

>

The Final Countdown - fragment

Europe

Top Disco Hits vol 1 track 17

9743676

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9D10

КАК ТАК ТО НУ КАК ТАК ТО

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648

ЛУЧШЕ НЕ СТАЛОhellip

ЧТО ПРОИЗОШЛО

ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

ПОЧИНИЛИclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9

D42

ЭТО ВООБЩЕ КАК

PUBLIC - PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

A publicPropertyproperty

B publicPropertyPublic__property

C publicPropertygetProperty()

D publicPropertyproperty

У МЕНЯ ДВА ВОПРОСА

1Что за дебильное имя

2 Откуда я мог это знать

ОТВЕТ НА 1 IN SOVIET RUSSIA

YOU DONrsquoT ACCESS PUBLIC

PROPERTY

ОТВЕТ НА 2

httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml

А ты документацию читать не пробовал

ГДЕ КАРТА БИЛЛИ

ГДЕ КАРТА БИЛЛИ

def key = xdef map = [key treasure]def value = mapget(key)println value

def key = xdef map = [key treasure]def value = mapget(key)println value

ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000

чертей

КАК ЭТО NULL

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ

ЧИНИМ

1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure

ЕЩЕ КАРТЫ БИЛЛИ

ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value

def map = [2 treasure]def key = 2def value = map$keyprintln value

ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку

А СЕЙЧАС ТО-ЧТО

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ

def map = [2 treasure]println mapkeySet()first()classname

javalangInteger

НАМ НУЖНА КАРТА

НАМ НУЖНА КАРТА

def key = xdef map = [$key treasure]def value = map[x]println value

ANoSuchElementExceptionBnullCtreasureDПолундра Startup error

def key = xdef map = [$key treasure]def value = map[x]println value

ЧТО ОПЯТЬ

STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН

def map = [$key treasure]println mapkeySet()first()classname

orgcodehausgroovyruntimeGStringImpl

OUT OF RANGE

AAssertion FailedBfalseCtrueDNullPointerException

OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3

Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()

10 20 30 40 50 60 70 80 90 100

РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ

GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56

ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100

bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно

bullИ пусть делегирует в containsWithinBounds

bullПочините наконец GROOVY-2771

bullThank you

POWER RANGE(RS)

УБИРАЕМ ЕДИНИЧКУ

A -1012345678

C[0 2 3 4 5 6 7 8 9]

D[-1 0 1 2 3 4 5 6 7 8]

[09]each println(it - 1)

B0123456789

[09]each println(it - 1)

Это неправильные скобки

(09)each println(it - 1)

Другое дело

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

[0 2 3 4 5 6 7 8 9]

SAVE THE DATE

JOKERCONF IS COMING

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

JAVA2 КТО ПОМНИТ

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

AStartup FailureB[1 2 3 WED Oct 17

161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException

А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ

ERASURE

ERASURE

А ГДЕ МОИ ПРОВЕРКИ

ВО ВРЕМЯ КОМПИЛЯЦИИ

laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo

ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname

[javalangLong javalangLong javalangLong javautilDate javalangString]

COMPILESTATIC

π ndash ТОРТ И ЧИСЛО

DOUBLE THE PI

double value = 3println $value14isDouble()

A trueB MissingPropertyExceptionC falseDMissingMethodException

ПРОСЁК

ПРОСЁК

ПРОСЁК

A trueB MissingPropertyExceptionC falseDMissingMethodException

DOUBLE THE PI

double value = 3println $value14isDouble()

ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ

ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE

ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP

СПРОСИ ФРАНЦУЗОВ

RSVP

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

A Startup FailureB 1C 2D MissingPropertyException

А ВОТ ПОЧЕМУ

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

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

НАПРИМЕР

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

def invite = new Invite()def attendees = inviteattending +1

НУ ИЛИ УБРАТЬ СКОБКИ

Как убрать скобки

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true

B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false

C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true

D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false

ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ

В КОДЕ MIXINMETACLASS

WHY SO PRIMITIVE

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

A Startup ErrorB int long

booleanC javalangInte

ger javalangLong javalangBoolean

Dint

НУ ЭТО ЯСНО А ПОЧЕМУ

порядокточно непорядок

А ЭТО

(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК

JUMP AKA ПРОПАВШИЕ СЛОВА

>

14863602

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

A Here are the lyrics

B Here are the null

C Startup failureD MissingMethodExcep

tion

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen

public static jump() Here are the $lyrics()

static $static_methodMissing(String name def args) lyrics

println VanHalenjump()

ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП

class VanHalen

public jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println new VanHalen()jump()

>

null

10161629

WHATrsquoS THE METACLASS БАРУХ

def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух

AMissingMethodExceptionBWhats the

orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух

CWhatrsquos the javautilLinkedHashMapXXXXXX Барух

DWhatrsquos the frequency Барух

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

mapgetMetaClass()

ВЫВОДЫ

1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis

- intellij IDEA5 Rtfm6 Donrsquot code like my brother

Мы только начали (надо еще форму придумать)

Засылайте Ваши паззлеры поделки и рисунки

- puzzlers jfrogcom- Groovypuzzlers

ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ

Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch

Вам не поравилосьdevnull

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

КТО УБИЙЦА

A NullPointerException

B ктоУбийцаI_closure1xxxxxxx

C Startup errorD Мориарти

Closure ктоУбийца() Мориарти println ктоУбийца()

ПИЧАЛЬКА

ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ

Closure ктоУбийца() -gt Мориарти

Closure ктоУбийца() return Мориарти

>

The Final Countdown - fragment

Europe

Top Disco Hits vol 1 track 17

9743676

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9D10

КАК ТАК ТО НУ КАК ТАК ТО

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648

ЛУЧШЕ НЕ СТАЛОhellip

ЧТО ПРОИЗОШЛО

ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

ПОЧИНИЛИclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9

D42

ЭТО ВООБЩЕ КАК

PUBLIC - PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

A publicPropertyproperty

B publicPropertyPublic__property

C publicPropertygetProperty()

D publicPropertyproperty

У МЕНЯ ДВА ВОПРОСА

1Что за дебильное имя

2 Откуда я мог это знать

ОТВЕТ НА 1 IN SOVIET RUSSIA

YOU DONrsquoT ACCESS PUBLIC

PROPERTY

ОТВЕТ НА 2

httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml

А ты документацию читать не пробовал

ГДЕ КАРТА БИЛЛИ

ГДЕ КАРТА БИЛЛИ

def key = xdef map = [key treasure]def value = mapget(key)println value

def key = xdef map = [key treasure]def value = mapget(key)println value

ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000

чертей

КАК ЭТО NULL

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ

ЧИНИМ

1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure

ЕЩЕ КАРТЫ БИЛЛИ

ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value

def map = [2 treasure]def key = 2def value = map$keyprintln value

ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку

А СЕЙЧАС ТО-ЧТО

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ

def map = [2 treasure]println mapkeySet()first()classname

javalangInteger

НАМ НУЖНА КАРТА

НАМ НУЖНА КАРТА

def key = xdef map = [$key treasure]def value = map[x]println value

ANoSuchElementExceptionBnullCtreasureDПолундра Startup error

def key = xdef map = [$key treasure]def value = map[x]println value

ЧТО ОПЯТЬ

STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН

def map = [$key treasure]println mapkeySet()first()classname

orgcodehausgroovyruntimeGStringImpl

OUT OF RANGE

AAssertion FailedBfalseCtrueDNullPointerException

OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3

Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()

10 20 30 40 50 60 70 80 90 100

РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ

GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56

ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100

bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно

bullИ пусть делегирует в containsWithinBounds

bullПочините наконец GROOVY-2771

bullThank you

POWER RANGE(RS)

УБИРАЕМ ЕДИНИЧКУ

A -1012345678

C[0 2 3 4 5 6 7 8 9]

D[-1 0 1 2 3 4 5 6 7 8]

[09]each println(it - 1)

B0123456789

[09]each println(it - 1)

Это неправильные скобки

(09)each println(it - 1)

Другое дело

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

[0 2 3 4 5 6 7 8 9]

SAVE THE DATE

JOKERCONF IS COMING

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

JAVA2 КТО ПОМНИТ

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

AStartup FailureB[1 2 3 WED Oct 17

161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException

А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ

ERASURE

ERASURE

А ГДЕ МОИ ПРОВЕРКИ

ВО ВРЕМЯ КОМПИЛЯЦИИ

laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo

ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname

[javalangLong javalangLong javalangLong javautilDate javalangString]

COMPILESTATIC

π ndash ТОРТ И ЧИСЛО

DOUBLE THE PI

double value = 3println $value14isDouble()

A trueB MissingPropertyExceptionC falseDMissingMethodException

ПРОСЁК

ПРОСЁК

ПРОСЁК

A trueB MissingPropertyExceptionC falseDMissingMethodException

DOUBLE THE PI

double value = 3println $value14isDouble()

ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ

ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE

ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP

СПРОСИ ФРАНЦУЗОВ

RSVP

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

A Startup FailureB 1C 2D MissingPropertyException

А ВОТ ПОЧЕМУ

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

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

НАПРИМЕР

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

def invite = new Invite()def attendees = inviteattending +1

НУ ИЛИ УБРАТЬ СКОБКИ

Как убрать скобки

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true

B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false

C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true

D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false

ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ

В КОДЕ MIXINMETACLASS

WHY SO PRIMITIVE

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

A Startup ErrorB int long

booleanC javalangInte

ger javalangLong javalangBoolean

Dint

НУ ЭТО ЯСНО А ПОЧЕМУ

порядокточно непорядок

А ЭТО

(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК

JUMP AKA ПРОПАВШИЕ СЛОВА

>

14863602

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

A Here are the lyrics

B Here are the null

C Startup failureD MissingMethodExcep

tion

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen

public static jump() Here are the $lyrics()

static $static_methodMissing(String name def args) lyrics

println VanHalenjump()

ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП

class VanHalen

public jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println new VanHalen()jump()

>

null

10161629

WHATrsquoS THE METACLASS БАРУХ

def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух

AMissingMethodExceptionBWhats the

orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух

CWhatrsquos the javautilLinkedHashMapXXXXXX Барух

DWhatrsquos the frequency Барух

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

mapgetMetaClass()

ВЫВОДЫ

1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis

- intellij IDEA5 Rtfm6 Donrsquot code like my brother

Мы только начали (надо еще форму придумать)

Засылайте Ваши паззлеры поделки и рисунки

- puzzlers jfrogcom- Groovypuzzlers

ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ

Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch

Вам не поравилосьdevnull

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ПИЧАЛЬКА

ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ

Closure ктоУбийца() -gt Мориарти

Closure ктоУбийца() return Мориарти

>

The Final Countdown - fragment

Europe

Top Disco Hits vol 1 track 17

9743676

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9D10

КАК ТАК ТО НУ КАК ТАК ТО

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648

ЛУЧШЕ НЕ СТАЛОhellip

ЧТО ПРОИЗОШЛО

ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

ПОЧИНИЛИclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9

D42

ЭТО ВООБЩЕ КАК

PUBLIC - PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

A publicPropertyproperty

B publicPropertyPublic__property

C publicPropertygetProperty()

D publicPropertyproperty

У МЕНЯ ДВА ВОПРОСА

1Что за дебильное имя

2 Откуда я мог это знать

ОТВЕТ НА 1 IN SOVIET RUSSIA

YOU DONrsquoT ACCESS PUBLIC

PROPERTY

ОТВЕТ НА 2

httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml

А ты документацию читать не пробовал

ГДЕ КАРТА БИЛЛИ

ГДЕ КАРТА БИЛЛИ

def key = xdef map = [key treasure]def value = mapget(key)println value

def key = xdef map = [key treasure]def value = mapget(key)println value

ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000

чертей

КАК ЭТО NULL

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ

ЧИНИМ

1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure

ЕЩЕ КАРТЫ БИЛЛИ

ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value

def map = [2 treasure]def key = 2def value = map$keyprintln value

ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку

А СЕЙЧАС ТО-ЧТО

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ

def map = [2 treasure]println mapkeySet()first()classname

javalangInteger

НАМ НУЖНА КАРТА

НАМ НУЖНА КАРТА

def key = xdef map = [$key treasure]def value = map[x]println value

ANoSuchElementExceptionBnullCtreasureDПолундра Startup error

def key = xdef map = [$key treasure]def value = map[x]println value

ЧТО ОПЯТЬ

STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН

def map = [$key treasure]println mapkeySet()first()classname

orgcodehausgroovyruntimeGStringImpl

OUT OF RANGE

AAssertion FailedBfalseCtrueDNullPointerException

OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3

Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()

10 20 30 40 50 60 70 80 90 100

РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ

GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56

ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100

bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно

bullИ пусть делегирует в containsWithinBounds

bullПочините наконец GROOVY-2771

bullThank you

POWER RANGE(RS)

УБИРАЕМ ЕДИНИЧКУ

A -1012345678

C[0 2 3 4 5 6 7 8 9]

D[-1 0 1 2 3 4 5 6 7 8]

[09]each println(it - 1)

B0123456789

[09]each println(it - 1)

Это неправильные скобки

(09)each println(it - 1)

Другое дело

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

[0 2 3 4 5 6 7 8 9]

SAVE THE DATE

JOKERCONF IS COMING

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

JAVA2 КТО ПОМНИТ

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

AStartup FailureB[1 2 3 WED Oct 17

161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException

А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ

ERASURE

ERASURE

А ГДЕ МОИ ПРОВЕРКИ

ВО ВРЕМЯ КОМПИЛЯЦИИ

laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo

ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname

[javalangLong javalangLong javalangLong javautilDate javalangString]

COMPILESTATIC

π ndash ТОРТ И ЧИСЛО

DOUBLE THE PI

double value = 3println $value14isDouble()

A trueB MissingPropertyExceptionC falseDMissingMethodException

ПРОСЁК

ПРОСЁК

ПРОСЁК

A trueB MissingPropertyExceptionC falseDMissingMethodException

DOUBLE THE PI

double value = 3println $value14isDouble()

ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ

ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE

ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP

СПРОСИ ФРАНЦУЗОВ

RSVP

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

A Startup FailureB 1C 2D MissingPropertyException

А ВОТ ПОЧЕМУ

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

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

НАПРИМЕР

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

def invite = new Invite()def attendees = inviteattending +1

НУ ИЛИ УБРАТЬ СКОБКИ

Как убрать скобки

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true

B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false

C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true

D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false

ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ

В КОДЕ MIXINMETACLASS

WHY SO PRIMITIVE

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

A Startup ErrorB int long

booleanC javalangInte

ger javalangLong javalangBoolean

Dint

НУ ЭТО ЯСНО А ПОЧЕМУ

порядокточно непорядок

А ЭТО

(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК

JUMP AKA ПРОПАВШИЕ СЛОВА

>

14863602

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

A Here are the lyrics

B Here are the null

C Startup failureD MissingMethodExcep

tion

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen

public static jump() Here are the $lyrics()

static $static_methodMissing(String name def args) lyrics

println VanHalenjump()

ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП

class VanHalen

public jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println new VanHalen()jump()

>

null

10161629

WHATrsquoS THE METACLASS БАРУХ

def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух

AMissingMethodExceptionBWhats the

orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух

CWhatrsquos the javautilLinkedHashMapXXXXXX Барух

DWhatrsquos the frequency Барух

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

mapgetMetaClass()

ВЫВОДЫ

1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis

- intellij IDEA5 Rtfm6 Donrsquot code like my brother

Мы только начали (надо еще форму придумать)

Засылайте Ваши паззлеры поделки и рисунки

- puzzlers jfrogcom- Groovypuzzlers

ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ

Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch

Вам не поравилосьdevnull

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ПУСТЯКИ ДЕЛО ТО ЖИТЕЙСКОЕ

Closure ктоУбийца() -gt Мориарти

Closure ктоУбийца() return Мориарти

>

The Final Countdown - fragment

Europe

Top Disco Hits vol 1 track 17

9743676

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9D10

КАК ТАК ТО НУ КАК ТАК ТО

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648

ЛУЧШЕ НЕ СТАЛОhellip

ЧТО ПРОИЗОШЛО

ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

ПОЧИНИЛИclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9

D42

ЭТО ВООБЩЕ КАК

PUBLIC - PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

A publicPropertyproperty

B publicPropertyPublic__property

C publicPropertygetProperty()

D publicPropertyproperty

У МЕНЯ ДВА ВОПРОСА

1Что за дебильное имя

2 Откуда я мог это знать

ОТВЕТ НА 1 IN SOVIET RUSSIA

YOU DONrsquoT ACCESS PUBLIC

PROPERTY

ОТВЕТ НА 2

httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml

А ты документацию читать не пробовал

ГДЕ КАРТА БИЛЛИ

ГДЕ КАРТА БИЛЛИ

def key = xdef map = [key treasure]def value = mapget(key)println value

def key = xdef map = [key treasure]def value = mapget(key)println value

ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000

чертей

КАК ЭТО NULL

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ

ЧИНИМ

1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure

ЕЩЕ КАРТЫ БИЛЛИ

ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value

def map = [2 treasure]def key = 2def value = map$keyprintln value

ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку

А СЕЙЧАС ТО-ЧТО

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ

def map = [2 treasure]println mapkeySet()first()classname

javalangInteger

НАМ НУЖНА КАРТА

НАМ НУЖНА КАРТА

def key = xdef map = [$key treasure]def value = map[x]println value

ANoSuchElementExceptionBnullCtreasureDПолундра Startup error

def key = xdef map = [$key treasure]def value = map[x]println value

ЧТО ОПЯТЬ

STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН

def map = [$key treasure]println mapkeySet()first()classname

orgcodehausgroovyruntimeGStringImpl

OUT OF RANGE

AAssertion FailedBfalseCtrueDNullPointerException

OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3

Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()

10 20 30 40 50 60 70 80 90 100

РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ

GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56

ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100

bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно

bullИ пусть делегирует в containsWithinBounds

bullПочините наконец GROOVY-2771

bullThank you

POWER RANGE(RS)

УБИРАЕМ ЕДИНИЧКУ

A -1012345678

C[0 2 3 4 5 6 7 8 9]

D[-1 0 1 2 3 4 5 6 7 8]

[09]each println(it - 1)

B0123456789

[09]each println(it - 1)

Это неправильные скобки

(09)each println(it - 1)

Другое дело

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

[0 2 3 4 5 6 7 8 9]

SAVE THE DATE

JOKERCONF IS COMING

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

JAVA2 КТО ПОМНИТ

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

AStartup FailureB[1 2 3 WED Oct 17

161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException

А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ

ERASURE

ERASURE

А ГДЕ МОИ ПРОВЕРКИ

ВО ВРЕМЯ КОМПИЛЯЦИИ

laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo

ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname

[javalangLong javalangLong javalangLong javautilDate javalangString]

COMPILESTATIC

π ndash ТОРТ И ЧИСЛО

DOUBLE THE PI

double value = 3println $value14isDouble()

A trueB MissingPropertyExceptionC falseDMissingMethodException

ПРОСЁК

ПРОСЁК

ПРОСЁК

A trueB MissingPropertyExceptionC falseDMissingMethodException

DOUBLE THE PI

double value = 3println $value14isDouble()

ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ

ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE

ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP

СПРОСИ ФРАНЦУЗОВ

RSVP

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

A Startup FailureB 1C 2D MissingPropertyException

А ВОТ ПОЧЕМУ

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

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

НАПРИМЕР

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

def invite = new Invite()def attendees = inviteattending +1

НУ ИЛИ УБРАТЬ СКОБКИ

Как убрать скобки

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true

B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false

C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true

D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false

ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ

В КОДЕ MIXINMETACLASS

WHY SO PRIMITIVE

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

A Startup ErrorB int long

booleanC javalangInte

ger javalangLong javalangBoolean

Dint

НУ ЭТО ЯСНО А ПОЧЕМУ

порядокточно непорядок

А ЭТО

(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК

JUMP AKA ПРОПАВШИЕ СЛОВА

>

14863602

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

A Here are the lyrics

B Here are the null

C Startup failureD MissingMethodExcep

tion

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen

public static jump() Here are the $lyrics()

static $static_methodMissing(String name def args) lyrics

println VanHalenjump()

ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП

class VanHalen

public jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println new VanHalen()jump()

>

null

10161629

WHATrsquoS THE METACLASS БАРУХ

def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух

AMissingMethodExceptionBWhats the

orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух

CWhatrsquos the javautilLinkedHashMapXXXXXX Барух

DWhatrsquos the frequency Барух

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

mapgetMetaClass()

ВЫВОДЫ

1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis

- intellij IDEA5 Rtfm6 Donrsquot code like my brother

Мы только начали (надо еще форму придумать)

Засылайте Ваши паззлеры поделки и рисунки

- puzzlers jfrogcom- Groovypuzzlers

ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ

Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch

Вам не поравилосьdevnull

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165
>

The Final Countdown - fragment

Europe

Top Disco Hits vol 1 track 17

9743676

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9D10

КАК ТАК ТО НУ КАК ТАК ТО

class CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) ignoredprintStackTrace() countDowncounter = IntegerMIN_VALUE finally return countDown

println finalCountDown()counter

orgcodehausgroovyruntimetypehandlingGroovyCastException Cannot cast object 9 with class javalangInteger to class CountDownrsquo-2147483648

ЛУЧШЕ НЕ СТАЛОhellip

ЧТО ПРОИЗОШЛО

ИСПОЛЬЗУЙ ОТВЕТclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

ПОЧИНИЛИclass CountDown int counter = 10

CountDown finalCountDown() def countDown = new CountDown() try countDowncounter = --countDowncounter catch (ignored) println That will never happen countDowncounter = IntegerMIN_VALUE finally return countDown 42

println finalCountDown()counter

AStartup failureBThat will never happen

-2147483648C9

D42

ЭТО ВООБЩЕ КАК

PUBLIC - PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

ПОПРОБУЙ ПОЛУЧИТЬ PUBLIC PROPERTY

trait Public public String property = I am all public

class Property implements Public

Property publicProperty = new Property()

A publicPropertyproperty

B publicPropertyPublic__property

C publicPropertygetProperty()

D publicPropertyproperty

У МЕНЯ ДВА ВОПРОСА

1Что за дебильное имя

2 Откуда я мог это знать

ОТВЕТ НА 1 IN SOVIET RUSSIA

YOU DONrsquoT ACCESS PUBLIC

PROPERTY

ОТВЕТ НА 2

httpbetagroovy-langorgdocsgroovy-230htmldocumentationcore-traitshtml

А ты документацию читать не пробовал

ГДЕ КАРТА БИЛЛИ

ГДЕ КАРТА БИЛЛИ

def key = xdef map = [key treasure]def value = mapget(key)println value

def key = xdef map = [key treasure]def value = mapget(key)println value

ANoSuchElementExceptionBnullCtreasureDСиний экран смерти 1000

чертей

КАК ЭТО NULL

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ

ЧИНИМ

1def map = [(key) treasure]2mapput(key treasure)3map[key] = treasure4map$key = treasure

ЕЩЕ КАРТЫ БИЛЛИ

ЕЩЕ КАРТЫ БИЛЛИdef map = [2 treasure]def key = 2def value = map$keyprintln value

def map = [2 treasure]def key = 2def value = map$keyprintln value

ANoSuchElementExceptionBnullCtreasureDKernel Panic киту в глотку

А СЕЙЧАС ТО-ЧТО

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ

def map = [2 treasure]println mapkeySet()first()classname

javalangInteger

НАМ НУЖНА КАРТА

НАМ НУЖНА КАРТА

def key = xdef map = [$key treasure]def value = map[x]println value

ANoSuchElementExceptionBnullCtreasureDПолундра Startup error

def key = xdef map = [$key treasure]def value = map[x]println value

ЧТО ОПЯТЬ

STRING ЭТО НЕ GSTRING А ТИП ВАЖЕН

def map = [$key treasure]println mapkeySet()first()classname

orgcodehausgroovyruntimeGStringImpl

OUT OF RANGE

AAssertion FailedBfalseCtrueDNullPointerException

OUT OF RANGEdef range = 10100assert rangecontains(50)println rangecontains(56)

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 1

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 2

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 3

Iterator iterator = (10100)iterator()while (iteratorhasNext()) print $iteratornext()

10 20 30 40 50 60 70 80 90 100

РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ

GROOVY ТЫ УТВЕРЖДАЕШЬ ЧТО ДИАПАЗОН 10100 НЕ СОДЕРЖИТ 56

ЧТО БЫ СДЕЛАЛИ МЫbullНас не интересует какой класс представляет 10100

bullНазовите его ldquoRealRangerdquo или ldquoContinuousRangerdquo или как угодно

bullИ пусть делегирует в containsWithinBounds

bullПочините наконец GROOVY-2771

bullThank you

POWER RANGE(RS)

УБИРАЕМ ЕДИНИЧКУ

A -1012345678

C[0 2 3 4 5 6 7 8 9]

D[-1 0 1 2 3 4 5 6 7 8]

[09]each println(it - 1)

B0123456789

[09]each println(it - 1)

Это неправильные скобки

(09)each println(it - 1)

Другое дело

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

[0 2 3 4 5 6 7 8 9]

SAVE THE DATE

JOKERCONF IS COMING

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

JAVA2 КТО ПОМНИТ

ListltLonggt list = [123]def now = new Date()list ltlt nowprintln list

AStartup FailureB[1 2 3 WED Oct 17

161511 CDT 2014]C[1 2 3 1410388511456]DClassCastException

А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ

ERASURE

ERASURE

А ГДЕ МОИ ПРОВЕРКИ

ВО ВРЕМЯ КОМПИЛЯЦИИ

laquoВ GROOVY МОЖНО ЗАСУНУТЬ ЧТО УГОДНО КУДА УГОДНОraquo

ListltLonggt list = [123]def now = new Date()list ltlt nowlist ltlt fooprintln listclassname

[javalangLong javalangLong javalangLong javautilDate javalangString]

COMPILESTATIC

π ndash ТОРТ И ЧИСЛО

DOUBLE THE PI

double value = 3println $value14isDouble()

A trueB MissingPropertyExceptionC falseDMissingMethodException

ПРОСЁК

ПРОСЁК

ПРОСЁК

A trueB MissingPropertyExceptionC falseDMissingMethodException

DOUBLE THE PI

double value = 3println $value14isDouble()

ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ

ПОСМОТРИ НА TOSTRING() В КЛАССЕ DOUBLE

ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ RSVP

СПРОСИ ФРАНЦУЗОВ

RSVP

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

class Invite int attending = 1

def invite = new Invite()def attendees = (inviteattending) +1println attendees

A Startup FailureB 1C 2D MissingPropertyException

А ВОТ ПОЧЕМУ

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

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

НАПРИМЕР

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

def invite = new Invite()def attendees = inviteattending +1

НУ ИЛИ УБРАТЬ СКОБКИ

Как убрать скобки

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin MrHyde

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

def mrHide = new DrJekyll()me()println $drJekyll and $mrHide are they the same $(drJekyllclass)equals(mrHideclass)

A DrJekyllxxxxxx and MrHydeyyyyyyy are they the same true

B DrJekyllxxxxxx and MrHydeyyyyyyy are they the same false

C DrJekyllxxxxxx and DrJekyllxxxxxx are they the same true

D MrHydeyyyyyyyand MrHydeyyyyyyy are they the same false

ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ

В КОДЕ MIXINMETACLASS

WHY SO PRIMITIVE

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

WHY SO PRIMITIVEdef x = intprintln x

if ((x = long)) println x

if (x = boolean ) println x

A Startup ErrorB int long

booleanC javalangInte

ger javalangLong javalangBoolean

Dint

НУ ЭТО ЯСНО А ПОЧЕМУ

порядокточно непорядок

А ЭТО

(GROOVY) TRUTH МОЖЕТ РАНИТЬ ТАК ЧТО ПРОСТО ДОБАВЬ СКОБОК

JUMP AKA ПРОПАВШИЕ СЛОВА

>

14863602

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

A Here are the lyrics

B Here are the null

C Startup failureD MissingMethodExcep

tion

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen

public static jump() Here are the $lyrics()

static $static_methodMissing(String name def args) lyrics

println VanHalenjump()

ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП

class VanHalen

public jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println new VanHalen()jump()

>

null

10161629

WHATrsquoS THE METACLASS БАРУХ

def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух

AMissingMethodExceptionBWhats the

orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух

CWhatrsquos the javautilLinkedHashMapXXXXXX Барух

DWhatrsquos the frequency Барух

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

mapgetMetaClass()

ВЫВОДЫ

1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis

- intellij IDEA5 Rtfm6 Donrsquot code like my brother

Мы только начали (надо еще форму придумать)

Засылайте Ваши паззлеры поделки и рисунки

- puzzlers jfrogcom- Groovypuzzlers

ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ

Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch

Вам не поравилосьdevnull

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

class CountDown int 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

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

class CountDown int 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

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

КАК ТАК ТО НУ КАК ТАК ТО

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

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

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

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ЛУЧШЕ НЕ СТАЛО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

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ЧТО ПРОИЗОШЛО

ИСПОЛЬЗУЙ ОТВЕТclass CountDown int 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

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ИСПОЛЬЗУЙ ОТВЕТclass CountDown int 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

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ПОЧИНИЛИclass CountDown int 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

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ЭТО ВООБЩЕ КАК

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

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

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

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

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

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

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

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

У МЕНЯ ДВА ВОПРОСА

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

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ОТВЕТ НА 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

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ОТВЕТ НА 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

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ГДЕ КАРТА БИЛЛИ

ГДЕ КАРТА БИЛЛИ

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

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ГДЕ КАРТА БИЛЛИ

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

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

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

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

КАК ЭТО 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

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ

ЧИНИМ

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

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ЧИНИМ

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

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ЕЩЕ КАРТЫ БИЛЛИ

ЕЩЕ КАРТЫ БИЛЛИ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

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ЕЩЕ КАРТЫ БИЛЛИ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

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

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

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

А СЕЙЧАС ТО-ЧТО

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ

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

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ПО УМОЛЧАНИЮ КЛЮЧ ЭТО СТРИНГ ПОЛЮБОМУ ЕСЛИ НЕ ЦИФРЫ

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

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

НАМ НУЖНА КАРТА

НАМ НУЖНА КАРТА

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

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

НАМ НУЖНА КАРТА

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

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

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

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ЧТО ОПЯТЬ

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

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

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

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

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

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

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

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 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

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 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

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 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

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ПУТЬ К ОСМЫСЛЕНИЮ ШАГ 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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

РЕШЕНИЕ ПРОСТОЕ НО СТРАННОЕ

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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ЧТО БЫ СДЕЛАЛИ МЫ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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

УБИРАЕМ ЕДИНИЧКУ

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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

[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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

(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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

[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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

[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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

[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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

[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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ОБМАНУЛИ ДУРАКА

ОБМАНУЛИ ДУРАКА

[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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ОБМАНУЛИ ДУРАКА

[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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

А Я ЗНАЮ ЧТО СЛУЧИЛОСЬ

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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

А ГДЕ МОИ ПРОВЕРКИ

ВО ВРЕМЯ КОМПИЛЯЦИИ

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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

π 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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ПРОСЁК

ПРОСЁК

ПРОСЁК

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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ПРОСЁК

ПРОСЁК

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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ПРОСЁК

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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ЕСЛИ НЕ МОЖЕТ БЫТЬ ПРОПЕРТИ ЗАЧЕМ ПАРИТЬСЯ

ПОСМОТРИ НА 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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ПОСМОТРИ НА 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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ЗНАЕШЬ ЧТО ОЗНАЧАЕТ СОКРАЩЕНИЕ 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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

А ВОТ ПОЧЕМУ

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ПОЧИНИТЬ ЧТО УГОДНО ЧТО НЕ ПОХОЖЕ НА КАСТИНГ

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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin 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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

class MrHyde def me() return this

class DrJekyll

DrJekyllmixin 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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ВСТРАИВАЕМ ОДИН КЛАСС В ДРУГОЙ

В КОДЕ 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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

В КОДЕ 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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

НУ ЭТО ЯСНО А ПОЧЕМУ

порядокточно непорядок

А ЭТО

(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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

А ЭТО

(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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

(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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

JUMP AKA ПРОПАВШИЕ СЛОВАclass VanHalen

public static jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println VanHalenjump()

A Here are the lyrics

B Here are the null

C Startup failureD MissingMethodExcep

tion

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen

public static jump() Here are the $lyrics()

static $static_methodMissing(String name def args) lyrics

println VanHalenjump()

ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП

class VanHalen

public jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println new VanHalen()jump()

>

null

10161629

WHATrsquoS THE METACLASS БАРУХ

def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух

AMissingMethodExceptionBWhats the

orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух

CWhatrsquos the javautilLinkedHashMapXXXXXX Барух

DWhatrsquos the frequency Барух

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen

public static jump() Here are the $lyrics()

static $static_methodMissing(String name def args) lyrics

println VanHalenjump()

ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП

class VanHalen

public jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println new VanHalen()jump()

>

null

10161629

WHATrsquoS THE METACLASS БАРУХ

def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух

AMissingMethodExceptionBWhats the

orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух

CWhatrsquos the javautilLinkedHashMapXXXXXX Барух

DWhatrsquos the frequency Барух

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen

public static jump() Here are the $lyrics()

static $static_methodMissing(String name def args) lyrics

println VanHalenjump()

ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП

class VanHalen

public jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println new VanHalen()jump()

>

null

10161629

WHATrsquoS THE METACLASS БАРУХ

def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух

AMissingMethodExceptionBWhats the

orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух

CWhatrsquos the javautilLinkedHashMapXXXXXX Барух

DWhatrsquos the frequency Барух

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen

public static jump() Here are the $lyrics()

static $static_methodMissing(String name def args) lyrics

println VanHalenjump()

ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП

class VanHalen

public jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println new VanHalen()jump()

>

null

10161629

WHATrsquoS THE METACLASS БАРУХ

def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух

AMissingMethodExceptionBWhats the

orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух

CWhatrsquos the javautilLinkedHashMapXXXXXX Барух

DWhatrsquos the frequency Барух

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

I CANT BELIEVE YOU FELL FOR THE OLDEST TRICK IN THE BOOK

РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen

public static jump() Here are the $lyrics()

static $static_methodMissing(String name def args) lyrics

println VanHalenjump()

ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП

class VanHalen

public jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println new VanHalen()jump()

>

null

10161629

WHATrsquoS THE METACLASS БАРУХ

def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух

AMissingMethodExceptionBWhats the

orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух

CWhatrsquos the javautilLinkedHashMapXXXXXX Барух

DWhatrsquos the frequency Барух

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

РЕШЕНИЕ СТАТИЧЕСКИЙ METHODMISSINGclass VanHalen

public static jump() Here are the $lyrics()

static $static_methodMissing(String name def args) lyrics

println VanHalenjump()

ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП

class VanHalen

public jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println new VanHalen()jump()

>

null

10161629

WHATrsquoS THE METACLASS БАРУХ

def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух

AMissingMethodExceptionBWhats the

orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух

CWhatrsquos the javautilLinkedHashMapXXXXXX Барух

DWhatrsquos the frequency Барух

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ЕЩЁ ЛУЧШЕ ndash ИСПОЛЬЗУЙ ООП

class VanHalen

public jump() Here are the $lyrics()

def methodMissing(String name def args) lyrics

println new VanHalen()jump()

>

null

10161629

WHATrsquoS THE METACLASS БАРУХ

def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух

AMissingMethodExceptionBWhats the

orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух

CWhatrsquos the javautilLinkedHashMapXXXXXX Барух

DWhatrsquos the frequency Барух

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165
>

null

10161629

WHATrsquoS THE METACLASS БАРУХ

def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух

AMissingMethodExceptionBWhats the

orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух

CWhatrsquos the javautilLinkedHashMapXXXXXX Барух

DWhatrsquos the frequency Барух

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

WHATrsquoS THE METACLASS БАРУХ

def map = [metaClass lsquofrequency]println Whats the $mapmetaClass Барух

AMissingMethodExceptionBWhats the

orgcodehausgroovyruntimeHandleMetaClassYYYYYYY [groovylangMetaClassImplYYYYYYY[class javautilLinkedHashMap]] Барух

CWhatrsquos the javautilLinkedHashMapXXXXXX Барух

DWhatrsquos the frequency Барух

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

СРАБОТАЛО НО

НЕ ФАКТ ЧТО ЭТО ХОРОШО

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ПОМНИШЬ ДЖЕЙМС ГОСЛИНГ ПРЕДУПРЕЖДАЛ

ЧТО OPERATOR OVERLOADING ЭТО ПЛОХО

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ПЕРЕБОР OPERATOR OVERLOADING

Если переопределён для он не может быть переопредён и для

mapmetaClass

mapget(metaClass)

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 puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ВЫВОДЫ

1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis

- intellij IDEA5 Rtfm6 Donrsquot code like my brother

Мы только начали (надо еще форму придумать)

Засылайте Ваши паззлеры поделки и рисунки

- puzzlers jfrogcom- Groovypuzzlers

ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ

Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch

Вам не поравилосьdevnull

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

1 Пишите читабельный код2 Комментируйте все трюки3 Иногда это баг4 Пользуйте static code analysis

- intellij IDEA5 Rtfm6 Donrsquot code like my brother

Мы только начали (надо еще форму придумать)

Засылайте Ваши паззлеры поделки и рисунки

- puzzlers jfrogcom- Groovypuzzlers

ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ

Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch

Вам не поравилосьdevnull

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

Мы только начали (надо еще форму придумать)

Засылайте Ваши паззлеры поделки и рисунки

- puzzlers jfrogcom- Groovypuzzlers

ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ

Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch

Вам не поравилосьdevnull

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

ПАЗЗЛЕРЫ ВСЕГДА ПЛАТЯТ СВОИ ДОЛГИ

Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch

Вам не поравилосьdevnull

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

Вам понравилосьХвалите нас в твиттере groovypuzzlers- Groovypuzzlers - jekaborisov- jbaruch

Вам не поравилосьdevnull

  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165
  • Groovy puzzlers
  • Slide 2
  • Slide 3
  • Slide 4
  • Всё верно для версии 237
  • Slide 6
  • Absolutely Groovy
  • Slide 8
  • Slide 9
  • чиним
  • Идея ничего не печатает Почему
  • Добавим Println
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Просто добавь скобок
  • Prime cuts
  • Prime cuts (2)
  • Сам в шоке
  • Посмотрим еще раз
  • Slide 22
  • Как 4 могло оказаться простым числомhellip
  • Давайте разбираться
  • Давайте разбираться (2)
  • Давайте разбираться (3)
  • Давайте разбираться (4)
  • Давайте разбираться (5)
  • Решение используй Any() или переосмысли алгоритм
  • Slide 30
  • Slide 31
  • Какой же это iTERABLE
  • RTFS (Read the Fing source)
  • Max power
  • Max power (2)
  • Slide 36
  • Раскусил
  • Slide 38
  • секундочку теперь они все null
  • Slide 40
  • Slide 41
  • Как это получилось
  • Плохое значение по умолчанию нигде не описано
  • Детектив
  • Кто убийца
  • Пичалька
  • Пустяки дело то житейское
  • Slide 48
  • Slide 49
  • Slide 50
  • Как так то Ну как так то
  • Slide 52
  • Лучше не сталоhellip
  • Что произошло
  • Используй ответ
  • Починили
  • Это вообще как
  • Slide 59
  • Slide 60
  • Попробуй получить public property
  • Slide 62
  • У меня два вопроса
  • Ответ на 1
  • Ответ на 2
  • Где карта билли
  • Где карта билли (2)
  • Slide 68
  • Как это null
  • По умолчанию ключ это стринг полюбому
  • чиним (2)
  • Еще карты билли
  • Еще карты билли (2)
  • Slide 74
  • А сейчас то-что
  • По умолчанию ключ это стринг полюбому если не цифры
  • Нам нужна карта
  • Нам нужна карта (2)
  • Slide 79
  • Что опять
  • String Это не gstring а тип важен
  • Out of range
  • Out of range (2)
  • Slide 84
  • Путь к осмыслению Шаг 1
  • Путь к осмыслению Шаг 2
  • Путь к осмыслению Шаг 2 (2)
  • Путь к осмыслению Шаг 3
  • Решение простое но странное
  • groovy ты утверждаешь что диапазон 10100 не содержит 56
  • Что бы сделали мы
  • Power range(rs)
  • Убираем единичку
  • Slide 94
  • Slide 95
  • Slide 96
  • Обманули дурака
  • Обманули дурака (2)
  • Обманули дурака (3)
  • Обманули дурака (4)
  • Обманули дурака (5)
  • Обманули дурака (6)
  • Slide 103
  • Slide 104
  • Java2 кто помнит
  • Slide 106
  • А я знаю что случилось
  • Erasure
  • Erasure (2)
  • Slide 110
  • laquoв Groovy можно засунуть что угодно куда угодноraquo
  • CompileStatic
  • π ndash торт и число
  • Double the pi
  • Просёк
  • Просёк (2)
  • Просёк (3)
  • Double the pi (2)
  • Slide 119
  • Если не может быть проперти зачем париться
  • Посмотри на tostring() в классе double
  • Знаешь что означает сокращение rsvp
  • RSVP
  • Slide 124
  • Slide 125
  • Slide 126
  • Slide 127
  • А вот почему
  • Slide 129
  • Починить что угодно что не похоже на кастинг
  • Починить что угодно что не похоже на кастинг (2)
  • Slide 132
  • Slide 133
  • Slide 134
  • Slide 135
  • Встраиваем один класс в другой
  • В коде Mixinmetaclass
  • Slide 138
  • Why so primitive
  • Why so primitive (2)
  • Why so primitive (3)
  • Ну это ясно а почему
  • А это
  • (Groovy) truth может ранить так что просто добавь скобок
  • Jump Aka Пропавшие слова
  • Jump Aka Пропавшие слова (2)
  • Jump Aka Пропавшие слова (3)
  • I cant believe you fell for the oldest trick in the book
  • I cant believe you fell for the oldest trick in the book (2)
  • I cant believe you fell for the oldest trick in the book (3)
  • I cant believe you fell for the oldest trick in the book (4)
  • Решение статический methodmissing
  • Ещё лучше ndash используй ООП
  • Slide 154
  • Whatrsquos the metaclass Барух
  • Slide 156
  • Slide 157
  • ПЕРЕБОР operator overloading
  • Slide 159
  • выводы
  • Slide 161
  • Slide 162
  • Паззлеры всегда платят свои долги
  • Slide 164
  • Slide 165

top related