rust: スカラ型に所有権移動はあるのか?
目次
最終更新日:2025/11/14
「所有権」と「昇龍拳」は似てるな、と益体もないことを思った(やったことないけど)。
プリミティブなスカラ型
私は「プリミティブ型」を struct とか class みたいなものではなく、言語が元々から持っている型、というイメージで使っている。
こちらのリンクではさらに「スカラ型」と「複合型」に分類されている。
気になったのは、スカラ型の変数は所有権の移動とかなさそうだけどどうなんだ?である。
borrow() の引数は & を付けていないがそれ以降でも渡した変数は使えているのでたぶん移動していない。
fn main() {
let a: i32 = 10;
let b = borrow(a);
let c = a * b;
println!("a={a}, b={b}, c={c}");
}
pub fn borrow(r: i32) -> i32 {
r * 2
}
String はダメだった。format! のところで d が使えない。
fn main() {
let d = "hello".to_string();
let e = borrow2(d);
let f = format!("{d}{e}");
println!("d={d}, e={e}, f={f}");
}
pub fn borrow2(s: String) -> String {
s + "!"
}
2025/11/14追記
調べたら、これは単に Copy トレイトが実装されているから自動で複製が作られているだけらしい。
なのでスカラ型とかそういうくくりではないということだ。
違う書き方をすれば、Copy トレイトを実装していると所有権の放棄ができないことになる。
これ以降使わないのに!ということができない。
それに複製処理も行われるので、必要ないなら参照で渡した方がよさそう。
そういう意味では、積極的に所有権を移動させるのではなく参照にしておいて、どうしようもないときだけ移動させるようにするのがよいだろう。
- スカラ型 : Copyトレイトに任せる
- 所有権の移動が必要 : 移動させる
- それ以外 :
&か&mut
writer: hiro99ma