【问题标题】:Rust - How to use unsized trait objects in structs [duplicate]Rust - 如何在结构中使用未调整大小的特征对象 [重复]
【发布时间】: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 提供了指向值的唯一所有权,所以即使克隆要求拥有的值是可克隆的。为了实现共享所有权,可以改用引用计数智能指针:RcArc
  • @E_net4isdownhausted 但是使用Vec&lt;Arc&lt;dyn Statement&gt;&gt;,而不是Vec&lt;Box&lt;dyn Statement&gt;&gt; 也没有解决问题。而且我明白,如果我使用引用计数指针克隆一个未调整大小的对象,它会克隆引用,而不是我的值是对的吗?
  • 确实如此。请尝试重复目标中的解决方案。

标签: memory-management struct rust compiler-errors traits


【解决方案1】:

【讨论】:

    猜你喜欢
    • 2022-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-11
    • 2016-10-05
    相关资源
    最近更新 更多