Struct std::cell::RefMut

1.0.0 · source ·
pub struct RefMut<'b, T>where
    T: 'b + ?Sized,{ /* private fields */ }
Expand description

RefCell<T> 可变借来的值的包装器类型。

有关更多信息,请参见 模块级文档

Implementations§

source§

impl<'b, T> RefMut<'b, T>where T: ?Sized,

1.8.0 · source

pub fn map<U, F>(orig: RefMut<'b, T>, f: F) -> RefMut<'b, U>where F: FnOnce(&mut T) -> &mut U, U: ?Sized,

为借用数据的一个组件 (例如一个枚举变体) 创建一个新的 RefMut

RefCell 已经是可变借用的,因此这不会失败。

这是一个关联函数,需要用作 RefMut::map(...)。 方法会干扰通过 Deref 使用的 RefCell 内容中的同名方法。

Examples
use std::cell::{RefCell, RefMut};

let c = RefCell::new((5, 'b'));
{
    let b1: RefMut<'_, (u32, char)> = c.borrow_mut();
    let mut b2: RefMut<'_, u32> = RefMut::map(b1, |t| &mut t.0);
    assert_eq!(*b2, 5);
    *b2 = 42;
}
assert_eq!(*c.borrow(), (42, 'b'));
Run
1.63.0 · source

pub fn filter_map<U, F>( orig: RefMut<'b, T>, f: F ) -> Result<RefMut<'b, U>, RefMut<'b, T>>where F: FnOnce(&mut T) -> Option<&mut U>, U: ?Sized,

为借用数据的可选组件制作新的 RefMut。 如果闭包返回 None,则原始守卫将作为 Err(..) 返回。

RefCell 已经是可变借用的,因此这不会失败。

这是一个关联函数,需要用作 RefMut::filter_map(...)。 方法会干扰通过 Deref 使用的 RefCell 内容中的同名方法。

Examples
use std::cell::{RefCell, RefMut};

let c = RefCell::new(vec![1, 2, 3]);

{
    let b1: RefMut<'_, Vec<u32>> = c.borrow_mut();
    let mut b2: Result<RefMut<'_, u32>, _> = RefMut::filter_map(b1, |v| v.get_mut(1));

    if let Ok(mut b2) = b2 {
        *b2 += 2;
    }
}

assert_eq!(*c.borrow(), vec![1, 4, 3]);
Run
1.35.0 · source

pub fn map_split<U, V, F>( orig: RefMut<'b, T>, f: F ) -> (RefMut<'b, U>, RefMut<'b, V>)where F: FnOnce(&mut T) -> (&mut U, &mut V), U: ?Sized, V: ?Sized,

RefMut 拆分为多个 RefMut,以用于借用数据的不同组成部分。

底层 RefCell 将保持可变借用状态,直到两个返回的 RefMut 离开作用域。

RefCell 已经是可变借用的,因此这不会失败。

这是一个关联函数,需要用作 RefMut::map_split(...)。 方法会干扰通过 Deref 使用的 RefCell 内容中的同名方法。

Examples
use std::cell::{RefCell, RefMut};

let cell = RefCell::new([1, 2, 3, 4]);
let borrow = cell.borrow_mut();
let (mut begin, mut end) = RefMut::map_split(borrow, |slice| slice.split_at_mut(2));
assert_eq!(*begin, [1, 2]);
assert_eq!(*end, [3, 4]);
begin.copy_from_slice(&[4, 3]);
end.copy_from_slice(&[2, 1]);
Run
source

pub fn leak(orig: RefMut<'b, T>) -> &'b mut T

🔬This is a nightly-only experimental API. (cell_leak #69099)

转换为底层数据的可变引用。

底层 RefCell 不能再次借用,并且将始终显示为已经被可变借用,使得返回的引用成为内部的唯一引用。

这是一个关联函数,需要用作 RefMut::leak(...)。 方法会干扰通过 Deref 使用的 RefCell 内容中的同名方法。

Examples
#![feature(cell_leak)]
use std::cell::{RefCell, RefMut};
let cell = RefCell::new(0);

let value = RefMut::leak(cell.borrow_mut());
assert_eq!(*value, 0);
*value = 1;

assert!(cell.try_borrow_mut().is_err());
Run

Trait Implementations§

source§

impl<T> Debug for RefMut<'_, T>where T: Debug + ?Sized,

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

使用给定的格式化程序格式化该值。 Read more
source§

impl<T> Deref for RefMut<'_, T>where T: ?Sized,

§

type Target = T

解引用后的结果类型。
source§

fn deref(&self) -> &T

解引用值。
source§

impl<T> DerefMut for RefMut<'_, T>where T: ?Sized,

source§

fn deref_mut(&mut self) -> &mut T

可变地解引用该值。
1.20.0 · source§

impl<T> Display for RefMut<'_, T>where T: Display + ?Sized,

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

使用给定的格式化程序格式化该值。 Read more
source§

impl<'b, T, U> CoerceUnsized<RefMut<'b, U>> for RefMut<'b, T>where T: Unsize<U> + ?Sized, U: ?Sized,

Auto Trait Implementations§

§

impl<'b, T> !RefUnwindSafe for RefMut<'b, T>

§

impl<'b, T> !Send for RefMut<'b, T>

§

impl<'b, T> !Sync for RefMut<'b, T>

§

impl<'b, T: ?Sized> Unpin for RefMut<'b, T>

§

impl<'b, T> !UnwindSafe for RefMut<'b, T>

Blanket Implementations§

source§

impl<T> Any for Twhere T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

获取 selfTypeIdRead more
source§

impl<T> Borrow<T> for Twhere T: ?Sized,

source§

fn borrow(&self) -> &T

从拥有的值中一成不变地借用。 Read more
source§

impl<T> BorrowMut<T> for Twhere T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

从拥有的值中借用。 Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

返回未更改的参数。

source§

impl<T, U> Into<U> for Twhere U: From<T>,

source§

fn into(self) -> U

调用 U::from(self)

也就是说,这种转换是 From<T> for U 实现选择执行的任何操作。

source§

impl<T> ToString for Twhere T: Display + ?Sized,

source§

default fn to_string(&self) -> String

将给定值转换为 StringRead more
source§

impl<T, U> TryFrom<U> for Twhere U: Into<T>,

§

type Error = Infallible

发生转换错误时返回的类型。
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

执行转换。
source§

impl<T, U> TryInto<U> for Twhere U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

发生转换错误时返回的类型。
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

执行转换。