私は形質上で連鎖可能な変換をしようとしていますが、いくつかの問題があります。形質上の機能の連鎖
私は、フォームの変換関数の束があります
fn transform<T: MyTrait>(in: T) -> impl MyTrait
をそして私は私が私がこの機能
を書かれているlet mut val: Box<MyTrait> = ...;
val = chain(val, transform1);
val = chain(val, transform2);
...
を行うことができます機能chain
をしたい
fn chain<T, U, F>(val: Box<T>, f: F) -> Box<MyTrait>
where T: MyTrait,
U: MyTrait,
F: FnOnce(T) -> U {
Box::new(f(*val))
}
コンパイルすると、借用チェッカーは、タイプパラメータU十分に長く生きていない。私は私の特性限界が私が望むものであると確信しています。生涯の指定子で様々なことを試したので、私はこだわっています:(
PS:MyTrait
に汎用のchain
関数を作ることはできますか?私はその中で述べてきたようで、彼の答えに、@クリス・エマーソンが提案した修正を追加しました
:それが可能だとは思いませんが、私たちは...
EDITを知っていることはありませんかコメント、私は解決できないように見える別の問題を明らかにした。
Hereはこの記事を乱雑にしないためのコードの要点です。要するに
、問題がある:チェーン機能はBox<T>
オブジェクト間接参照する必要があり、変換関数にT
を渡すので、T
はSized
なければなりません。しかし、この機能の全体的なポイントは、任意の(そしてコンパイル時には未知の)実装を使用できるようにすることでした。たとえば、次のように
let mut val: Box<MyTrait> = ...;
//here we can know the type inside the Box
if ... {
val = chain(val, transform);
}
//but here we don't know anymore
//(its either the original type,
//or the type returned by transform)
変換関数は、& Tまたは& MUT T(それができない、私は出力を生成するための入力を消費する必要があるとして)を取ることができない限り、このデザインが動作しないことができます。
私は混乱しています、 'T'と' U'は異なる形質であるはずですか? – LinearZoetrope
@ Jsor:おそらく、ここではFが変圧器であると仮定します。 –
@MatthieuM。私は彼らが実際に同じ形質の2つの実装の間で変換し、それをボックス化された形質オブジェクトに変換したいと思っています。 – LinearZoetrope