gpt4 book ai didi

oop - 在 Rust 中更改枚举的字段

转载 作者:行者123 更新时间:2023-11-29 08:00:07 24 4
gpt4 key购买 nike

我是 Rust 的新手,但我正在尝试弄清楚如何修改枚举的实例。由于其他原因,我需要使用托管框,但它似乎很难更改枚举的字段。

#[feature(managed_boxes)];

enum State { A(int), B }

fn main() {
let mut state = @A(123);

match *state {
A(ref mut i) => { *i = 456 }
B => { }
}
println!("{:?}", state)
}

我得到错误不能将不可变的匿名字段借用为可变的mut 似乎只说明变量 state 是可变的。我想告诉 Rust 整个事情是可变的。我发现强制不变性是 Rust 最烦人的事情之一。

最佳答案

不久前,托管盒装有自己的可变性“层次结构”。以下代码用于当时的工作:

#[feature(managed_boxes)];

enum State { A(int), B }

fn main() {
let state = @mut A(123);

match *state {
A(ref mut i) => { *i = 456 }
B => { }
}
println!("{:?}", state)
}

但是托管框计划从该语言中删除。在当前的 Rust 版本中,@mut 不是有效的标记。您必须使用 RefCell,这是一个可变单元格,它在托管指针内提供可变性。目前它看起来有点像这样:

#[feature(managed_boxes)];
use std::cell::RefCell;

enum State { A(int), B }

fn main() {
let state = @RefCell::new(A(123));

{
let mut r = state.borrow_mut();
match r.get() {
&A(ref mut i) => { *i = 456 }
&B => { }
}
}

println!("{:?}", state)
}

虽然你会在终端上得到相当多的输出,因为它会打印 RefCell 结构的内部结构。有关单元格及其使用方法的更多信息,请参阅 documentation on std::cell 模块。

在未来,Rust 根本不会为托管框提供特殊语法。垃圾收集将在图书馆实现。我相信代码看起来像这样(Rust 作者,如果我错了请纠正我):

use std::cell::RefCell;

enum State { A(int), B }

fn main() {
// state is of type Gc<RefCell<State>>
let state = box(Gc) RefCell::new(A(123));

// Dereference will work for library pointer types, not sure about autodereference
let mut r = (*state).borrow_mut();
match r.get() {
&A(ref mut i) => { *i = 456 }
&B => { }
}

println!("{:?}", *state)
}

关于oop - 在 Rust 中更改枚举的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21157408/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com