gpt4 book ai didi

rust - assert_eq 的可变和不可变借用问题

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

我正在将 LEDDriver 的一些 C 测试代码重写为 Rust。

struct LEDDriver<'a> {
address: &'a mut u32,
}

impl<'a> LEDDriver<'a> {
fn new(address: &'a mut u32) -> Self {
let leddriver = LEDDriver { address: address };
*leddriver.address = 0;
leddriver
}
}

fn driver_init_leds_off() {
let ref mut addr = 0xffffffff;
let leddriver = LEDDriver::new(addr);

assert_eq!(0, *addr);
}

您可以运行示例 here

问题在于要求 ref 不可变的 assert 语句,但我将 mut ref 传递给 LEDDriver 以清除地址。

最佳答案

由于这是一个最小化的示例,我不确定它是否符合您的实际用例,但您可以只使用 *leddriver.address 而不是 *addr在数据被借用后访问数据(因为 leddriver 是借用它的人)


您还可以使用 Cell,它不会产生任何内存或运行时开销,但会阻止对内部值的引用。

use std::cell::Cell;

struct LEDDriver<'a> {
address: &'a Cell<u32>,
}

impl<'a> LEDDriver<'a> {
fn new(address: &'a Cell<u32>) -> Self {
let leddriver = LEDDriver { address: address };
leddriver.address.set(0);
leddriver
}
}

fn driver_init_leds_off() {
let ref mut addr = Cell::new(0xffffffff);
let leddriver = LEDDriver::new(addr);

assert_eq!(0, addr.get());
}

如果 addr 的内存位置将被传递给硬件或从中断中修改你应该使用 Volatile,否则 Rust 被允许假设多个 addr.get() 中间没有 addr.set() 会产生相同的结果,即使硬件或中断可能已经改变了它

关于rust - assert_eq 的可变和不可变借用问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47412267/

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