rustt怎么不显示服务器,Rust Box<T>

Rust Box

Box 是一个智能指针,指向在类型为T的堆上分配的数据。Box 允许将数据存储在堆而不是堆栈上。

Box 是一个拥有的指针。

除了将数据存储在堆上之外,Box没有性能开销。

当Box离开作用域时,会调用析构函数来销毁所有内部对象并释放内存。

使用Box 将数据存储在堆上。

主要是,Box 用于在堆上存储数据。下面通过一个简单的例子来理解这一点:

fn main()

{

let a = Box :: new(1);

print!("value of a is : {}",a);

}

执行上面示例代码,得到以下结果 -

value of a is : 1

在上面的例子中,a包含指向数据1的Box的值。如果访问Box的值,则程序打印‘1’。 当程序结束时,Box被解除分配。Box存储在堆栈中,它指向的数据存储在堆上。

下面来看看上面例子的图解表示:

57ddc7c6d91730409aff8bb034a861fd.png

Cons列表

Cons代表“构造功能”。

Cons列表是一个数据结构,用于从两个参数构造一个新对,这对称为List。

假设有两个元素x和y,那么cons函数cons “x到y” 表示通过首先放置元素x,然后是元素y来构造新容器。

Cons列表包含两个元素,即当前项和最后一项。 由于Nil不包含下一个项目,因此缺点列表的最后一项是Nil。

现在,创建包含cons列表的枚举。

enum List

{

cons(i32, List),

Nil,

}

在上面的代码中,创建了List类型的枚举,其中包含i32值的cons列表数据结构。

现在,在以下示例中使用上面的List类型:

enum List {

Cons(i32, List),

Nil,

}

use List::{Cons, Nil};

fn main()

{

let list = List::Cons(1,Cons(2,Cons(3,Nil)));

for i in list.iter()

{

print!("{}",i);

}

}

执行上示例代码,得到以下结果 -

d584b454199bf6856f1829a488ab14f6.png

在上面的示例中,Rust编译器抛出错误“具有无限大小”,因为List类型包含递归的变体。 因此,Rust无法找出存储List值所需的空间。 使用Box 可以克服无限大小的问题。

使用Box 获取递归类型的大小

Rust无法确定存储递归数据类型需要多少空间。 Rust编译器在前一种情况下显示错误:

= help: insert indirection (e.g., a 'Box', 'Rc', or '&') at some point to make 'List' representable

在上面的例子中,可以使用Box 指针,因为编译器知道Box 指针需要多少空间。 Box 指针的大小在程序执行期间不会改变。 Box 指针指向将存储在堆上而不是cons变量中的List值。 Box 指针可以直接放在cons变量中。

e3e99a4745b19a00d7659d1adc2a501e.png

下面来看一个简单的例子 -

#[derive(Debug)]

enum List {

Cons(i32, Box),

Nil,

}

use List::{Cons, Nil};

fn main()

{

let list = Cons(1,Box::new(Cons(2,Box::new(Cons(3,Box::new(Nil))))));

print!("{:?}",list);

}

执行上面示例代码,得到以输出结果如下 -

Cons(1, Cons(2, Cons(3, Nil)))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值