我知道特徵和切片是未分級的,即不可能在編譯時知道它們的大小,例如,任何類型都可以實現特徵,但是這種類型可能沒有規模。實現尺寸的特徵
不過,這個例子代碼是不是表示實現特徵Foo
的每個類型都需要執行Sized
呢?
trait Foo : Sized {}
struct Bar(i64);
impl Foo for Bar {}
如果是這樣,爲什麼不能正常工作?
impl From<Foo> for Bar {
fn from(foo: Foo) -> Bar {
Bar(64)
}
}
src\lib.rs:9:1: 15:2 error: the trait `core::marker::Sized` is not implemented for the type `Foo` [E0277]
src\lib.rs:9 impl From<Foo> for Bar
src\lib.rs:10 {
src\lib.rs:11 fn from(foo: Foo) -> Bar {
src\lib.rs:13 Bar(64)
src\lib.rs:14 }
...
src\lib.rs:9:1: 15:2 note: `Foo` does not have a constant size known at compile-time
src\lib.rs:9 impl From<Foo> for Bar
src\lib.rs:10 {
src\lib.rs:11 fn from(foo: Foo) -> Bar {
src\lib.rs:13 Bar(64)
src\lib.rs:14 }
我想怎麼辦 - 提供對庫類型的消費者(允許其命名爲酒吧),並有可能轉換到從實現特定性狀的任何其他類型的酒吧(讓將其命名爲Foo)。
我實際上是通過將Foo傳遞給引用而不是值來解決它的,儘管我不完全確定爲什麼編譯器會抱怨,如果從實現者需要Sized。