今月は、Rustで理解が難しい「鬼門」とよく言われる「所有権」や「ライフタイム」といった概念を解説する。これらはルールを知っただけではなかなか理解するのが難しい概念だ。習うより慣れろの精神で体得していくのがよいと筆者は考えている。サンプルコードを動かしながら読み進めてほしい。
所有権の問題を抱えるプログラムを体感する
まずは、所有権を体感してみよう。次のプログラムは、構造体を宣言し、それをある関数に渡して何らかの処理を行った後、元の変数にひもづく構造体を使って標準出力しようとするものだ。
struct Article {
// 記事のタイトル
title: String,
// 記事の要約
description: String,
// 著者
author: String,
// 記事の本文
body: Vec<u8>,
}
// 記事のタイトル、著者、記事の要約を出力する関数
// 構造体Articleを受け取る
fn print_meta_info(article: Article) {
println!("title: {}, author: {}", article.title, article.author);
println!("description: {}", article.description);
}
fn display_body(article: Article) {
println!("{}", std::str::from_utf8(&article.body).unwrap());
}
fn main() {
let article = Article {
title: "Rustで作るWebアプリケーション".to_string(),
description: "Rustで実際にWebアプリケーションを作りながら、Rustの魅力を伝える記事です。"
.to_string(),
author: "Yuki Toyoda".to_string(),
body: "ここに記事の内容が入ります。以下続く。".as_bytes().to_vec(),
};
print_meta_info(article);
display_body(article);
}
他のプログラミング言語に慣れている読者は、このプログラムには何の問題もないと思うはずだ。最初の関数呼び出しで記事のメタ情報を標準出力し、次の関数呼び出しで記事の本文を標準出力しようとしている。