特性と所有権の操作方法を理解するのに苦労しています。次の例が機能します。
struct X([u8; 4]);
impl X {
pub fn get(&self, n: usize) -> u8 {
self.0[n]
}
}
fn f1(x: &X) {
println!("{}", x.get(1));
f2(&x);
}
fn f2(x: &X) {
println!("{}", x.get(2));
}
fn main() {
let z1 = X([1u8, 2u8, 3u8, 4u8]);
f1(&z1);
}
しかし、次のように特性 (ここXT
) を作成しようとするとget
:
trait XT {
fn get(&self, n: usize) -> u8;
}
struct X([u8; 4]);
impl XT for X {
fn get(&self, n: usize) -> u8 {
self.0[n]
}
}
fn f1<T: XT>(x: &T) {
println!("{}", x.get(1));
f2(&x);
}
fn f2<T: XT>(x: &T) {
println!("{}", x.get(2));
}
fn main() {
let z1 = X([1u8, 2u8, 3u8, 4u8]);
f1(&z1);
}
次のエラー メッセージが表示されてコンパイルに失敗します。
タイプの特性
XT
が実装されていません&T
に変更f2(&x)
すると動作しf2(x)
ます。私の期待は、タイプを特性に置き換えると、すべてがうまくいくということでした。