くどはむと猫の窓スマートフォン用の表示で見るくどはむと猫の窓この広告は、90日以上更新していないブログに表示しています。Rust前回、簡単な高階関数hogeを書きましたが、もう少しだけ分かったことがあるのでまたメモとして残しておきます。kudohamu.hatenablog.com今回は高階関数というよりはRustのクロージャについてです。バーション1.3.0です。Rustは結構頻繁に破壊的な変更が起きるようなので将来ここに書いてある内容は通らない可能性あり。前回できたもの前回は以下のように「"ほげー!"という文字列を返す関数」を返す関数hogeを作成しました。})}ただ、高階関数を作る時は大抵返り値となる関数の中でゴニョゴニョしたいものです。返り値の関数に引数を付けるということで、hogeを改変して「"ほげー"という文字に引数の文字列をsuffixとして付けた文字を返す関数」を返す関数hogeを作ってみます。})}結果ほげー?想定通りの動きをしました。高階関数(hoge)に引数を付けるではhogeにも引数prefixを作り、"{prefix}、ほげー{suffix}"となるような関数を返す関数にしてみます。})}普段通り書いてみましたが、以下のように怒られました。キーワードを付ければ?というもの。キーワードを付けるメッセージ通りつけてみます。})}結果ほ、ほげー?解決した。})}prefixをto_stringするのがあれだけど呼ぶ側が綺麗になるので良しとしておく。moveキーワードってなによRustのクロージャはエンクロージャの環境(の変数)を借用するらしい。あーいー}確かに、Rustのクロージャはエンクロージャの環境(の変数)を借用しています。functionの意味が分かってきます。moveキーワードを付ける前の状態ではクロージャはエンクロージャであるhogeの環境にある変数prefixを借りていますが、クロージャがprefixを使い終わって返す前にhogeのlifetimeが終わってしまいますね。prefixの所有権はhogeにあるのでメモリの開放もhogeの寿命が尽きるのと同時に行われますがその後にクロージャにprefixを参照されるとマズいのでこの動作はもっともです。prefixを使いたい。ここでコンパイラに教えてもらったmoveキーワードです。これのキーワードをクロージャにつけると、エンクロージャの環境(の変数)を借用するのではなく所有権を移動するように変更されるとのこと。moveキーワードを付けることでprefixの所有権がhogeからクロージャに移る。よってprefixのメモリの開放はhogeの寿命が尽きるときには行われず、クロージャの寿命が尽きるときに一緒に開放されるようになるということですね。あー}所有権が移動されています。所感的な少しずつ、少しずつだけどRustのメモリ周りについて分かってきた。この程度の内容はmallocやfreeを書き慣れている人達は息を吸うように分かっているだろうなぁ...。なんというかクロージャは名前の通りエンクロージャの環境を閉包するものだと思っていたのでRustのクロージャをクロージャと呼んでいいのかというモヤモヤがあります。自由変数を実行時の環境ではなく定義したときの環境で使うもので、環境(よく意味論(よく分かってない)とかEnvで表されてるやつ)をまるっとコピーしてもっておくようなイメージでした。定義とかいう言葉を持ち出すのは怖いのであまりやらないのですが、これも従来のクロージャなのでしょうか?いつも通り、「ここが間違っている」「こうした方が良い」、「こういうやり方もある」等ありましたらご教示ください。その2Tweet広告を非表示にする関連記事2015-09-26【Rust】高階関数を作るときのメモ最近Rustを触っています。kudohamuid:kudohamukudohamuといいます。プログラムについて勉強中の情報学徒。未熟者なので皆さんから色々教えていただきたいです。(9)月別アーカイブ参加グループプログラミングはてなブログをはじめよう!kudohamuさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。