私は現在、異なる分類モデルを評価するために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
が故にx
がsome_foo
前を落とします、some_foo
後を作成しているという事実のために(と思う)です。 some_foo
の作成が解決される前に発生するように、x
の作成を移動します。それが不可能であると仮定しましょう。
コードがsome_foo: Box<Baz>
の場合はまだ有効ではありませんが、some_foo: Box<Foo<&Smth>>
の場合はまだ有効ではありません。コンパイラが知ることができないのは何ですか(それ以外の場合は不平を言う必要はありません)?あなたがcrossvalidateしたいモデルのコレクションを持っているので、
は、x, y
は(X, Y)
大きなのサブセットである、すなわちmodel.fit(x, y)
を¹しました。
感謝を導き出すことができなかった理由はたぶん他の誰かを説明することができ、I any/all構文について知らなかった: – Tedil
タイプとメソッドの両方のレベルで* same * lifetimeを使用する際に問題がある。何らかの「アンカーリング」を引き起こします。私は、例えば動かない価値を作るためにトリックの使用を見てきました。一般に、これが出現するたびに設計上の問題があることを意味します。 –
@MatthieuM。私はそう思っていました。そのようなAPIを制限するのは私にとっては奇妙に思えました。しかし、私はちょうど錆を学び始めて以来、私が問題だったのか、APIが – Tedil