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()
关键要点
- 使用
iter_mut():遍历Vec的可变引用,确保能操作内部Box的可变权限 Box::as_mut()方法:这是Rust标准库提供的方法,直接返回内部对象的可变原始指针,比手动解引用更安全简洁- 手动转换逻辑:
&mut **object的过程是:先把&mut Box<MyObject>解引用为Box<MyObject>,再解引用为MyObject,最后取可变引用并强制转换为*mut MyObject
内容的提问来源于stack exchange,提问作者Sero Mirzakhanyan
相关产品推荐
相关产品推荐

