如何在Rust中使用未Sized类型?求创建BarUse实例的可行代码
解决BarUse实例创建问题
Bar<[i32]>是动态大小类型(DST),这类类型无法直接在栈上存储或作为值传递,包含它的BarUse同样属于DST,因此不能直接创建栈上实例,必须通过指针或引用间接持有。
以下是几种可行的实现方式:
方式1:使用Box在堆上分配实例
struct Bar<T: ?Sized>(T); struct BarUse(Bar<[i32]>); fn main() { // 将BarUse实例分配到堆上,通过Box持有 let bar_use = Box::new(BarUse(Bar([1, 2, 3]))); // 访问内部元素 println!("数组第一个元素:{}", bar_use.0.0[0]); }
方式2:使用引用借用栈上实例
struct Bar<T: ?Sized>(T); struct BarUse(Bar<[i32]>); fn main() { let arr = [1, 2, 3]; let bar = Bar(arr); // 创建BarUse的引用(借用栈上的DST实例) let bar_use_ref = &BarUse(bar); // 访问内部元素 println!("数组第一个元素:{}", bar_use_ref.0.0[0]); }
方式3:使用智能指针共享所有权(如Rc)
如果需要多所有者共享实例,可以用Rc:
use std::rc::Rc; struct Bar<T: ?Sized>(T); struct BarUse(Bar<[i32]>); fn main() { let bar_use = Rc::new(BarUse(Bar([1, 2, 3]))); let bar_use_clone = Rc::clone(&bar_use); println!("数组第一个元素:{}", bar_use_clone.0.0[0]); }
核心逻辑:动态大小类型没有固定的编译期大小,Rust不允许直接将这类类型放在栈上或作为值传递,必须通过指针类型间接管理它们的存储。
内容的提问来源于stack exchange,提问作者Benjamin
相关产品推荐
相关产品推荐

