私は、参照または所有された値を返すために実装できるメソッドを使って特性を定義しようとしています。以下のような参照または所有された値を返すために実装できるTraitメソッド
何か:&Type
は生涯の指定が欠落しているので、
struct Type;
trait Trait {
type Value;
fn f(&self) -> Self::Value;
}
impl Trait for() {
type Value = Type;
fn f(&self) -> Self::Value {
Type
}
}
impl Trait for (Type,) {
type Value = &Type; // error[E0106]: missing lifetime specifier
fn f(&self) -> Self::Value {
&self.0
}
}
コードのこの作品は、しかし動作しません。 &Type
の寿命を&self
(つまりfn f<'a>(&'a self) -> &'a Type
)と同じにしたいと思いますが、これをRustで表現する方法はわかりません。
私はこのコードを動作させるためにいくつかの方法を見つけることができたが、私はそれらのいずれかを愛していない:
特性自体に明示的な寿命を追加:
trait Trait<'a> { type Value; fn f<'b>(&'b self) -> Self::Value where 'b: 'a; } impl<'a> Trait<'a> for() { type Value = Type; fn f<'b>(&'b self) -> Self::Value where 'b: 'a { Type } } impl<'a> Trait<'a> for (Type,) { type Value = &'a Type; fn f<'b>(&'b self) -> Self::Value where 'b: 'a { &self.0 } }
私はこの解決策が気に入らないのは、
Trait
を使用しているものは明示的な生存期間が必要であり(本質的に必要ではないと考えています)、その特性は実装するのが不必要に複雑であるようです。trait Trait { type Value; fn f<'a>(&'a self) -> Cow<'a, Self::Value>; } impl Trait for() { type Value = Type; fn f<'a>(&'a self) -> Cow<'a, Self::Value> { Cow::Owned(Type) } } impl Trait for (Type,) { type Value = Type; fn f<'a>(&'a self) -> Cow<'a, Self::Value> { Cow::Borrowed(&self.0) } }
私は、このソリューションの好きではないこと
().f()
がCow<_>
であるということである:私はに().f().into_owned()
をコールする必要があると思いstd::borrow::Cow
のような -または参照ではないかもしれないかもしれない何かを返します私の
Type
を入手してください。これは不要なようです(特性オブジェクトとしてTrait
を使用すると、実行時のオーバーヘッドが無視される可能性があります)。はまた、それが
Self::Value
が要件の強すぎるこれ、ToOwned
(したがって、事実上、Clone
)を実装することを必要とするためCow
が良くないことに注意してください。そのような制約なしでCow
の代替案を実装するのは、とにかく簡単です。
この問題の解決方法はありますか?標準/最も一般的なものは何ですか?
「形質自体に明示的な生存時間を追加する」は、私がそれを行う方法とまったく同じです。なぜなら、あなたがなぜ「本質的に必要ではないと信じるのか」を説明することができます。なぜなら、私にとっては、値が出た後に参照を使用することを避けるために、生涯を「自己」型に結びつける必要があります範囲の。 – Shepmaster
@Shepmaster:ああ、あなたは 'trait Trait 'を意味する。<'a> {type Value; fn f(& 'a self) - > Self :: Value; } '?私はそれを試したと確信していた、それは動作しませんでしたが、明らかに私は非常に間違っています。とにかく、あなたのコメントを読んで、 '' b''を使わずに特性を定義すると、 '' a''が特性の本質的なものである必要があることがわかりました。 – peoro
うん、 '' impl Trait <'static> ){...} 'が、それ以外は... – Shepmaster