Struct alloc::rc::Rc

1.0.0 · source ·
pub struct Rc<T: ?Sized> { /* private fields */ }
Expand description

单线程引用计数指针。Rc 代表引用计数。

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

Rc 的固有方法都是关联函数,这意味着您必须以例如 Rc::get_mut(&mut value) 而不是 value.get_mut() 的方式调用它们。 这样可以避免与内部类型 T 的方法发生冲突。

Implementations§

source§

impl<T> Rc<T>

source

pub fn new(value: T) -> Rc<T>

创建一个新的 Rc<T>

Examples
use std::rc::Rc;

let five = Rc::new(5);
Run
1.60.0 · source

pub fn new_cyclic<F>(data_fn: F) -> Rc<T>where F: FnOnce(&Weak<T>) -> T,

创建一个新的 Rc<T>,同时给您一个分配的 Weak<T>,以允许您创建一个 T,它持有一个指向自身的弱指针。

通常,直接或间接循环引用自身的结构体不应该对自身持有强引用以防止内存泄漏。 使用这个函数,您可以在 T 的初始化过程中,在 Rc<T> 创建之前访问弱指针,这样您就可以将它克隆并存储在 T 中。

new_cyclic 先给 Rc<T> 分配托管分配,然后调用您的闭包,给这个分配一个 Weak<T>,然后再把您的闭包返回的 T 放入分配中,完成 Rc<T> 的构建。

由于新的 Rc<T>Rc<T>::new_cyclic 返回之前尚未完全构造,因此在闭包内的弱引用上调用 upgrade 将失败并导致 None 值。

Panics

如果 data_fn 发生 panic,panic 会传播给调用者,而临时的 Weak<T> 会被正常丢弃。

Examples
use std::rc::{Rc, Weak};

struct Gadget {
    me: Weak<Gadget>,
}

impl Gadget {
    /// 创建一个引用计数的 Gadget。
    fn new() -> Rc<Self> {
        // `me` 是指向我们正在构建的 `Rc` 的新分配的 `Weak<Gadget>`。
        Rc::new_cyclic(|me| {
            // 在此处创建实际的结构体。
            Gadget { me: me.clone() }
        })
    }

    /// 返回一个指向 Self 的引用计数指针。
    fn me(&self) -> Rc<Self> {
        self.me.upgrade().unwrap()
    }
}
Run
source

pub fn new_uninit() -> Rc<MaybeUninit<T>>

