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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 23:04:51