【发布时间】:2023-03-19 19:39:01
【问题描述】:
试图通过编写解析器来学习 Rust,但是这个错误让我很生气:
ast.rs(7, 11): this trait cannot be made into an object...
ast.rs(7, 29): ...because it requires `Self: Sized`
ast.rs(16, 5): the trait `ast::ast::Statement` cannot be made into an object
代码如下:
use crate::token::token;
pub trait Node {
fn token_literal(&mut self) -> String;
}
pub trait Statement: Node + Clone {
fn statement_node(&mut self);
}
pub trait Expression: Node + Clone {
fn expression_node(&mut self);
}
pub struct Program {
pub statements: Vec<Box<dyn Statement>>,
}
我想知道为什么它一直抱怨我关于 Sized 特征,我使用 Box 来避免它和生命周期?
我不想为 Program 结构使用泛型
pub struct Program<T: Statement> {
pub statements: Vec<T>
}
因为当我从函数返回 Program 时,它会抱怨我出现某种错误,例如
“它需要 1 个参数但得到 0”
【问题讨论】:
-
@E_net4isdownhausted 所以你是说
Box因为克隆特性而变得无效?但为什么?我想当我们克隆一个 Box 时,我们克隆了指针本身,这甚至不能满足我的需求,但足以让编译器不抱怨。 Box 不是指针的一种吗? -
“我想当我们克隆一个 Box 时,我们克隆了指针本身” 这是不正确的,
Box提供了指向值的唯一所有权,所以即使克隆要求拥有的值是可克隆的。为了实现共享所有权,可以改用引用计数智能指针:Rc或Arc。 -
@E_net4isdownhausted 但是使用
Vec<Arc<dyn Statement>>,而不是Vec<Box<dyn Statement>>也没有解决问题。而且我明白,如果我使用引用计数指针克隆一个未调整大小的对象,它会克隆引用,而不是我的值是对的吗? -
确实如此。请尝试重复目标中的解决方案。
标签: memory-management struct rust compiler-errors traits