如何向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
相关产品推荐
相关产品推荐

