Альтернативный синтаксис __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 не любит мой основной блок. Является ли этот законный синтаксис?
Ответы
Ответ 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