所有権について
Page 1とPage 2は一般のプログラミング言語とよく似ているのでそれほど難しくなかったかと思います。しかし、このPage 3の所有権は一般のプログラミング言語とは全く違います。所有権はちょっと難しいですが、所有権のおかげでメモリの管理が正確に行え、極めてメモリリークが起きにくくなっています。
Rustでは所有権がある間だけメモリにアクセスできます。所有権には「ムーブ」と「クローン」と「コピー」と「参照」と「借用」があって、以下のそれぞれのサンプルコードでは第1回でも言ったようにmain()関数などのスコープの間だけ所有権が保持されます。
ムーブ
次のサンプルコードを実行してください。エラーが出るはずです。一般のプログラミング言語で似たようなコードを書いたら起きないエラーです。なぜエラーが起きたのでしょうか?それは「s1」変数が確保した所有権が「s2」変数に渡って、s1変数にはもう所有権がないからです。
ただし「println!("{}",s1);」を「println!("{}",s2);」に書き換えたらエラーは起きません。なぜならs2変数は所有権を渡されて保持しているからです。Rustでは所有権を持っている変数だけが値を使うことができます。
fn main() { let s1 = String::from("ムーブ"); let s2 = s1; println!("{}",s1); // エラー! }
クローン
先の「所有権のムーブのサンプルコード」のエラーを無くすには、次のサンプルコードのように「clone()」を使います。所有権を「クローン(細胞の増殖)」することで、s1変数から所有権がなくなることなく増殖したものをs2変数へ渡すことができます。
fn main() { let s1 = String::from("クローン"); let s2 = s1.clone(); println!("{}",s1); // エラーなし println!("{}",s2); // エラーなし }
コピー
所有権のムーブにおいても例外があります。それは「数値」をムーブする「コピー」の場合です(この場合実際には所有権はムーブしません)。
数値は所有権を気にすることなくコピーできます。所有権は要するにメモリを確保したアドレスを管理などするわけですが、数値の場合アドレス1個持つのと同じだけ1個の値を持っているだけで、同じ1個だからです。
fn main() { let i1 = 1975; let i2 = i1; println!("{}",i1); // エラーなし println!("{}",i2); // エラーなし }
参照
次のサンプルコードのように所有権を「参照」させれば所有権を無くすことなく所有権を参照することができます。参照するためには変数の前に「&」を付けます。s1変数から所有権は無くなりません。
fn main() { let s1 = String::from("参照"); let s2 = &s1; println!("{}",s1); // エラーなし println!("{}",s2); // エラーなし }
借用
関数の引数に参照を取ることを「借用」といいます。「s_func」関数の引数の前に「&」を付けることで関数の中で借用した引数を参照できます。s1変数から所有権は無くなりません。
fn main() { let s1 = String::from("借用"); s_func(&s1); println!("{}",s1); // エラーなし } fn s_func(s: &String) { println!("{}",s); // エラーなし }
コラム:Think ITでTauri 1.0に関する連載していました
筆者は以前インプレス社の「Think IT」でTauri1.0の連載を15回していました。Tauri 1.0は、Tauri 2.0とは互換性がないため、CodeZineではTauri 2.0の連載を書いております。Tauri 1.0もうまく移植すれば、Tauri 2.0でも動作すると思います。興味がある方は「Tauri+Rustではじめるデスクトップアプリ開発」を確認してみてください。
まとめ
今回は最低限知っておくべきRustの基本的な文法について解説しました。今回解説した文法だけで、本連載のバックエンドのRustプログラミングだけなら大体できると思います。
ここで解説した「所有権」の内容を理解しただけでは、一度もエラーを起こさずプログラミングすることが不可能なので、エラーが出るたびにエラーの内容を見て修正して体で覚えるしかないです。筆者もいまだに所有権のエラーは避けては通れないです。
次回は、フロントエンドのWebページを作成するための「HTML5+CSS+JavaScript」の最低限知っておくべき文法を解説します。フロントエンドはWebページと言うだけあって見た目を作ります。