Подтвердить что ты не робот

Альтернативный синтаксис __block?

У меня вопрос о синтаксисе переменных __block. Я знаю, что вы можете использовать __block для переменной в области видимости, чтобы она не была доступна только для чтения внутри блока. Однако в одном месте в яблочных документах я увидел альтернативу:

"Переменные в определяющей области по умолчанию используются только для чтения при использовании в блоке. Если вам нужно изменить значение такой переменной, вы можете использовать специальный синтаксис:

int count = 0;
float cumulativeValue = 0.0;
UpdateElements( a, N, ^(float element){
    |count, cumulativeValue|
    float value = factor * element;
    ++count;
    cumulativeValue += value;
    return value;
} );

В этом примере count и cumulativeValue изменяются внутри блока, поэтому они включаются в список разделенных переменных, разделенных запятыми, в начале области блока.

Этот синтаксис кажется намного более чистым, и я предполагаю, что вы могли бы затем изменить переменные, которые вы не объявляли, но все еще находятся в сфере видимости. Однако я не видел этого нигде, и компилятор xCode не любит мой основной блок. Является ли этот законный синтаксис?

4b9b3361

Ответ 1

Ого. Не видели этот синтаксис в течение длительного времени.

Это была одна из различных синтаксических структур, исследованных при разработке блоков. В конце концов он был отклонен, потому что он был слишком неточен в объявлении намерения, и возникшее в результате поведение было бы запутанным.

Рассмотрим область с тремя блоками, две из которых объявляют переменную как readwrite через |a|. Невозможно было бы узнать из объявления int a = 5; в верхней части области действия, что значение переменной читается в некоторой части области блока.

Кроме того, это значительно затруднит реализацию компилятора. Традиция в C заключается в том, что тип хранения переменных фиксирован во время объявления. Поддержка этого синтаксиса нарушила бы это ожидание.

Таким образом, было решено использовать модификатор типа хранилища, сродни volatile или static. __block использовался прежде всего потому, что префикс __ значительно уменьшает количество кода, который будет ломаться, добавляя ключевое слово.

Спасибо, что спросили об этом. Буг подан и эта документация будет исправлена ​​и/или удалена в конце концов.

Ответ 2

The | | синтаксис был вдохновлен Smalltalk, как и, конечно же, термин "блок".

Как отмечает bbum, маркировка сайта decl более честна w.r.t. не-блочное использование и намного больше в соответствии с C при моделировании, поскольку он закончился, как новый (C) объект "продолжительность".

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1451.pdf