Но этот разговор не имеет ни начала ни конца, и интересные примеры всегда могут придумываться «по ходу дела». Так, например, подвернулся такой код на Groovy:
string = 'hippopotamus'
assert string - 'hippo' - 'mus' + 'to' == 'potato'
Считаю, что это просто гениально :) Когда-то давным-давно, когда я ещё учился в школе и ничего толком программировать не умел, я ушёл с Basic к Pascal из-за более качественной работы со строками. Ах, если бы в то время существовали такие прикольные штуки, как Groovy или хотя бы Java!
А ещё я хотел бы рассказать про конструкторы. Конструкторы в Groovy бывают очень-очень разными. Можно написать так:
def a = new A();
a.setB(b);
a.setC(c);
Можно и так:
def a = new A(b: b, c: c);
А можно даже так:
@Newify(A){def a = A(b:b,c:c)}
Если непонятно, зачем нужен @Newify, сравните:
def buildTree() {
new Tree(new Tree(new Leaf(1), new Leaf(2)), new Leaf(3))
}
Казалось бы, всё нормально. Но есть способ и короче (вроде бы, заимствованный из Python):
@Newify([Tree, Leaf]) buildTree() {
Tree(Tree(Leaf(1), Leaf(2)), Leaf(3))
}
Или ещё пример от авторов языка:
@Immutable final class Coordinates {
Double latitude, longitude
}
@Immutable final class Path {
Coordinates[] coordinates
}
@Newify([Coordinates, Path])
def build() {
Path(
Coordinates(48.824068, 2.531733),
Coordinates(48.857840, 2.347212),
Coordinates(48.858429, 2.342622)
)
}
assert build().coordinates.size() == 3
Как видно, мы не пишем конструкторов! Всё просто работает. А ещё мы не пишем слово new. И всё снова просто работает.