pub struct Ref<'b, T: ?Sized + 'b> { /* private fields */ }
Expand description
在 RefCell
box 中将借用的引用括起来。
从 RefCell<T>
不变借来的值的包装器类型。
有关更多信息,请参见 模块级文档。
Implementations§
source§impl<'b, T: ?Sized> Ref<'b, T>
impl<'b, T: ?Sized> Ref<'b, T>
1.15.0 · sourcepub fn clone(orig: &Ref<'b, T>) -> Ref<'b, T>
pub fn clone(orig: &Ref<'b, T>) -> Ref<'b, T>
复制一个 Ref
。
RefCell
已经被不可改变地借用了,因此这不会失败。
这是一个关联函数,需要用作 Ref::clone(...)
。
Clone
的实现或方法将干扰 r.borrow().clone()
的广泛使用,以克隆 RefCell
的内容。
1.8.0 · sourcepub fn map<U: ?Sized, F>(orig: Ref<'b, T>, f: F) -> Ref<'b, U>where
F: FnOnce(&T) -> &U,
pub fn map<U: ?Sized, F>(orig: Ref<'b, T>, f: F) -> Ref<'b, U>where F: FnOnce(&T) -> &U,
1.63.0 · sourcepub fn filter_map<U: ?Sized, F>(
orig: Ref<'b, T>,
f: F
) -> Result<Ref<'b, U>, Self>where
F: FnOnce(&T) -> Option<&U>,
pub fn filter_map<U: ?Sized, F>( orig: Ref<'b, T>, f: F ) -> Result<Ref<'b, U>, Self>where F: FnOnce(&T) -> Option<&U>,
为借用数据的可选组件制作新的 Ref
。
如果闭包返回 None
,则原始守卫将作为 Err(..)
返回。
RefCell
已经被不可改变地借用了,因此这不会失败。
这是一个关联函数,需要用作 Ref::filter_map(...)
。
方法会干扰通过 Deref
使用的 RefCell
内容中的同名方法。
Examples
use std::cell::{RefCell, Ref};
let c = RefCell::new(vec![1, 2, 3]);
let b1: Ref<'_, Vec<u32>> = c.borrow();
let b2: Result<Ref<'_, u32>, _> = Ref::filter_map(b1, |v| v.get(1));
assert_eq!(*b2.unwrap(), 2);
Run1.35.0 · sourcepub fn map_split<U: ?Sized, V: ?Sized, F>(
orig: Ref<'b, T>,
f: F
) -> (Ref<'b, U>, Ref<'b, V>)where
F: FnOnce(&T) -> (&U, &V),
pub fn map_split<U: ?Sized, V: ?Sized, F>( orig: Ref<'b, T>, f: F ) -> (Ref<'b, U>, Ref<'b, V>)where F: FnOnce(&T) -> (&U, &V),
将 Ref
拆分为多个 Ref
,以用于借用数据的不同组成部分。
RefCell
已经被不可改变地借用了,因此这不会失败。
这是一个关联函数,需要用作 Ref::map_split(...)
。
方法会干扰通过 Deref
使用的 RefCell
内容中的同名方法。
Examples
use std::cell::{Ref, RefCell};
let cell = RefCell::new([1, 2, 3, 4]);
let borrow = cell.borrow();
let (begin, end) = Ref::map_split(borrow, |slice| slice.split_at(2));
assert_eq!(*begin, [1, 2]);
assert_eq!(*end, [3, 4]);
Runsourcepub fn leak(orig: Ref<'b, T>) -> &'b T
🔬This is a nightly-only experimental API. (cell_leak
#69099)
pub fn leak(orig: Ref<'b, T>) -> &'b T
cell_leak
#69099)转换为对底层数据的引用。
底层的 RefCell
永远不会再被可变借用,并且总是看起来已经是不可更改的借用。
泄漏超过一定数量的引用不是一个好主意。
如果总共只发生了少量的泄漏,则可以再次借用 RefCell
。
这是一个关联函数,需要用作 Ref::leak(...)
。
方法会干扰通过 Deref
使用的 RefCell
内容中的同名方法。
Examples
#![feature(cell_leak)]
use std::cell::{RefCell, Ref};
let cell = RefCell::new(0);
let value = Ref::leak(cell.borrow());
assert_eq!(*value, 0);
assert!(cell.try_borrow().is_ok());
assert!(cell.try_borrow_mut().is_err());
Run