🔬This is a nightly-only experimental API. (new_uninit #63291)

创建一个具有未初始化内容的新 Rc

Examples
#![feature(new_uninit)]
#![feature(get_mut_unchecked)]

use std::rc::Rc;

let mut five = Rc::<u32>::new_uninit();

// 延迟初始化:
Rc::get_mut(&mut five).unwrap().write(5);

let five = unsafe { five.assume_init() };

assert_eq!(*five, 5)
Run
source

pub fn new_zeroed() -> Rc<MaybeUninit<T>>

🔬This is a nightly-only experimental API. (new_uninit #63291)

创建一个具有未初始化内容的新 Rc,并用 0 字节填充内存。

有关正确和不正确使用此方法的示例,请参见 MaybeUninit::zeroed

Examples
#![feature(new_uninit)]

use std::rc::Rc;

let zero = Rc::<u32>::new_zeroed();
let zero = unsafe { zero.assume_init() };

assert_eq!(*zero, 0)
Run
source

pub fn try_new(value: T) -> Result<Rc<T>, AllocError>

🔬This is a nightly-only experimental API. (allocator_api #32838)

创建一个新的 Rc<T>,如果分配失败,则返回错误

Examples
#![feature(allocator_api)]
use std::rc::Rc;

let five = Rc::try_new(5);
Run
source

pub fn try_new_uninit() -> Result<Rc<MaybeUninit<T>>, AllocError>

🔬This is a nightly-only experimental API. (allocator_api #32838)

用未初始化的内容构造一个新的 Rc,如果分配失败,则返回错误

Examples
#![feature(allocator_api, new_uninit)]
#![feature(get_mut_unchecked)]

use std::rc::Rc;

let mut five = Rc::<u32>::try_new_uninit()?;

// 延迟初始化:
Rc::get_mut(&mut five).unwrap().write(5);

let five = unsafe { five.assume_init() };

assert_eq!(*five, 5);
Run
source

pub fn try_new_zeroed() -> Result<Rc<MaybeUninit<T>>, AllocError>

🔬This is a nightly-only experimental API. (allocator_api #32838)

创建一个具有未初始化内容的新 Rc,并用 0 字节填充内存,如果分配失败,则返回错误

有关正确和不正确使用此方法的示例,请参见 MaybeUninit::zeroed

Examples
#![feature(allocator_api, new_uninit)]

use std::rc::Rc;

let zero = Rc::<u32>::try_new_zeroed()?;
let zero = unsafe { zero.assume_init() };

assert_eq!(*zero, 0);
Run
1.33.0 · source

pub fn pin(value: T) -> Pin<Rc<T>>

创建一个新的 Pin<Rc<T>>。 如果 T 未实现 Unpin,则 value 将被固定在内存中并且无法移动。

1.4.0 · source

pub fn try_unwrap(this: Self) -> Result<T, Self>

如果 Rc 正好有一个强引用,则返回内部值。

否则,返回的 Err 将与传入的 Rc 相同。

即使存在突出的弱引用,此操作也将成功。

Examples
use std::rc::Rc;

let x = Rc::new(3);
assert_eq!(Rc::try_unwrap(x), Ok(3));

let x = Rc::new(4);
let _y = Rc::clone(&x);
assert_eq!(*Rc::try_unwrap(x).unwrap_err(), 4);
Run
1.70.0 · source

pub fn into_inner(this: Self) -> Option<T>

如果 Rc 正好有一个强引用,则返回内部值。

否则,返回 NoneRc 为丢弃。

即使存在突出的弱引用,此操作也将成功。

如果在这个 Rc 的每个克隆上调用 Rc::into_inner,则可以保证恰好有一个调用返回内部值。

这特别意味着内部值不是丢弃。

这相当于 Rc::try_unwrap(this).ok()。 (请注意,由于不适用于 Rc 的竞争状态,这些并不等同于 Arc。)

source§

impl<T> Rc<[T]>

source

pub fn new_uninit_slice(len: usize) -> Rc<[MaybeUninit<T>]>

🔬This is a nightly-only experimental API. (new_uninit #63291)

创建一个新的带有未初始化内容的引用计数的切片。

Examples
#![feature(new_uninit)]
#![feature(get_mut_unchecked)]

use std::rc::Rc;

let mut values = Rc::<[u32]>::new_uninit_slice(3);

// 延迟初始化:
let data = Rc::get_mut(&mut values).unwrap();
data[0].write(1);
data[1].write(2);
data[2].write(3);

let values = unsafe { values.assume_init() };

assert_eq!(*values, [1, 2, 3])
Run
source

pub fn new_zeroed_slice(len: usize) -> Rc<[MaybeUninit<T>]>

🔬This is a nightly-only experimental API. (new_uninit #63291)

用未初始化的内容创建一个新的带有引用计数的切片,内存中填充 0 字节。

有关正确和不正确使用此方法的示例,请参见 MaybeUninit::zeroed

Examples
#![feature(new_uninit)]

use std::rc::Rc;

let values = Rc::<[u32]>::new_zeroed_slice(3);
let values = unsafe { values.assume_init() };

assert_eq!(*values, [0, 0, 0])
Run
source§

impl<T> Rc<MaybeUninit<T>>

source

pub unsafe fn assume_init(self) -> Rc<T>

🔬This is a nightly-only experimental API. (new_uninit #63291)

转换为 Rc<T>

Safety

MaybeUninit::assume_init 一样,由调用者负责确保内部值确实处于初始化状态。

在内容尚未完全初始化时调用此方法会立即导致未定义的行为。

Examples
#![feature(new_uninit)]
#![feature(get_mut_unchecked)]

use std::rc::Rc;

let mut five = Rc::<u32>::new_uninit();

// 延迟初始化:
Rc::get_mut(&mut five).unwrap().write(5);

let five = unsafe { five.assume_init() };

assert_eq!(*five, 5)
Run
source§

impl<T> Rc<[MaybeUninit<T>]>

source

pub unsafe fn assume_init(self) -> Rc<[T]>

🔬This is a nightly-only experimental API. (new_uninit #63291)

转换为 Rc<[T]>

Safety

MaybeUninit::assume_init 一样,由调用者负责确保内部值确实处于初始化状态。

在内容尚未完全初始化时调用此方法会立即导致未定义的行为。

Examples
#![feature(new_uninit)]
#![feature(get_mut_unchecked)]

use std::rc::Rc;

let mut values = Rc::<[u32]>::new_uninit_slice(3);

// 延迟初始化:
let data = Rc::get_mut(&mut values).unwrap();
data[0].write(1);
data[1].write(2);
data[2].write(3);

let values = unsafe { values.assume_init() };

assert_eq!(*values, [1, 2, 3])
Run
source§

impl<T: ?Sized> Rc<T>

1.17.0 · source

pub fn into_raw(this: Self) -> *const T

消耗 Rc,返回包装的指针。

为避免内存泄漏,必须使用 Rc::from_raw 将指针转换回 Rc

Examples
use std::rc::Rc;

let x = Rc::new("hello".to_owned());
let x_ptr = Rc::into_raw(x);
assert_eq!(unsafe { &*x_ptr }, "hello");
Run
1.45.0 · source

pub fn as_ptr(this: &Self) -> *const T

为数据提供裸指针。

计数不会受到任何影响,并且不会消耗 Rc。 只要 Rc 中存在大量计数,指针就有效。

Examples
use std::rc::Rc;

let x = Rc::new("hello".to_owned());
let y = Rc::clone(&x);
let x_ptr = Rc::as_ptr(&x);
assert_eq!(x_ptr, Rc::as_ptr(&y));
assert_eq!(unsafe { &*x_ptr }, "hello");
Run
1.17.0 · source

pub unsafe fn from_raw(ptr: *const T) -> Self

从裸指针构造 Rc<T>

裸指针必须事先由调用返回到 Rc<U>::into_raw,其中 U 的大小和对齐方式必须与 T 相同。 如果 UT,这是很简单的。 请注意,如果 U 不是 T,但是具有相同的大小和对齐方式,则基本上就像对不同类型的引用进行转换一样。 有关在这种情况下适用哪些限制的更多信息,请参见 mem::transmute

from_raw 的用户必须确保 T 的特定值仅被丢弃一次。

此函数不安全,因为使用不当可能会导致内存不安全,即使从未访问返回的 Rc<T> 也是如此。

Examples
use std::rc::Rc;

let x = Rc::new("hello".to_owned());
let x_ptr = Rc::into_raw(x);

unsafe {
    // 转换回 `Rc` 以防止泄漏。
    let x = Rc::from_raw(x_ptr);
    assert_eq!(&*x, "hello");

    // 进一步调用 `Rc::from_raw(x_ptr)` 将导致内存不安全。
}

// 当 `x` 超出上面的作用域时,其内存将被释放,所以 `x_ptr` 现在悬垂了!
Run
1.4.0 · source

pub fn downgrade(this: &Self) -> Weak<T>

创建一个指向该分配的新 Weak 指针。

Examples
use std::rc::Rc;

let five = Rc::new(5);

let weak_five = Rc::downgrade(&five);
Run
1.15.0 · source

pub fn weak_count(this: &Self) -> usize

获取指向该分配的 Weak 指针的数量。

Examples
use std::rc::Rc;

let five = Rc::new(5);
let _weak_five = Rc::downgrade(&five);

assert_eq!(1, Rc::weak_count(&five));
Run
1.15.0 · source

pub fn strong_count(this: &Self) -> usize

获取指向此分配的强 (Rc) 指针的数量。

Examples
use std::rc::Rc;

let five = Rc::new(5);
let _also_five = Rc::clone(&five);

assert_eq!(2, Rc::strong_count(&five));
Run
1.53.0 · source

pub unsafe fn increment_strong_count(ptr: *const T)

将与提供的指针关联的 Rc<T> 上的强引用计数增加 1。

Safety

指针必须是通过 Rc::into_raw 获得的,并且关联的 Rc 实例必须是有效的 (即 在此方法的持续时间内,强引用计数必须至少为 1)。

Examples
use std::rc::Rc;

let five = Rc::new(5);

unsafe {
    let ptr = Rc::into_raw(five);
    Rc::increment_strong_count(ptr);

    let five = Rc::from_raw(ptr);
    assert_eq!(2, Rc::strong_count(&five));
}
Run
1.53.0 · source

pub unsafe fn decrement_strong_count(ptr: *const T)

将与提供的指针关联的 Rc<T> 上的强引用计数减一。

Safety

指针必须是通过 Rc::into_raw 获得的,并且关联的 Rc 实例必须是有效的 (即 调用此方法时,强引用计数必须至少为 1)。 此方法可用于释放最终的 Rc 和后备存储,但不应在最终的 Rc 释放后调用。

Examples
use std::rc::Rc;

let five = Rc::new(5);

unsafe {
    let ptr = Rc::into_raw(five);
    Rc::increment_strong_count(ptr);

    let five = Rc::from_raw(ptr);
    assert_eq!(2, Rc::strong_count(&five));
    Rc::decrement_strong_count(ptr);
    assert_eq!(1, Rc::strong_count(&five));
}
Run
1.4.0 · source

pub fn get_mut(this: &mut Self) -> Option<&mut T>

如果没有其他 RcWeak 指向相同分配的指针,则返回给定 Rc 的可变引用。

否则返回 None,因为更改共享值并不安全。

另请参见 make_mut,当有其他 Rc 指针时,它将 clone 内部值。

Examples
use std::rc::Rc;

let mut x = Rc::new(3);
*Rc::get_mut(&mut x).unwrap() = 4;
assert_eq!(*x, 4);

let _y = Rc::clone(&x);
assert!(Rc::get_mut(&mut x).is_none());
Run
source

pub unsafe fn get_mut_unchecked(this: &mut Self) -> &mut T

🔬This is a nightly-only experimental API. (get_mut_unchecked #63292)

将变量引用返回给定的 Rc,而不进行任何检查。

另请参见 get_mut,它是安全的并且进行适当的检查。

Safety

如果存在指向同一分配的任何其他 RcWeak 指针,则在返回的借用期间,它们不得被解引用或具有活动借用,并且它们的内部类型必须与此 Rc 的内部类型完全相同 (包括生命周)。 如果不存在这样的指针 (例如紧接在 Rc::new 之后),则情况很简单。

Examples
#![feature(get_mut_unchecked)]

use std::rc::Rc;

let mut x = Rc::new(String::new());
unsafe {
    Rc::get_mut_unchecked(&mut x).push_str("foo")
}
assert_eq!(*x, "foo");
Run

指向同一分配的其他 Rc 指针必须指向同一类型。

#![feature(get_mut_unchecked)]

use std::rc::Rc;

let x: Rc<str> = Rc::from("Hello, world!");
let mut y: Rc<[u8]> = x.clone().into();
unsafe {
    // 这是未定义的行为,因为 x 的内部类型是 str,而不是 [u8]
    Rc::get_mut_unchecked(&mut y).fill(0xff); // 0xff 在 UTF-8 中无效
}
println!("{}", &*x); // str 中的 UTF-8 无效
Run

指向同一分配的其他 Rc 指针必须指向完全相同的类型,包括生命周期。

#![feature(get_mut_unchecked)]

use std::rc::Rc;

let x: Rc<&str> = Rc::new("Hello, world!");
{
    let s = String::from("Oh, no!");
    let mut y: Rc<&str> = x.clone().into();
    unsafe {
        // 这是未定义的行为,因为 x 的内部类型是 &'long str,而不是 &'short str
        *Rc::get_mut_unchecked(&mut y) = &s;
    }
}
println!("{}", &*x); // Use-after-free
Run
1.17.0 · source

pub fn ptr_eq(this: &Self, other: &Self) -> bool

如果两个 Rc 以类似于 ptr::eq 的方式指向相同的分配,则返回 true。 比较 dyn Trait 指针时的注意事项,请参见 that function

Examples
use std::rc::Rc;

let five = Rc::new(5);
let same_five = Rc::clone(&five);
let other_five = Rc::new(5);

assert!(Rc::ptr_eq(&five, &same_five));
assert!(!Rc::ptr_eq(&five, &other_five));
Run
source§

impl<T: Clone> Rc<T>

1.4.0 · source

pub fn make_mut(this: &mut Self) -> &mut T

对给定的 Rc 进行可变引用。

如果还有其他指向同一分配的 Rc 指针,则 make_mut 会将 clone 的内部值分配给新分配,以确保唯一的所有权。 这也称为写时克隆。

但是,如果没有其他指向此分配的 Rc 指针,而是一些 Weak 指针,则 Weak 指针将被解除关联,并且不会克隆内部值。

另请参见 get_mut,它将失败而不是克隆内部值或解除 Weak 指针的关联。

Examples
use std::rc::Rc;

let mut data = Rc::new(5);

*Rc::make_mut(&mut data) += 1;         // 不会克隆任何东西
let mut other_data = Rc::clone(&data); // 不会克隆内部数据
*Rc::make_mut(&mut data) += 1;         // 克隆内部数据
*Rc::make_mut(&mut data) += 1;         // 不会克隆任何东西
*Rc::make_mut(&mut other_data) *= 2;   // 不会克隆任何东西

// 现在,`data` 和 `other_data` 指向不同的分配。
assert_eq!(*data, 8);
assert_eq!(*other_data, 12);
Run

Weak 指针将被解除关联:

use std::rc::Rc;

let mut data = Rc::new(75);
let weak = Rc::downgrade(&data);

assert!(75 == *data);
assert!(75 == *weak.upgrade().unwrap());

*Rc::make_mut(&mut data) += 1;

assert!(76 == *data);
assert!(weak.upgrade().is_none());
Run
source

pub fn unwrap_or_clone(this: Self) -> T

🔬This is a nightly-only experimental API. (arc_unwrap_or_clone #93610)

如果我们有 T 的唯一引用,那就打开它。否则,克隆 T 并返回克隆。

假设 rc_tRc<T> 类型,这个函数在功能上等同于 (*rc_t).clone(),但会尽可能避免克隆内部值。

Examples
#![feature(arc_unwrap_or_clone)]
let inner = String::from("test");
let ptr = inner.as_ptr();

let rc = Rc::new(inner);
let inner = Rc::unwrap_or_clone(rc);
// 内部值没有被克隆
assert!(ptr::eq(ptr, inner.as_ptr()));

let rc = Rc::new(inner);
let rc2 = rc.clone();
let inner = Rc::unwrap_or_clone(rc);
// 因为有两个引用,我们不得不克隆内部值。
assert!(!ptr::eq(ptr, inner.as_ptr()));
// `rc2` 是最后一个引用,所以当我们打开它时,我们会得到原来的 `String`。
let inner = Rc::unwrap_or_clone(rc2);
assert!(ptr::eq(ptr, inner.as_ptr()));
Run
source§

impl Rc<dyn Any>

1.29.0 · source

pub fn downcast<T: Any>(self) -> Result<Rc<T>, Rc<dyn Any>>

尝试将 Rc<dyn Any> 转换为具体类型。

Examples
use std::any::Any;
use std::rc::Rc;

fn print_if_string(value: Rc<dyn Any>) {
    if let Ok(string) = value.downcast::<String>() {
        println!("String ({}): {}", string.len(), string);
    }
}

let my_string = "Hello World".to_string();
print_if_string(Rc::new(my_string));
print_if_string(Rc::new(0i8));
Run
source

pub unsafe fn downcast_unchecked<T: Any>(self) -> Rc<T>

🔬This is a nightly-only experimental API. (downcast_unchecked #90850)

Rc<dyn Any> 向下转换为具体类型。

有关安全的替代方案,请参见 downcast

Examples
#![feature(downcast_unchecked)]

use std::any::Any;
use std::rc::Rc;

let x: Rc<dyn Any> = Rc::new(1_usize);

unsafe {
    assert_eq!(*x.downcast_unchecked::<usize>(), 1);
}
Run
Safety

包含的值必须是 T 类型。 使用不正确的类型调用此方法是 未定义的行为

Trait Implementations§

1.5.0 · source§

impl<T: ?Sized> AsRef<T> for Rc<T>

source§

fn as_ref(&self) -> &T

将此类型转换为 (通常是推断的) 输入类型的共享引用。
source§

impl<T: ?Sized> Borrow<T> for Rc<T>

source§

fn borrow(&self) -> &T

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

impl<T: ?Sized> Clone for Rc<T>

source§

fn clone(&self) -> Rc<T>

克隆 Rc 指针。

这将创建另一个指向相同分配的指针,从而增加了强引用计数。

Examples
use std::rc::Rc;

let five = Rc::new(5);

let _ = Rc::clone(&five);
Run
source§

fn clone_from(&mut self, source: &Self)

source 执行复制分配。 Read more
source§

impl<T: ?Sized + Debug> Debug for Rc<T>

source§

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

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

impl<T: Default> Default for Rc<T>

source§

fn default() -> Rc<T>

TDefault 值创建一个新的 Rc<T>

Examples
use std::rc::Rc;

let x: Rc<i32> = Default::default();
assert_eq!(*x, 0);
Run
source§

impl<T: ?Sized> Deref for Rc<T>

§

type Target = T

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

fn deref(&self) -> &T

解引用值。
source§

impl<T: ?Sized + Display> Display for Rc<T>

source§

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

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

impl<T: ?Sized> Drop for Rc<T>

source§

fn drop(&mut self)

丢弃 Rc

这将减少强引用计数。 如果强引用计数达到零,那么唯一的其他引用 (如果有) 是 Weak,因此我们将 drop 作为内部值。

Examples
use std::rc::Rc;

struct Foo;

impl Drop for Foo {
    fn drop(&mut self) {
        println!("dropped!");
    }
}

let foo  = Rc::new(Foo);
let foo2 = Rc::clone(&foo);

drop(foo);    // 不打印任何东西
drop(foo2);   // 打印 "dropped!"
Run
1.21.0 · source§

impl<T: Clone> From<&[T]> for Rc<[T]>

source§

fn from(v: &[T]) -> Rc<[T]>

分配一个引用计数的切片,并通过克隆 v 的项来填充它。

Example
let original: &[i32] = &[1, 2, 3];
let shared: Rc<[i32]> = Rc::from(original);
assert_eq!(&[1, 2, 3], &shared[..]);
Run
1.24.0 · source§

impl From<&CStr> for Rc<CStr>

source§

fn from(s: &CStr) -> Rc<CStr>

通过将内容复制到新分配的 Rc 中,将 &CStr 转换为 Rc<CStr>

1.21.0 · source§

impl From<&str> for Rc<str>

source§

fn from(v: &str) -> Rc<str>

分配一个引用计数的字符串切片并将 v 复制到其中。

Example
let shared: Rc<str> = Rc::from("statue");
assert_eq!("statue", &shared[..]);
Run
1.21.0 · source§

impl<T: ?Sized> From<Box<T, Global>> for Rc<T>

source§

fn from(v: Box<T>) -> Rc<T>

将 boxed 对象移动到引用计数的新分配。

Example
let original: Box<i32> = Box::new(1);
let shared: Rc<i32> = Rc::from(original);
assert_eq!(1, *shared);
Run
1.24.0 · source§

impl From<CString> for Rc<CStr>

source§

fn from(s: CString) -> Rc<CStr>

通过将 CString 数据移动到新的 Arc 缓冲区中,将 CString 转换为 Rc<CStr>

1.45.0 · source§

impl<'a, B> From<Cow<'a, B>> for Rc<B>where B: ToOwned + ?Sized, Rc<B>: From<&'a B> + From<B::Owned>,

source§

fn from(cow: Cow<'a, B>) -> Rc<B>

通过复制其内容,从写时克隆指针创建一个引用计数指针。

Example
let cow: Cow<'_, str> = Cow::Borrowed("eggplant");
let shared: Rc<str> = Rc::from(cow);
assert_eq!("eggplant", &shared[..]);
Run
1.62.0 · source§

impl From<Rc<str>> for Rc<[u8]>

source§

fn from(rc: Rc<str>) -> Self

将引用计数的字符串切片转换为字节切片。

Example
let string: Rc<str> = Rc::from("eggplant");
let bytes: Rc<[u8]> = Rc::from(string);
assert_eq!("eggplant".as_bytes(), bytes.as_ref());
Run
1.21.0 · source§

impl From<String> for Rc<str>

source§

fn from(v: String) -> Rc<str>

分配一个引用计数的字符串切片并将 v 复制到其中。

Example
let original: String = "statue".to_owned();
let shared: Rc<str> = Rc::from(original);
assert_eq!("statue", &shared[..]);
Run
1.6.0 · source§

impl<T> From<T> for Rc<T>

source§

fn from(t: T) -> Self

泛型 T 改装成 Rc<T>

转换在堆上分配,并将 t 从栈移到堆中。

Example
let x = 5;
let rc = Rc::new(5);

assert_eq!(Rc::from(x), rc);
Run
1.21.0 · source§

impl<T> From<Vec<T, Global>> for Rc<[T]>

source§

fn from(v: Vec<T>) -> Rc<[T]>

分配一个引用计数的切片,并将 v 的项移入其中。

Example
let original: Box<Vec<i32>> = Box::new(vec![1, 2, 3]);
let shared: Rc<Vec<i32>> = Rc::from(original);
assert_eq!(vec![1, 2, 3], *shared);
Run
1.37.0 · source§

impl<T> FromIterator<T> for Rc<[T]>

source§

fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self

获取 Iterator 中的每个元素,并将其收集到 Rc<[T]> 中。

性能特点
一般情况

在一般情况下,首先要收集到 Vec<T> 中来收集到 Rc<[T]> 中。也就是说,编写以下内容时:

let evens: Rc<[u8]> = (0..10).filter(|&x| x % 2 == 0).collect();
Run

这就像我们写的那样:

let evens: Rc<[u8]> = (0..10).filter(|&x| x % 2 == 0)
    .collect::<Vec<_>>() // 第一组分配在此处发生。
    .into(); // `Rc<[T]>` 的第二个分配在此处进行。
Run

这将分配构造 Vec<T> 所需的次数,然后分配一次,以将 Vec<T> 转换为 Rc<[T]>

已知长度的迭代器

当您的 Iterator 实现 TrustedLen 且大小正确时,将为 Rc<[T]> 进行一次分配。例如:

let evens: Rc<[u8]> = (0..10).collect(); // 这里只进行一次分配。
Run
source§

impl<T: ?Sized + Hash> Hash for Rc<T>

source§

fn hash<H: Hasher>(&self, state: &mut H)

将该值输入给定的 HasherRead more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)where H: Hasher, Self: Sized,

将这种类型的切片送入给定的 Hasher 中。 Read more
source§

impl<T: ?Sized + Ord> Ord for Rc<T>

source§

fn cmp(&self, other: &Rc<T>) -> Ordering

两个 Rc 的比较。

通过调用 cmp() 的内部值来比较两者。

Examples
use std::rc::Rc;
use std::cmp::Ordering;

let five = Rc::new(5);

assert_eq!(Ordering::Less, five.cmp(&Rc::new(6)));
Run
1.21.0 · source§

fn max(self, other: Self) -> Selfwhere Self: Sized,

比较并返回两个值中的最大值。 Read more
1.21.0 · source§

fn min(self, other: Self) -> Selfwhere Self: Sized,

比较并返回两个值中的最小值。 Read more
1.50.0 · source§

fn clamp(self, min: Self, max: Self) -> Selfwhere Self: Sized + PartialOrd<Self>,

将值限制在某个时间间隔内。 Read more
source§

impl<T: ?Sized + PartialEq> PartialEq<Rc<T>> for Rc<T>

source§

fn eq(&self, other: &Rc<T>) -> bool

两个 Rc 相等。

即使两个 Rc 的内部值相等,即使它们存储在不同的分配中,它们也相等。

如果 T 还实现了 Eq (暗示相等的反射性),则指向同一分配的两个 `Rc’ 始终相等。

Examples
use std::rc::Rc;

let five = Rc::new(5);

assert!(five == Rc::new(5));
Run
source§

fn ne(&self, other: &Rc<T>) -> bool

两个 Rc 的不等式。

如果两个 Rc 的内部值不相等,则它们不相等。

如果 T 还实现了 Eq (暗示相等的反射性),则指向同一分配的两个 `Rc’ 始终相等。

Examples
use std::rc::Rc;

let five = Rc::new(5);

assert!(five != Rc::new(6));
Run
source§

impl<T: ?Sized + PartialOrd> PartialOrd<Rc<T>> for Rc<T>

source§

fn partial_cmp(&self, other: &Rc<T>) -> Option<Ordering>

两个 Rc 的部分比较。

通过调用 partial_cmp() 的内部值来比较两者。

Examples
use std::rc::Rc;
use std::cmp::Ordering;

let five = Rc::new(5);

assert_eq!(Some(Ordering::Less), five.partial_cmp(&Rc::new(6)));
Run
source§

fn lt(&self, other: &Rc<T>) -> bool

小于两个 Rc 的比较。

通过调用 < 的内部值来比较两者。

Examples
use std::rc::Rc;

let five = Rc::new(5);

assert!(five < Rc::new(6));
Run
source§

fn le(&self, other: &Rc<T>) -> bool

两个 Rc 的小于或等于比较。

通过调用 <= 的内部值来比较两者。

Examples
use std::rc::Rc;

let five = Rc::new(5);

assert!(five <= Rc::new(5));
Run
source§

fn gt(&self, other: &Rc<T>) -> bool

大于两个 Rc 的比较。

通过调用 > 的内部值来比较两者。

Examples
use std::rc::Rc;

let five = Rc::new(5);

assert!(five > Rc::new(4));
Run
source§

fn ge(&self, other: &Rc<T>) -> bool

两个 Rc 的大于或等于比较。

通过调用 >= 的内部值来比较两者。

Examples
use std::rc::Rc;

let five = Rc::new(5);

assert!(five >= Rc::new(5));
Run
source§

impl<T: ?Sized> Pointer for Rc<T>

source§

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

使用给定的格式化程序格式化该值。
1.43.0 · source§

impl<T, const N: usize> TryFrom<Rc<[T]>> for Rc<[T; N]>

§

type Error = Rc<[T]>

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

fn try_from(boxed_slice: Rc<[T]>) -> Result<Self, Self::Error>

执行转换。
source§

impl<T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<Rc<U>> for Rc<T>

source§

impl<T: ?Sized + Unsize<U>, U: ?Sized> DispatchFromDyn<Rc<U>> for Rc<T>

source§

impl<T: ?Sized + Eq> Eq for Rc<T>

1.58.0 · source§

impl<T: RefUnwindSafe + ?Sized> RefUnwindSafe for Rc<T>

source§

impl<T: ?Sized> !Send for Rc<T>

source§

impl<T: ?Sized> !Sync for Rc<T>

1.33.0 · source§

impl<T: ?Sized> Unpin for Rc<T>

1.9.0 · source§

impl<T: RefUnwindSafe + ?Sized> UnwindSafe for Rc<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<!> for T

source§

fn from(t: !) -> T

从输入类型转换为此类型。
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> ToOwned for Twhere T: Clone,

§

type Owned = T

获得所有权后的结果类型。
source§

fn to_owned(&self) -> T

从借用的数据创建拥有的数据,通常是通过克隆。 Read more
source§

fn clone_into(&self, target: &mut T)

使用借来的数据来替换拥有的数据,通常是通过克隆。 Read more
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>

执行转换。