Groovy: if для невнимательных

Рубрика: Development, Groovy | 21 May 2007, 14:28 | Vadim Voituk

Есть в Groovy такая синтаксическая “фишка” как блокировка присваивания в условии оператора if().
Суть её состоит в том, что если при разборе условия в синтаксическое дерево, в вершине оказывается оператор присвоения, то такой код не проходит синтаксическую валидацию.

Проще говоря, если написать
[java]def x=1
if (x=2) println “x=2″;[/java]

то получим синтаксическую ошибку:
[code]Discarding invalid text:
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed, groovysh script: 23: expecting ')', found '=' @ line 23, column 6.
if (x=2) println "x=2";
^

1 error[/code]

Но при всем при этом мы можем успешно написать
[java]if ((x = 1)) println “Hello”[/java]
[java]if (x++) println “Hello”[/java]
[java]while (x=x-1) println x;[/java]

Обратите внимание на двойные скобки в первом примере – только при использовании “((” и “))” можно производить присваивание внутри Boolean-выражения.
Также обратите внимание, что такое поведение это не распостраняется на условие оператора while ().
А ноги у такой функциональности языка растут из того, что в Groovy, там где требуется true или false, происходит преобразование любого выражения/обьекта в Boolean, и дабы избежать ошибок при написании “=” вместо “==” в условиях, была добавлена такая вот языковая “рюшечка”.

Аналогичная ситуация наблюдается и при использовании assert, только скобок нужно на одну меньше:
Неправильно:
[java]def x=1
assert x=2[/java]

Правильно:
[java]def x=1
assert (x=2)[/java]

Лично я против подобных дополнения для в синтаксис языка, так как уверен что полагаясь на подобные конструкции программисты в результате теряют внимательность.
IMHO подобными проверками должна заниматься IDE, да и то в виде опции.

Оставьте комментарий!

Leave a Reply