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, да и то в виде опции.
