Swiftのletとvarの挙動とappendについて

タイトル通りです。kmizuの黒歴史も入っていますorz
2
kmizu @kmizu

コメントDone d.hatena.ne.jp/xuwei/20140611… この点に関しては @camloeba さんも誤解してらしたようなのでSwift本を引用してコメントした。

2014-06-13 15:00:37
Jun Furuse 🐫🌴 @camloeba

@kmizu おやおや!あとで読んでみますね!

2014-06-13 15:04:29
Κeіsuke Νakanο @ksknac

@kmizu 最初の箇条書きのmutableとimmutableは逆じゃないですかね…

2014-06-13 15:10:28
Jun Furuse 🐫🌴 @camloeba

@kmizu ちょっとよくわかんないです。immutable な配列でサイズは変更できないが要素は変更できる、というのは OCaml の let x = [|1; 2|] でも同じことなんで、そこに違和感は感じないわけですけど。

2014-06-13 15:22:55
kmizu @kmizu

@camloeba あ、えーと、OCamlの配列は束縛される変数の宣言に関わらず元々mutableですよね(オブジェクトそのものが変更可能という意味で)。Swiftは宣言側にletがあるかどうかで配列のmutabilityそのものが変わるのが決定的に違う点かと。

2014-06-13 15:33:19
kmizu @kmizu

@camloeba 元々の例では出てこなかったですけど、全部varで宣言されていれば(この場合、b.append(5)もaに反映される)こんな変な挙動は発生しなかったという点がML(OCaml)と異なる点じゃないかと。

2014-06-13 15:35:39
がくぞ @gakuzzzz

@kmizu 僕も最近おなかがヤバス…w 逆に考えましょう!このおなかはnull安全なコードを書いている証左だと!w

2014-06-13 15:42:37
ともくんのママ @uasi

@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
pes @pesblog

@kmizu @camloeba 全部varで宣言してみましたけどこんな結果になりました。 gist.github.com/pesblog/7d23a5…

2014-06-13 15:43:20
kmizu @kmizu

@pesblog @camloeba な、なんと…。ドヤ顔してたのが恥ずかしい結果になりました。

2014-06-13 15:44:28
Jun Furuse 🐫🌴 @camloeba

@kmizu ドキュメントにそんなこと書いてないようですけど var に append して diverge してるよ developer.apple.com/library/prerel…

2014-06-13 15:46:33
がくぞ @gakuzzzz

@kmizu さっきから水島さんの誤変換に変な笑い声が出そうになって危険があぶないです!www

2014-06-13 15:47:04
pes @pesblog

@kmizu @camloeba おもしr…変な仕様ですけど一貫性がありますね。Array.appendは元の配列をコピーしつつ要素を追加して上書きするってことですね。

2014-06-13 15:47:58
Jun Furuse 🐫🌴 @camloeba

@kmizu 俺みたいにドキュメント読まずにノーガード戦法なら、すまん読まずに挙動どなってんのか予測してみたけど外れたで済む(済むのか

2014-06-13 15:49:36
kmizu @kmizu

@camloeba 自分は読んでノーガード戦法でしたorz やはり念のためSwift処理系を(developer登録して)入手しておくべきだったか…!!

2014-06-13 15:51:02
kmizu @kmizu

@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
kmizu @kmizu

@uasi と書いており、letとvarで挙動が変わるよう(な表現)に見えます。

2014-06-13 15:53:32
kmizu @kmizu

ドヤ顔してSwitf本参照しながらコメント書いてた30分くらい前の俺を消し去りたい

2014-06-13 15:56:38
ぐるぐる系SQL @bleis

俺の理解: Swiftのlet/varは、Scalaのval/varと同じように、その変数自体への再代入の可否だけではなくて、mutating付きのfuncが呼べる/呼べないというC++のconstとconst関数的なものもあるんじゃなかろうか #妄想

2014-06-13 15:58:43
kmizu @kmizu

反省してSwiftには今後手を出さない!!!(違う

2014-06-13 15:58:56
ぐるぐる系SQL @bleis

C++はconst(つまりimmutable)が特別扱いされるのに対して、Swiftはmutating(つまりmutable)が特別扱いされる、みたいな? #妄想

2014-06-13 15:59:18
ともくんのママ @uasi

@kmizu ああ確かにそのような挙動をしますね、失礼しました

2014-06-13 16:01:41
Jun Furuse 🐫🌴 @camloeba

@kmizu あのブログ記事は俺ビンボだしドキュメントのリンクも探せないので(今は見つけた)、勝手にあのコードの出力だけからオッカムの剃刀的に中で何が起こってるか勝手に推測してみたよ!というネタなので剃刀がするどすぎて間違ってるかもしれないよ

2014-06-13 16:02:32
@turugi_iti

ざっとみ Swift の言語仕様これ原型 ActionScript じゃねーか wwww というツッコミ... rekkacopy.com

2014-06-13 16:04:18