So che i tratti e le sezioni non sono standardizzati, vale a dire che non è possibile conoscere le loro dimensioni al momento della compilazione, ad es. qualsiasi tipo può implementare un tratto, ma quel tipo potrebbe non essere ridimensionato.Implementazione del tratto dimensionato
Tuttavia, questo codice di esempio non significa che ogni tipo che implementa il tratto Foo
deve implementare anche Sized
?
trait Foo : Sized {}
struct Bar(i64);
impl Foo for Bar {}
Se è così, perché non funziona?
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 }
Quello che volevo fare - fornire al consumatore della biblioteca un tipo (lascia denominarlo Bar), e permettono di convertire in barre da qualsiasi altro tipo che implementa particolare Trait (lascia chiamalo Foo).
In realtà ho risolto passando Foo dal riferimento anziché dal valore, anche se non ero del tutto sicuro del motivo per cui il compilatore si lamenta, se è richiesto dagli implementatori alle dimensioni.