33 votes

Syntaxe alternative à __block?

J'ai une question sur la syntaxe de l' __block variables. Je sais que vous pouvez utiliser __block sur une variable dans la portée de sorte qu'il n'est pas en lecture seule dans le bloc. Cependant, dans une place, dans les apple docs, j'ai vu une alternative:

"Les Variables dans la définition du champ d'action sont en lecture seule par défaut lorsque utilisé dans un bloc. Si vous avez besoin de changer la valeur de cette variable, vous pouvez utiliser une syntaxe particulière:

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

Dans cet exemple, le comte et la cumulativeValue sont modifiés à l'intérieur du bloc, de sorte qu'ils sont inclus dans la liste séparée par des virgules de variables partagées au début du bloc de portée.

Cette syntaxe semble beaucoup plus propre et je suppose que vous pouvez ensuite modifier les variables que vous n'avez pas à déclarer, mais sont toujours dans la portée. Cependant, je n'ai pas vu cela nulle part ailleurs et xCode compilateur n'aime pas mon bloc de base. Est-il légitime de syntaxe?

45voto

bbum Points 124887

Wow. N'ai pas vu que la syntaxe dans un temps long.

C'était l'une des différentes structures syntaxiques exploré au cours de l'élaboration de blocs. Il a finalement été rejeté parce qu'il était trop imprécise pour la déclaration de l'intention et le comportement qui en résulte aurait été source de confusion.

Considérons un champ avec trois blocs, dont deux de déclarer une variable comme readwrite via |a|. Il n'y aurait aucun moyen de savoir à partir de l' int a = 5; déclaration au sommet de l'étendue que la valeur de la variable est readwrite dans certains du bloc de portée.

Ainsi, il serait le compilateur de mise en œuvre beaucoup plus difficile. La tradition C est que les variables de type de stockage est fixé au moment de la déclaration. L'appui de cette syntaxe aurait brisé cette attente.

Ainsi, il a été décidé d'utiliser un stockage modificateur de type apparenté volatile ou static. __block a été utilisé principalement parce que l' __ préfixe réduit considérablement la quantité de code qui permettrait de briser par l'ajout d'un simple mot-clé.

Merci de demander ce. Bug déposée et que la documentation sera fixe et/ou supprimés par la suite.

5voto

Blaine Garst Points 31

Le | | la syntaxe a été inspirée par Smalltalk, tout comme le terme "bloc".

Comme le souligne bbum, marquer le site de déclassement est plus honnête par rapport à une utilisation non bloquante et bien plus en ligne avec C lorsqu'il est modélisé, car il a fini par être un nouvel "objet" (C).

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X