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

Rust中从装箱对象集合返回*mut MyObject指针编译报错

Rust 编译错误解决:Vec<Box> 返回 *mut MyObject 类型问题

问题描述

我有一个装箱对象的集合:objects: Vec<Box<MyObject>>,想要实现一个返回*mut MyObject类型的函数,写了如下代码:

for object in self.objects.iter()
{
    if object.name == new_object_name
    {
        return &mut *object;
    }
}

return std::ptr::null_mut();

编译时return行报错:expected struct MyObject, found struct Box``,该怎么解决?

解决方法

问题根源在于迭代器的选择和类型转换逻辑:

  • iter()返回的是不可变引用迭代器,拿到的object是&Box<MyObject>,既无法获取可变引用,类型转换也不符合预期。
  • 正确的做法是改用可变迭代器,并正确转换为原始指针:

修正后的代码(简洁版)

for object in self.objects.iter_mut() {
    if object.name == new_object_name {
        return object.as_mut(); // 利用Box的as_mut()直接获取*mut MyObject
    }
}

std::ptr::null_mut()

手动转换写法

如果想手动处理解引用和指针转换,也可以这么写:

for object in self.objects.iter_mut() {
    if object.name == new_object_name {
        return &mut **object as *mut MyObject;
    }
}

std::ptr::null_mut()

关键要点

  1. 使用iter_mut():遍历Vec的可变引用,确保能操作内部Box的可变权限
  2. Box::as_mut()方法:这是Rust标准库提供的方法,直接返回内部对象的可变原始指针,比手动解引用更安全简洁
  3. 手动转换逻辑:&mut **object的过程是:先把&mut Box<MyObject>解引用为Box<MyObject>,再解引用为MyObject,最后取可变引用并强制转换为*mut MyObject

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 20:35:23