Я собираюсь дать признак в качестве аргумента, чтобы сохранить его с помощью метода contructor под названием new
.'static: std :: marker :: Sized` не удовлетворен - мне нужно вставить?
Черта для типа структуры приведена в качестве аргумента здесь:
визуализатора .RS
use super::shapes::Shape;
pub struct Renderer;
impl Renderer{
pub fn set_shape<T : Shape>(&self, shape: T) -> T::Builder{
T::Builder::new(shape)
}
}
тогда застройщик из Builder
указанных соответствующего типа будет называться
shapebuilder.rs
use super::shapes::Shape;
use super::shapes::Rectangle;
pub trait ShapeBuilder{
fn new<T:Shape>(shape: T) -> Self;
}
pub struct RectangleBuilder{
shape: Shape<Builder=RectangleBuilder>
}
impl ShapeBuilder for RectangleBuilder{
fn new<T:Shape>(shape: T) -> Self{
RectangleBuilder{
shape: shape as Rectangle
}
}
}
в этот момент я уже хочу, чтобы указать на вывод компилятора
compiler_output
error[E0277]: the trait bound `shapes::Shape<Builder=shapebuilder::RectangleBuilder> + 'static: std::marker::Sized` is not satisfied
--> shapes.rs:14:6
|
14 | impl Shape for Rectangle{
| ^^^^^
|
= note: `shapes::Shape<Builder=shapebuilder::RectangleBuilder> + 'static` does not have a constant size known at compile-time
= note: required because it appears within the type `shapebuilder::RectangleBuilder`
= note: required by `shapes::Shape`
error: aborting due to previous error
я нашел подобные вопросы здесь, на SO, который сказал что-то о боксе. Я попытался вставить каждый тип параметра, чтобы решить проблему. Вставьте его вот так: shape: Box<T>
. Нет успеха. Нужно ли мне вообще боксировать? Я понимаю, что компилятор не может решить размер признака, поскольку конкретные/конкретные типы структуры могут иметь разные размеры в зависимости от их поля/свойств. Тем не менее я не могу найти решение. Надеюсь, это тривиально.
НЕ выполнявшие модули (мое мнение) перечислены для полноты
shapes.rs
use super::shapebuilder::ShapeBuilder;
use super::shapebuilder::RectangleBuilder;
pub trait Shape{
type Builder: ShapeBuilder;
}
#[derive(Clone, Copy)]
pub struct Rectangle{
pub height: usize,
pub width: usize,
}
impl Shape for Rectangle{
type Builder = RectangleBuilder;
}
lib.rs
pub mod renderer;
mod shapes;
mod shapebuilder;
Это самый маленький пример, который вы можете сделать? Попытайтесь изолировать конкретную проблему, которая сделает ее более понятной как для вас, так и для нас. – Aurora0001
'renderer.rs' и' shapebuilder.rs' уже как можно меньше и единственные * важные * данные. Материал, начинающийся с заголовка ** NOT invested modules ... ** - как я уже упоминал, - только для полноты, потому что люди задавали другой вопрос, чтобы все модули собирали и тестировали сами. Пожалуйста, сначала прочитайте все заголовки. – xetra11
Я не думаю, что вы правильно поняли мою точку зрения - ваш текущий пример кода не минимален и содержит импорт из ваших других файлов. Чтобы сделать ваш вопрос более ясным, вы должны найти часть своего кода, вызывающую вашу проблему, и ** полностью избавиться от остальных **, чтобы сделать более простой пример, который по-прежнему имеет ту же проблему. Как бы то ни было, мне нужно будет скопировать все ваши файлы и структуру каталогов в проект, чтобы даже воспроизвести вашу проблему, что было бы необязательно, если бы вы изолировали проблему больше. – Aurora0001