コメントDone d.hatena.ne.jp/xuwei/20140611… この点に関しては @camloeba さんも誤解してらしたようなのでSwift本を引用してコメントした。
2014-06-13 15:00:37@kmizu ちょっとよくわかんないです。immutable な配列でサイズは変更できないが要素は変更できる、というのは OCaml の let x = [|1; 2|] でも同じことなんで、そこに違和感は感じないわけですけど。
2014-06-13 15:22:55@camloeba あ、えーと、OCamlの配列は束縛される変数の宣言に関わらず元々mutableですよね(オブジェクトそのものが変更可能という意味で)。Swiftは宣言側にletがあるかどうかで配列のmutabilityそのものが変わるのが決定的に違う点かと。
2014-06-13 15:33:19@camloeba 元々の例では出てこなかったですけど、全部varで宣言されていれば(この場合、b.append(5)もaに反映される)こんな変な挙動は発生しなかったという点がML(OCaml)と異なる点じゃないかと。
2014-06-13 15:35:39@kmizu “If you assign an Array instance to a constant or variable, … both arrays share the same sequence” とあるので var と let で挙動が変わるわけではなさそうです
2014-06-13 15:43:08@kmizu @camloeba 全部varで宣言してみましたけどこんな結果になりました。 gist.github.com/pesblog/7d23a5…
2014-06-13 15:43:20@kmizu ドキュメントにそんなこと書いてないようですけど var に append して diverge してるよ developer.apple.com/library/prerel…
2014-06-13 15:46:33@kmizu @camloeba おもしr…変な仕様ですけど一貫性がありますね。Array.appendは元の配列をコピーしつつ要素を追加して上書きするってことですね。
2014-06-13 15:47:58@kmizu 俺みたいにドキュメント読まずにノーガード戦法なら、すまん読まずに挙動どなってんのか予測してみたけど外れたで済む(済むのか
2014-06-13 15:49:36@camloeba 自分は読んでノーガード戦法でしたorz やはり念のためSwift処理系を(developer登録して)入手しておくべきだったか…!!
2014-06-13 15:51:02@uasi その点に関して“if you assign an array or a dictionary to a constant, that array or dictionary is immutable, and its size cannot be changed.”
2014-06-13 15:53:09俺の理解: Swiftのlet/varは、Scalaのval/varと同じように、その変数自体への再代入の可否だけではなくて、mutating付きのfuncが呼べる/呼べないというC++のconstとconst関数的なものもあるんじゃなかろうか #妄想
2014-06-13 15:58:43C++はconst(つまりimmutable)が特別扱いされるのに対して、Swiftはmutating(つまりmutable)が特別扱いされる、みたいな? #妄想
2014-06-13 15:59:18@kmizu あのブログ記事は俺ビンボだしドキュメントのリンクも探せないので(今は見つけた)、勝手にあのコードの出力だけからオッカムの剃刀的に中で何が起こってるか勝手に推測してみたよ!というネタなので剃刀がするどすぎて間違ってるかもしれないよ
2014-06-13 16:02:32ざっとみ Swift の言語仕様これ原型 ActionScript じゃねーか wwww というツッコミ... rekkacopy.com
2014-06-13 16:04:18