gpt4 book ai didi

rust - 在没有 Ref::map 的情况下将 Ref 返回到 Rc>

转载 作者:行者123 更新时间:2023-12-03 11:27:54 27 4
gpt4 key购买 nike

首先是工作代码:

use std::cell::{Ref, RefCell};
use std::rc::Rc;

struct ValueHolder {
value: i32
}

fn give_value(wrapped: &Rc<RefCell<ValueHolder>>) -> Ref<i32> {
Ref::map(
(**wrapped).borrow(),
|borrowed| { &(*borrowed).value },
)
}

fn main() {
println!("Our value: {}", *give_value(
&Rc::new(RefCell::new(ValueHolder { value: 1337 }))
));
}
相关部分是 give_value功能。
我想返回 RefRc<RefCell<>> 里面的东西,在这种情况下是结构内部的值。
效果很好,但是由于我刚开始学习 Rust,我想知道如何在不使用 Ref::map 的情况下实现相同的目标.
“天真的”方法:
fn give_value(wrapped: &Rc<RefCell<ValueHolder>>) -> &i32 {
&(*(**wrapped).borrow()).value
}
失败的原因很明显:
error[E0515]: cannot return value referencing temporary value
--> src/bin/rust_example.rs:9:5
|
9 | &(*(**wrapped).borrow()).value
| ^^^--------------------^^^^^^^
| | |
| | temporary value created here
| returns a value referencing data owned by the current function
所以我的问题是:我怎样才能重新创建 Ref::map功能自己做吗?

最佳答案

你不能。 RefCell要求 Ref每当使用该值时都会使用它,因此它知道何时应该允许借用。当Ref被丢弃,它向 RefCell 发出信号它可以减少借用计数,如果借用计数为 0,则可能发生可变借用。能够获得对不借用 Ref 的内部数据的引用(请注意,您可以从函数返回的引用不能借用 Ref 否则您将引用临时的)将是有问题的,因为那样 Ref可能会被丢弃,RefCell认为它可以借出一个可变的借用,但仍然有一个不可变的借用数据。 Ref::map 的源代码是:

pub fn map<U: ?Sized, F>(orig: Ref<'b, T>, f: F) -> Ref<'b, U>
where
F: FnOnce(&T) -> &U,
{
Ref { value: f(orig.value), borrow: orig.borrow }
}
它使用您无法访问的私有(private)字段。所以,不,你不能重新创建 Ref::map你自己。

关于rust - 在没有 Ref::map 的情况下将 Ref 返回到 Rc<RefCell<>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64921525/

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