0

特性と所有権の操作方法を理解するのに苦労しています。次の例が機能します。

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)ます。私の期待は、タイプを特性に置き換えると、すべてがうまくいくということでした。

4

1 に答える 1

3

問題は、 に渡そうとしていること&&Tですf2。つまり&T、実装することを期待していますXTが、それはあなたが言ったことではありませんT。実装すると言いましたXT

f1を使用してこの制約を適切に表現するように変更できますが、実装されていないため、から呼び出すことはできません。そのための実装も追加するとコードが機能します...しかし、正直なところ、それを削除して代わりに呼び出す方が簡単です。where T: XT, for<'a> &'a T: XTf1main&XXT&f2(x)

別の言い方をすれば、型が特性を実装しているからといって、その型へのポインタも特性を実装しているとは限りません

于 2015-09-27T05:13:29.503 に答える