2017-12-13 8 views
4

私は現在、異なる分類モデルを評価するためにrustlearnを使用しています。私は基本的に走った問題はこれに沸く:なぜコンパイラは特性とその実装の寿命が異なるのでしょうか?

trait Foo<T> { 
    fn bar(&self, x: T); 
} 

struct Baz; 

struct Smth; 

impl<'a> Foo<&'a Smth> for Baz { 
    fn bar(&self, x: &Smth) {} 
} 

fn main() { 
    let some_foo: Box<Baz> = Box::new(Baz {}); // ok 
    // let some_foo: Box<Foo<&Smth>> = Box::new(Baz {}); // not ok 
    let x = Smth {}; 
    some_foo.bar(&x); 
} 

Box<Baz>としてsome_fooを入力することは可能ですが、それはコンパイラがおよそ&xドロップされて文句を言うことになりますから、代わりにBox<Foo<&Smth>>を使用することはできません( mainの末尾に)まだ借りている間に(bar)。これは、xが故にxsome_fooを落とします、some_fooを作成しているという事実のために(と思う)です。 some_fooの作成が解決される前に発生するように、xの作成を移動します。それが不可能であると仮定しましょう。

コードがsome_foo: Box<Baz>の場合はまだ有効ではありませんが、some_foo: Box<Foo<&Smth>>の場合はまだ有効ではありません。コンパイラが知ることができないのは何ですか(それ以外の場合は不平を言う必要はありません)?あなたがcrossvalidateしたいモデルのコレクションを持っているので、


は、x, y(X, Y)大きなのサブセットである、すなわちmodel.fit(x, y)を¹しました。

答えて

3

箱入り形質オブジェクトは、Smthへの参照のためのすべてのライフタイムで作業する必要があります。

let some_foo: Box<for<'a> Foo<&'a Smth>> = Box::new(Baz {}); 

コンパイラが作業寿命:)

+0

感謝を導き出すことができなかった理由はたぶん他の誰かを説明することができ、I any/all構文について知らなかった: – Tedil

+0

タイプとメソッドの両方のレベルで* same * lifetimeを使用する際に問題がある。何らかの「アンカーリング」を引き起こします。私は、例えば動かない価値を作るためにトリックの使用を見てきました。一般に、これが出現するたびに設計上の問題があることを意味します。 –

+0

@MatthieuM。私はそう思っていました。そのようなAPIを制限するのは私にとっては奇妙に思えました。しかし、私はちょうど錆を学び始めて以来、私が問題だったのか、APIが – Tedil

関連する問題