SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

フロントエンジニアのためのTauri 2.0ではじめるRustプログラミング

デスクトップアプリ開発に必要な「Rust」の文法を理解しよう

フロントエンジニアのための「Tauri 2.0」ではじめるRustプログラミング 第2回

  • X ポスト
  • このエントリーをはてなブックマークに追加

所有権について

 Page 1とPage 2は一般のプログラミング言語とよく似ているのでそれほど難しくなかったかと思います。しかし、このPage 3の所有権は一般のプログラミング言語とは全く違います。所有権はちょっと難しいですが、所有権のおかげでメモリの管理が正確に行え、極めてメモリリークが起きにくくなっています。

 Rustでは所有権がある間だけメモリにアクセスできます。所有権には「ムーブ」と「クローン」と「コピー」と「参照」と「借用」があって、以下のそれぞれのサンプルコードでは第1回でも言ったようにmain()関数などのスコープの間だけ所有権が保持されます。

ムーブ

 次のサンプルコードを実行してください。エラーが出るはずです。一般のプログラミング言語で似たようなコードを書いたら起きないエラーです。なぜエラーが起きたのでしょうか?それは「s1」変数が確保した所有権が「s2」変数に渡って、s1変数にはもう所有権がないからです。

 ただし「println!("{}",s1);」を「println!("{}",s2);」に書き換えたらエラーは起きません。なぜならs2変数は所有権を渡されて保持しているからです。Rustでは所有権を持っている変数だけが値を使うことができます。

所有権のムーブのサンプルコード:「tauri2_move」→「src」→「main.rs」
fn main() {
    let s1 = String::from("ムーブ");
    let s2 = s1;
    println!("{}",s1); // エラー!
}

クローン

 先の「所有権のムーブのサンプルコード」のエラーを無くすには、次のサンプルコードのように「clone()」を使います。所有権を「クローン(細胞の増殖)」することで、s1変数から所有権がなくなることなく増殖したものをs2変数へ渡すことができます。

所有権のクローンのサンプルコード:「tauri2_clone」→「src」→「main.rs」
fn main() {
    let s1 = String::from("クローン");
    let s2 = s1.clone();
    println!("{}",s1); // エラーなし
    println!("{}",s2); // エラーなし
}

コピー

 所有権のムーブにおいても例外があります。それは「数値」をムーブする「コピー」の場合です(この場合実際には所有権はムーブしません)。

 数値は所有権を気にすることなくコピーできます。所有権は要するにメモリを確保したアドレスを管理などするわけですが、数値の場合アドレス1個持つのと同じだけ1個の値を持っているだけで、同じ1個だからです。

所有権のコピーのサンプルコード:「tauri2_copy」→「src」→「main.rs」
fn main() {
    let i1 = 1975;
    let i2 = i1;
    println!("{}",i1); // エラーなし
    println!("{}",i2); // エラーなし
}

参照

 次のサンプルコードのように所有権を「参照」させれば所有権を無くすことなく所有権を参照することができます。参照するためには変数の前に「&」を付けます。s1変数から所有権は無くなりません。

所有権の参照のサンプルコード:「tauri2_sanshou」→「src」→「main.rs」
fn main() {
    let s1 = String::from("参照");
    let s2 = &s1;
    println!("{}",s1); // エラーなし
    println!("{}",s2); // エラーなし
}

借用

 関数の引数に参照を取ることを「借用」といいます。「s_func」関数の引数の前に「&」を付けることで関数の中で借用した引数を参照できます。s1変数から所有権は無くなりません。

所有権の参照と借用のサンプルコード:「tauri2_shakuyou」→「src」→「main.rs」
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ページと言うだけあって見た目を作ります。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
フロントエンジニアのためのTauri 2.0ではじめるRustプログラミング連載記事一覧
この記事の著者

大西 武(オオニシ タケシ)

 1975年香川県生まれ。大阪大学経済学部経営学科中退。プログラミング入門書などを30冊以上商業出版する作家。ドコモでグランプリなどコンテストに20回以上入賞するアーティスト。オリジナルの間違い探し「3Dクイズ」がTVで約10回出題。プロフィールサイト:https://profile.vixar.jp

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

CodeZine編集部(コードジンヘンシュウブ)

CodeZineは、株式会社翔泳社が運営するソフトウェア開発者向けのWebメディアです。「デベロッパーの成長と課題解決に貢献するメディア」をコンセプトに、現場で役立つ最新情報を日々お届けします。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/20608 2024/12/25 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング