четверг, 2 апреля 2009 г.

Из непонятого: alias this в языке D 2.0

В преддверии 1-го апреля Вальтер Брайт выпустил новые версии своего компилятора языка программирования D. Списки изменений для версий 1.0 и 2.0 можно посмотреть здесь:

http://www.digitalmars.com/d/1.0/changelog.html
http://www.digitalmars.com/d/2.0/changelog.html

В язык D 2.0 была добавлена фича, которую я раньше нигде не видел: alias this. Как я смог понять из документации, эта конструкция позволяет переадресовать все вызовы, которые компилятор не смог связать с самим объектом, на указанный атрибут этого объекта. Вот пример из документации:

struct S
{   int x;
    alias x this;
}

int foo(int i) { return i * 2; }

void test()
{
    S s;
    s.x = 7;
    int i = -s;   // i == -7
    i = s + 8;    // i == 15
    i = s + s;    // i == 14
    i = 9 + s;    // i == 16
    i = foo(s);   // implicit conversion to int
}

Здесь получается, что большинство операций над экземпляром s на самом деле переадресуется его атрибуту x. Т.е. такая конструкция позволяет легко выдать экземпляр/объект структуры/класса за экземпляр другого типа. Всего лишь с помощью alias this. В C++ для этого пришлось бы определять кучу операторов. А в D – только alias this :)

Вероятно, данная конструкция была введена в D из-за каких-то прагматических соображений. Но я не могу понять каких. Равно как не могу сообразить, в каких случаях мне мог бы понадобиться подобный прием.

Но вот есть у меня серьезное подозрение, что понимаемость D-шных программ, в которых данный трюк используется, основательно снизится. И это все в языке, который декларировался как более простой и логичный C++. И если C++ ругают за то, что в результате своего развития он превратился в клоаку очень разрозненных идей и концепций, то у D есть все шансы переплюнуть C++ в этом отношении.

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