Я пытаюсь создать функцию, которая возвращает экземпляр черты Shader
. Вот мой резко упрощенный код:
trait Shader {}
struct MyShader;
impl Shader for MyShader {}
struct GraphicsContext;
impl GraphicsContext {
fn create_shader(&self) -> Shader {
let shader = MyShader;
shader
}
}
fn main() {}
Однако я получаю следующую ошибку:
error[E0277]: the trait bound 'Shader + 'static: std::marker::Sized' is not satisfied
--> src/main.rs:10:32
|
10 | fn create_shader(&self) -> Shader {
| ^^^^^^ 'Shader + 'static' does not have a constant size known at compile-time
|
= help: the trait 'std::marker::Sized' is not implemented for 'Shader + 'static'
= note: the return type of a function must have a statically known size
В более новых версиях компилятора есть эта ошибка:
error[E0277]: the size for values of type '(dyn Shader + 'static)' cannot be known at compilation time
--> src/main.rs:9:32
|
9 | fn create_shader(&self) -> Shader {
| ^^^^^^ does not have a size known at compile-time
|
= help: the trait 'std::marker::Sized' is not implemented for '(dyn Shader + 'static)'
= note: to learn more, visit <https://doc.rust-lang.org/book/ch19-04-advanced-types.html#dynamically-sized-types-and-the-sized-trait>
= note: the return type of a function must have a statically known size
Это имеет смысл, так как компилятор не знает размер черты, но нигде не могу найти рекомендуемый способ исправить это.
Насколько я знаю, возвращение ссылки с &
не сработает, потому что ссылка переживет жизнь своего создателя.
Возможно, мне нужно использовать Box<T>
?