作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
首先是工作代码:
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
功能。
Ref
到
Rc<RefCell<>>
里面的东西,在这种情况下是结构内部的值。
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/
到目前为止,我已经生成了以下代码来尝试将相关数据整合在一起。 但是,使用“+ 7”函数会产生以下问题。 Registration date = '2018-01-01' 它正在推迟 2018-04-0
我已经成功地将我的自定义购物车发布到 PayPal——它处理订单非常漂亮,当收到付款时,它会将数据发回我在配置中指定的 URL。代码基于此处找到的库:http://www.phpfour.com/bl
我是一名优秀的程序员,十分优秀!