You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向DynamicVector添加结构体Item实例?Mojo语法求助

问题解答

错误原因

你遇到的报错是因为Item属于memory-only类型——Mojo中默认结构体是memory-only,这类类型无法被复制或移动,而DynamicVector.push_back()要求接收可复制/可移动的实例,因此无法绑定参数。

解决方案

有两种方式可以解决这个问题,其中第二种正好对应你想要的C++ vector::emplace()用法:

方法1:将Item标记为值类型

用@value装饰器标记结构体,Mojo会自动为其生成复制语义,这样就能直接用push_back():

@value
struct Item:
    var name: StringLiteral

    fn __init__(inout self):
        self.name = "Unnamed"

fn main():
    var dv = DynamicVector[Item]()
    var it = Item()
    dv.push_back(it)

方法2:使用emplace_back()直接构造

DynamicVector提供了emplace_back()方法,和C++的emplace功能一致——直接在容器的内存空间中构造对象,无需复制/移动操作:

struct Item:
    var name: StringLiteral

    fn __init__(inout self):
        self.name = "Unnamed"

fn main():
    var dv = DynamicVector[Item]()
    dv.emplace_back()  # 直接调用默认构造函数在容器内创建对象

如果你的Item有带参数的构造函数,也可以直接传递构造参数:

struct Item:
    var name: StringLiteral

    fn __init__(inout self, name: StringLiteral):
        self.name = name

fn main():
    var dv = DynamicVector[Item]()
    dv.emplace_back("Apple")  # 传递构造参数直接构造

内容的提问来源于stack exchange,提问作者user529327

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 08:47:13