2013-06-07 9 views
33

私は__block変数の構文について質問があります。スコープ内の変数に__blockを使うことができるので、ブロック内では読み取り専用ではありません。しかしapple docs内の1つの場所で、私は選択肢を見ました:__blockの代替構文?

は「定義スコープ内の変数は読み取り専用されているデフォルトでブロック内で使用するときに、このような変数の値を変更する必要がある場合は、。特別な構文を使用することができます。この例では

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

をカウントし、cumulativeValueは、ブロック内で変更されているので、彼らはブロックスコープの先頭で共有変数のコンマ区切りのリストに含まれています。

この構文ははるかにきれいに見えますが、宣言していないが範囲内にある変数を変更できると思います。しかし、私は他の場所でこれを見たことがないし、xCodeコンパイラは私の基本ブロックを好まない。これは正当な構文ですか?

答えて

45

ワウ。長い間その構文を見ていない。

これは、ブロックの開発中に探索されたさまざまな構文構造の1つでした。それは意図を宣言するにはあまりにも不正確であり、その結果の行動が混乱していたため、結局は拒否されました。

3つのブロックを持つスコープを考えてください。そのうちの2つは、変数をreadwriteとして|a|で宣言しています。スコープの上部にあるint a = 5;宣言から、ブロックのスコープの一部で変数の値が読み書きされていることを知る方法はありません。

また、コンパイラの実装を大幅に難しくします。 Cの伝承では、宣言時に変数の格納タイプが固定されています。この構文をサポートすることは、その期待を破ったでしょう。

このように、volatileまたはstaticに類似した記憶タイプ修飾子を使用することが決定されました。 __blockが主に使用されたのは、__の接頭辞が、裸のキーワードを追加することで壊れるコードの量を大幅に減らしたためです。

ありがとうございます。バグは提出され、文書は最終的に修正され、削除される予定です。

+0

非常に興味深い!歴史のおかげです。 –

+0

なぜ、構文が正式化される前に文書が書かれたのか? – CodaFi

+4

ドキュメンテーションの人々がコヒーレントに何かを説明する方法を理解できない場合、それは設計に深刻な欠陥があることを示しているので、設計プロセスの早い段階で関与しています。そのドキュメンテーションは、ブロックが最初に発表されたWWDCのために元々作成されているかもしれません。 – bbum

5

| |シンタックスはSmalltalkに触発されました。当然、「ブロック」という言葉もそうでした。

bbumが指摘するように、declサイトをマークする方がより正直ですw.r.t.ノンブロック使用であり、新しい(C)オブジェクトの "duration"としてモデル化されたときにはCと一直線に並んでいます。

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