オブジェクトの安全性の基本に苦労しています。このコードがあれば
struct S {
x: i32,
}
trait Trait: Sized {
fn f(&self) -> i32
where
Self: Sized;
}
fn object_safety_dynamic(x: Trait) {}
私は受け取ります
error[E0038]: the trait `Trait` cannot be made into an object
--> src/lib.rs:11:29
|
5 | trait Trait: Sized {
| ----- ----- ...because it requires `Self: Sized`
| |
| this trait cannot be made into an object...
...
11 | fn object_safety_dynamic(x: Trait) {}
| ^^^^^ the trait `Trait` cannot be made into an object
: Sized
をスーパートレイトとして、または のバインドとして追加または削除すると、f
わずかに異なるエラー メッセージが表示されます。
誰かが説明できますか:
この特定の例が機能しないのはなぜですか? 特徴オブジェクトの章では、次のように述べています。
では、メソッドをオブジェクトセーフにするものは何ですか? 各メソッドは、
Self: Sized
満たされているのではないですか?
Trait: Sized
とはどう違いwhere Self: Sized
ますか?(そうですね、一方はトレイトを継承し、もう一方はパラメーター バインドですが、Rust のトレイト オブジェクトの観点からは?私が仕事をしなければならなかった好ましい変更は何
object_safety_dynamic
ですか?
気が向いrustc 1.19.0-nightly (01951a61a 2017-05-20)
たら使っています。
固定サイズに関するコメントへの対応。
trait TraitB {
fn f(&self) -> i32
where
Self: Sized;
fn g<T>(&self, t: T) -> i32
where
Self: Sized;
}