Struct std::boxed::Box1.0.0[][src]

pub struct Box<T, A = Global>(_, _)
where
    T: ?Sized,
    A: Allocator
;
Expand description

堆分配的指针类型。

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

Implementations

在堆上分配内存,然后将 x 放入其中。

如果 T 的大小为零,则实际上不会分配。

Examples

let five = Box::new(5);
Run
🔬 This is a nightly-only experimental API. (new_uninit #63291)

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

Examples

#![feature(new_uninit)]

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

let five = unsafe {
    // 延迟初始化:
    five.as_mut_ptr().write(5);

    five.assume_init()
};

assert_eq!(*five, 5)
Run
🔬 This is a nightly-only experimental API. (new_uninit #63291)

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

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

Examples

#![feature(new_uninit)]

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

assert_eq!(*zero, 0)
Run

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

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

在堆上分配内存,然后将 x 放入其中,如果分配失败,则返回错误

如果 T 的大小为零,则实际上不会分配。

Examples

#![feature(allocator_api)]

let five = Box::try_new(5)?;
Run
🔬 This is a nightly-only experimental API. (allocator_api #32838)

在堆上创建一个具有未初始化内容的新 box,如果分配失败,则返回错误

Examples

#![feature(allocator_api, new_uninit)]

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

let five = unsafe {
    // 延迟初始化:
    five.as_mut_ptr().write(5);

    five.assume_init()
};

assert_eq!(*five, 5);
Run
🔬 This is a nightly-only experimental API. (allocator_api #32838)

创建一个具有未初始化内容的新 Box,堆中的内存由 0 字节填充

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

Examples

#![feature(allocator_api, new_uninit)]

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

assert_eq!(*zero, 0);
Run
🔬 This is a nightly-only experimental API. (allocator_api #32838)

在给定的分配器中分配内存,然后将 x 放入其中。

如果 T 的大小为零,则实际上不会分配。

Examples

#![feature(allocator_api)]

use std::alloc::System;

let five = Box::new_in(5, System);
Run
🔬 This is a nightly-only experimental API. (allocator_api #32838)

在给定的分配器中分配内存,然后将 x 放入其中,如果分配失败,则返回错误

如果 T 的大小为零,则实际上不会分配。

Examples

#![feature(allocator_api)]

use std::alloc::System;

let five = Box::try_new_in(5, System)?;
Run
🔬 This is a nightly-only experimental API. (allocator_api #32838)

在提供的分配器中创建一个具有未初始化内容的新 box。

Examples

#![feature(allocator_api, new_uninit)]

use std::alloc::System;

let mut five = Box::<u32, _>::new_uninit_in(System);

let five = unsafe {
    // 延迟初始化:
    five.as_mut_ptr().write(5);

    five.assume_init()
};

assert_eq!(*five, 5)
Run
🔬 This is a nightly-only experimental API. (allocator_api #32838)

在提供的分配器中创建一个具有未初始化内容的新 box,如果分配失败,则返回错误

Examples

#![feature(allocator_api, new_uninit)]

use std::alloc::System;

let mut five = Box::<u32, _>::try_new_uninit_in(System)?;

let five = unsafe {
    // 延迟初始化:
    five.as_mut_ptr().write(5);

    five.assume_init()
};

assert_eq!(*five, 5);
Run
🔬 This is a nightly-only experimental API. (allocator_api #32838)

创建一个具有未初始化内容的新 Box,使用提供的分配器中的 0 字节填充内存。

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

Examples

#![feature(allocator_api, new_uninit)]

use std::alloc::System;

let zero = Box::<u32, _>::new_zeroed_in(System);
let zero = unsafe { zero.assume_init() };

assert_eq!(*zero, 0)
Run
🔬 This is a nightly-only experimental API. (allocator_api #32838)

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

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

Examples

#![feature(allocator_api, new_uninit)]

use std::alloc::System;

let zero = Box::<u32, _>::try_new_zeroed_in(System)?;
let zero = unsafe { zero.assume_init() };

assert_eq!(*zero, 0);
Run
🔬 This is a nightly-only experimental API. (allocator_api #32838)

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

🔬 This is a nightly-only experimental API. (box_into_boxed_slice #71582)

Box<T> 转换为 Box<[T]>

这种转换不会在堆上分配,而是就地进行。

🔬 This is a nightly-only experimental API. (box_into_inner #80437)

消耗 Box,返回包装的值。

Examples

#![feature(box_into_inner)]

let c = Box::new(5);

assert_eq!(Box::into_inner(c), 5);
Run
🔬 This is a nightly-only experimental API. (new_uninit #63291)

创建一个具有未初始化内容的新 boxed 切片。

Examples

#![feature(new_uninit)]

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

let values = unsafe {
    // 延迟初始化:
    values[0].as_mut_ptr().write(1);
    values[1].as_mut_ptr().write(2);
    values[2].as_mut_ptr().write(3);

    values.assume_init()
};

assert_eq!(*values, [1, 2, 3])
Run
🔬 This is a nightly-only experimental API. (new_uninit #63291)

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

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

Examples

#![feature(new_uninit)]

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

assert_eq!(*values, [0, 0, 0])
Run
🔬 This is a nightly-only experimental API. (allocator_api #32838)

使用提供的分配器中未初始化的内容创建一个新的 boxed 切片。

Examples

#![feature(allocator_api, new_uninit)]

use std::alloc::System;

let mut values = Box::<[u32], _>::new_uninit_slice_in(3, System);

let values = unsafe {
    // 延迟初始化:
    values[0].as_mut_ptr().write(1);
    values[1].as_mut_ptr().write(2);
    values[2].as_mut_ptr().write(3);

    values.assume_init()
};

assert_eq!(*values, [1, 2, 3])
Run
🔬 This is a nightly-only experimental API. (allocator_api #32838)

使用提供的分配器中未初始化的内容创建一个新的 boxed 切片,并用 0 字节填充内存。

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

Examples

#![feature(allocator_api, new_uninit)]

use std::alloc::System;

let values = Box::<[u32], _>::new_zeroed_slice_in(3, System);
let values = unsafe { values.assume_init() };

assert_eq!(*values, [0, 0, 0])
Run
🔬 This is a nightly-only experimental API. (new_uninit #63291)

转换为 Box<T, A>

Safety

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

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

Examples

#![feature(new_uninit)]

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

let five: Box<u32> = unsafe {
    // 延迟初始化:
    five.as_mut_ptr().write(5);

    five.assume_init()
};

assert_eq!(*five, 5)
Run
🔬 This is a nightly-only experimental API. (new_uninit #63291)

转换为 Box<[T], A>

Safety

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

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

Examples

#![feature(new_uninit)]

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

let values = unsafe {
    // 延迟初始化:
    values[0].as_mut_ptr().write(1);
    values[1].as_mut_ptr().write(2);
    values[2].as_mut_ptr().write(3);

    values.assume_init()
};

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

从裸指针构造 box。

调用此函数后,结果 Box 拥有裸指针。 具体来说,Box 析构函数将调用 T 的析构函数并释放分配的内存。 为了安全起见,必须根据 Box 所使用的 memory layout 分配内存。

Safety

此函数不安全,因为使用不当可能会导致内存问题。 例如,如果在同一裸指针上两次调用该函数,则可能会出现 double-free。

安全条件在 memory layout 部分中进行了描述。

Examples

重新创建以前使用 Box::into_raw 转换为裸指针的 Box:

let x = Box::new(5);
let ptr = Box::into_raw(x);
let x = unsafe { Box::from_raw(ptr) };
Run

使用二进制分配器从头开始手动创建 Box:

use std::alloc::{alloc, Layout};

unsafe {
    let ptr = alloc(Layout::new::<i32>()) as *mut i32;
    // 通常,需要 .write 以避免尝试销毁 `ptr` 以前的内容,尽管对于这个简单的示例 `*ptr = 5` 也可以工作。
    ptr.write(5);
    let x = Box::from_raw(ptr);
}
Run
🔬 This is a nightly-only experimental API. (allocator_api #32838)

从给定分配器中的裸指针构造 box。

调用此函数后,结果 Box 拥有裸指针。 具体来说,Box 析构函数将调用 T 的析构函数并释放分配的内存。 为了安全起见,必须根据 Box 所使用的 memory layout 分配内存。

Safety

此函数不安全,因为使用不当可能会导致内存问题。 例如,如果在同一裸指针上两次调用该函数,则可能会出现 double-free。

Examples

重新创建以前使用 Box::into_raw_with_allocator 转换为裸指针的 Box:

#![feature(allocator_api)]

use std::alloc::System;

let x = Box::new_in(5, System);
let (ptr, alloc) = Box::into_raw_with_allocator(x);
let x = unsafe { Box::from_raw_in(ptr, alloc) };
Run

使用系统分配器从头开始手动创建 Box:

#![feature(allocator_api, slice_ptr_get)]

use std::alloc::{Allocator, Layout, System};

unsafe {
    let ptr = System.allocate(Layout::new::<i32>())?.as_mut_ptr() as *mut i32;
    // 通常,需要 .write 以避免尝试销毁 `ptr` 以前的内容,尽管对于这个简单的示例 `*ptr = 5` 也可以工作。
    ptr.write(5);
    let x = Box::from_raw_in(ptr, System);
}
Run

消耗 Box,并返回一个包装的裸指针。

指针将正确对齐且不为空。

调用此函数后,调用者将负责先前由 Box 管理的内存。 特别地,考虑到 Box 使用的 memory layout,调用者应正确销毁 T 并释放内存。 最简单的方法是使用 Box::from_raw 函数将裸指针转换回 Box,从而允许 Box 析构函数执行清理。

Note: 这是一个关联函数,这意味着您必须将其称为 Box::into_raw(b) 而不是 b.into_raw()。 这样就不会与内部类型的方法发生冲突。

Examples

使用 Box::from_raw 将裸指针转换回 Box 以进行自动清理:

let x = Box::new(String::from("Hello"));
let ptr = Box::into_raw(x);
let x = unsafe { Box::from_raw(ptr) };
Run

通过显式运行析构函数并释放内存来进行手动清理:

use std::alloc::{dealloc, Layout};
use std::ptr;

let x = Box::new(String::from("Hello"));
let p = Box::into_raw(x);
unsafe {
    ptr::drop_in_place(p);
    dealloc(p as *mut u8, Layout::new::<String>());
}
Run
🔬 This is a nightly-only experimental API. (allocator_api #32838)

消耗 Box,返回包装的裸指针和分配器。

指针将正确对齐且不为空。

调用此函数后,调用者将负责先前由 Box 管理的内存。 特别地,考虑到 Box 使用的 memory layout,调用者应正确销毁 T 并释放内存。 最简单的方法是使用 Box::from_raw_in 函数将裸指针转换回 Box,从而允许 Box 析构函数执行清理。

Note: 这是一个关联函数,这意味着您必须将其称为 Box::into_raw_with_allocator(b) 而不是 b.into_raw_with_allocator()。 这样就不会与内部类型的方法发生冲突。

Examples

使用 Box::from_raw_in 将裸指针转换回 Box 以进行自动清理:

#![feature(allocator_api)]

use std::alloc::System;

let x = Box::new_in(String::from("Hello"), System);
let (ptr, alloc) = Box::into_raw_with_allocator(x);
let x = unsafe { Box::from_raw_in(ptr, alloc) };
Run

通过显式运行析构函数并释放内存来进行手动清理:

#![feature(allocator_api)]

use std::alloc::{Allocator, Layout, System};
use std::ptr::{self, NonNull};

let x = Box::new_in(String::from("Hello"), System);
let (ptr, alloc) = Box::into_raw_with_allocator(x);
unsafe {
    ptr::drop_in_place(ptr);
    let non_null = NonNull::new_unchecked(ptr);
    alloc.deallocate(non_null.cast(), Layout::new::<String>());
}
Run
🔬 This is a nightly-only experimental API. (allocator_api #32838)

返回基础分配器的引用。

Note: 这是一个关联函数,这意味着您必须将其称为 Box::allocator(&b) 而不是 b.allocator()。 这样就不会与内部类型的方法发生冲突。

消耗并泄漏 Box,返回变量引用, &'a mut T. 请注意,类型 T 必须超过所选的生命周期 'a。 如果类型仅具有静态引用,或者根本没有静态引用,则可以将其选择为 'static

该函数主要用于在程序的剩余生命期内保留的数据。 丢弃返回的引用将导致内存泄漏。 如果这是不可接受的,则应首先将引用与 Box::from_raw 函数包装在一起,生成 Box

这个 Box 可以被丢弃,这将正确销毁 T 并释放分配的内存。

Note: 这是一个关联函数,这意味着您必须将其称为 Box::leak(b) 而不是 b.leak()。 这样就不会与内部类型的方法发生冲突。

Examples

简单用法:

let x = Box::new(41);
let static_ref: &'static mut usize = Box::leak(x);
*static_ref += 1;
assert_eq!(*static_ref, 42);
Run

未定义大小的数据:

let x = vec![1, 2, 3].into_boxed_slice();
let static_ref = Box::leak(x);
static_ref[0] = 4;
assert_eq!(*static_ref, [4, 2, 3]);
Run
🔬 This is a nightly-only experimental API. (box_into_pin #62370)

Box<T> 转换为 Pin<Box<T>>

这种转换不会在堆上分配,而是就地进行。

也可以通过 From 获得。

尝试将 box 转换为具体类型。

Examples

use std::any::Any;

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

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

尝试将 box 转换为具体类型。

Examples

use std::any::Any;

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

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

尝试将 box 转换为具体类型。

Examples

use std::any::Any;

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

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

Trait Implementations

执行转换。

执行转换。

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

从拥有的值中借用。 Read more

返回内部缓冲区的内容,如果内部缓冲区为空,则使用内部 reader 中的更多数据填充内部缓冲区。 Read more

告诉此缓冲区 amt 字节已从缓冲区中消耗掉,因此在调用 read 时不再应返回它们。 Read more

将所有字节读入 buf,直到到达定界符 byte 或 EOF。 Read more

读取所有字节,直到到达换行符 (0xA 字节),然后将它们附加到提供的缓冲区中。 Read more

🔬 This is a nightly-only experimental API. (buf_read_has_data_left #86423)

recently added

检查底层 Read 是否有任何数据可供读取。 Read more

返回对该字节 byte 上的 reader 拆分内容的迭代器。 Read more

返回此 reader 的各行上的迭代器。 Read more

返回值的副本。 Read more

source 执行复制分配。 Read more

返回值的副本。 Read more

source 执行复制分配。 Read more

返回带有此 box 的 内容的 clone() 的新 box。

Examples

let x = Box::new(5);
let y = x.clone();

// 值是一样的
assert_eq!(x, y);

// 但是它们是独特的对象
assert_ne!(&*x as *const i32, &*y as *const i32);
Run

source 的内容复制到 self,而不创建新的分配。

Examples

let x = Box::new(5);
let mut y = Box::new(10);
let yp: *const i32 = &*y;

y.clone_from(&x);

// 值是一样的
assert_eq!(x, y);

// 没有分配发生
assert_eq!(yp, &*y);
Run

返回值的副本。 Read more

source 执行复制分配。 Read more

返回值的副本。 Read more

source 执行复制分配。 Read more

返回值的副本。 Read more

source 执行复制分配。 Read more

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

创建一个 Box<T>,其 T 值为 Default

返回类型的 “default value”。 Read more

返回类型的 “default value”。 Read more

返回类型的 “default value”。 Read more

返回类型的 “default value”。 Read more

解引用后的结果类型。

解引用值。

可变地解引用该值。

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

从迭代器的末尾删除并返回一个元素。 Read more

从迭代器的末尾返回第 n 个元素。 Read more

🔬 This is a nightly-only experimental API. (iter_advance_by #77404)

recently added

通过 n 元素从后向前推进迭代器。 Read more

这是 Iterator::try_fold() 的反向版本: 它从迭代器的后面开始接收元素。 Read more

一种迭代器方法,从后面开始,将迭代器的元素减少为单个最终值。 Read more

从后面搜索满足谓词的迭代器的元素。 Read more

执行此类型的析构函数。 Read more

👎 Deprecated since 1.42.0:

use the Display impl or to_string()

👎 Deprecated since 1.33.0:

replaced by Error::source, which can support downcasting

此错误的下级来源 (如果有)。 Read more

🔬 This is a nightly-only experimental API. (backtrace #53487)

返回发生错误的栈回溯 (如果有)。 Read more

返回迭代器的确切长度。 Read more

🔬 This is a nightly-only experimental API. (exact_size_is_empty #35428)

如果迭代器为空,则返回 trueRead more

用迭代器的内容扩展集合。 Read more

🔬 This is a nightly-only experimental API. (extend_one #72631)

用一个元素扩展一个集合。

🔬 This is a nightly-only experimental API. (extend_one #72631)

在集合中为给定数量的附加元素保留容量。 Read more

🔬 This is a nightly-only experimental API. (fn_traits #29625)

执行调用操作。

🔬 This is a nightly-only experimental API. (fn_traits #29625)

执行调用操作。

使用调用运算符后的返回类型。

🔬 This is a nightly-only experimental API. (fn_traits #29625)

执行调用操作。

&[T] 转换为 Box<[T]>

此转换在堆上分配并执行 slice 的副本。

Examples

// 创建 &[u8] which 将用于创建 Box<[u8]>
let slice: &[u8] = &[104, 101, 108, 108, 111];
let boxed_slice: Box<[u8]> = Box::from(slice);

println!("{:?}", boxed_slice);
Run

执行转换。

执行转换。

从引用创建一个 boxed Path

这将为它分配和克隆 path

&str 转换为 Box<str>

此转换在堆上分配并执行 s 的副本。

Examples

let boxed: Box<str> = Box::from("hello");
println!("{}", boxed);
Run

str 转换为 Dyn Error + Send + Sync 的 box。

Examples

use std::error::Error;
use std::mem;

let a_str_error = "a str error";
let a_boxed_error = Box::<dyn Error + Send + Sync>::from(a_str_error);
assert!(
    mem::size_of::<Box<dyn Error + Send + Sync>>() == mem::size_of_val(&a_boxed_error))
Run

str 转换为 dyn Error 的 box。

Examples

use std::error::Error;
use std::mem;

let a_str_error = "a str error";
let a_boxed_error = Box::<dyn Error>::from(a_str_error);
assert!(mem::size_of::<Box<dyn Error>>() == mem::size_of_val(&a_boxed_error))
Run

[T; N] 转换为 Box<[T]>

此转换将数组移动到新的堆分配的内存中。

Examples

let boxed: Box<[u8]> = Box::from([4, 2]);
println!("{:?}", boxed);
Run

通过转移现有堆分配的所有权,将 boxed 切片转换为 vector。

Examples

let b: Box<[i32]> = vec![1, 2, 3].into_boxed_slice();
assert_eq!(Vec::from(b), vec![1, 2, 3]);
Run

无需复制或分配即可将 Box<CStr> 转换为 CString

无需复制或分配即可将 Box<OsStr> 转换为 OsString

Box<Path> 转换为 PathBuf

此转换不会分配或复制内存。

Box<T> 转换为 Pin<Box<T>>

这种转换不会在堆上分配,而是就地进行。

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

Example

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

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

Example

let unique: Box<str> = Box::from("eggplant");
let shared: Arc<str> = Arc::from(unique);
assert_eq!("eggplant", &shared[..]);
Run

Box<str> 转换为 Box<[u8]>

这种转换不会在堆上分配,而是就地进行。

Examples

// 创建一个 Box<str>,该 Box<str> 将用于创建 Box<[u8]>
let boxed: Box<str> = Box::from("hello");
let boxed_str: Box<[u8]> = Box::from(boxed);

// 创建 &[u8] which 将用于创建 Box<[u8]>
let slice: &[u8] = &[104, 101, 108, 108, 111];
let boxed_slice = Box::from(slice);

assert_eq!(boxed_slice, boxed_str);
Run

将给定的 boxed str 切片转换为 String。 值得注意的是,str 切片是拥有的。

Examples

基本用法:

let s1: String = String::from("hello world");
let s2: Box<str> = s1.into_boxed_str();
let s3: String = String::from(s2);

assert_eq!("hello world", s3)
Run

无需复制或分配即可将 CString 转换为 Box<CStr>

执行转换。

执行转换。

执行转换。

从写时克隆指针创建一个 boxed Path

Cow::Owned 转换不会克隆或分配。

执行转换。

Cow 转换为 dyn Error 的 box。

Examples

use std::error::Error;
use std::mem;
use std::borrow::Cow;

let a_cow_str_error = Cow::from("a str error");
let a_boxed_error = Box::<dyn Error>::from(a_cow_str_error);
assert!(mem::size_of::<Box<dyn Error>>() == mem::size_of_val(&a_boxed_error))
Run

Cow 转换为 Dyn Error + Send + Sync 的 box。

Examples

use std::error::Error;
use std::mem;
use std::borrow::Cow;

let a_cow_str_error = Cow::from("a str error");
let a_boxed_error = Box::<dyn Error + Send + Sync>::from(a_cow_str_error);
assert!(
    mem::size_of::<Box<dyn Error + Send + Sync>>() == mem::size_of_val(&a_boxed_error))
Run

Error 的类型转换为 dyn Error 的 box。

Examples

use std::error::Error;
use std::fmt;
use std::mem;

#[derive(Debug)]
struct AnError;

impl fmt::Display for AnError {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f , "An error")
    }
}

impl Error for AnError {}

let an_error = AnError;
assert!(0 == mem::size_of_val(&an_error));
let a_boxed_error = Box::<dyn Error>::from(an_error);
assert!(mem::size_of::<Box<dyn Error>>() == mem::size_of_val(&a_boxed_error))
Run

Error + Send + Sync 的类型转换为 Dyn Error + Send + Sync 的 box。

Examples

use std::error::Error;
use std::fmt;
use std::mem;

#[derive(Debug)]
struct AnError;

impl fmt::Display for AnError {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f , "An error")
    }
}

impl Error for AnError {}

unsafe impl Send for AnError {}

unsafe impl Sync for AnError {}

let an_error = AnError;
assert!(0 == mem::size_of_val(&an_error));
let a_boxed_error = Box::<dyn Error + Send + Sync>::from(an_error);
assert!(
    mem::size_of::<Box<dyn Error + Send + Sync>>() == mem::size_of_val(&a_boxed_error))
Run

无需复制或分配即可将 OsString 转换为 Box<OsStr>

PathBuf 转换为 Box<Path>

此转换当前不应该分配内存,但是不能在所有平台上或所有 future 版本中都保证此行为。

将给定的 String 转换为拥有所有权的 boxed str 切片。

Examples

基本用法:

let s1: String = String::from("hello world");
let s2: Box<str> = Box::from(s1);
let s3: String = String::from(s2);

assert_eq!("hello world", s3)
Run

String 转换为 Dyn Error + Send + Sync 的 box。

Examples

use std::error::Error;
use std::mem;

let a_string_error = "a string error".to_string();
let a_boxed_error = Box::<dyn Error + Send + Sync>::from(a_string_error);
assert!(
    mem::size_of::<Box<dyn Error + Send + Sync>>() == mem::size_of_val(&a_boxed_error))
Run

String 转换为 dyn Error 的 box。

Examples

use std::error::Error;
use std::mem;

let a_string_error = "a string error".to_string();
let a_boxed_error = Box::<dyn Error>::from(a_string_error);
assert!(mem::size_of::<Box<dyn Error>>() == mem::size_of_val(&a_boxed_error))
Run

T 转换为 Box<T>

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

Examples

let x = 5;
let boxed = Box::new(5);

assert_eq!(Box::from(x), boxed);
Run

将 vector 转换为 boxed。

如果 v 有多余的容量,它的项将被移动到新分配的缓冲区中,缓冲区的容量恰好是正确的。

Examples

assert_eq!(Box::from(vec![1, 2, 3]), vec![1, 2, 3].into_boxed_slice());
Run

从迭代器创建一个值。 Read more

从迭代器创建一个值。 Read more

完成时产生的值类型。

尝试将 future 解析为最终值,如果该值尚不可用,请注册当前任务以进行唤醒。 Read more

🔬 This is a nightly-only experimental API. (generator_trait #43122)

此生成器产生的值的类型。 Read more

🔬 This is a nightly-only experimental API. (generator_trait #43122)

此生成器返回的值的类型。 Read more

🔬 This is a nightly-only experimental API. (generator_trait #43122)

恢复此生成器的执行。 Read more

将该值输入给定的 HasherRead more

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

返回到目前为止写入的值的哈希值。 Read more

将一些数据写入此 HasherRead more

将单个 u8 写入此哈希器。

将单个 u16 写入此哈希器。

将单个 u32 写入此哈希器。

将单个 u64 写入此哈希器。

将单个 u128 写入此哈希器。

将单个 usize 写入此哈希器。

将单个 i8 写入此哈希器。

将单个 i16 写入此哈希器。

将单个 i32 写入此哈希器。

将单个 i64 写入此哈希器。

将单个 i128 写入此哈希器。

将单个 isize 写入此哈希器。

被迭代的元素的类型。

推进迭代器并返回下一个值。 Read more

返回迭代器剩余长度的界限。 Read more

返回迭代器的第 n 个元素。 Read more

使用迭代器,返回最后一个元素。 Read more

使用迭代器,计算迭代次数并返回它。 Read more

🔬 This is a nightly-only experimental API. (iter_advance_by #77404)

recently added

通过 n 元素使迭代器前进。 Read more

创建一个从同一点开始的迭代器,但在每次迭代时以给定的数量逐步执行。 Read more

接受两个迭代器,并依次在两个迭代器上创建一个新的迭代器。 Read more

将两个迭代器压缩为成对的单个迭代器。 Read more

🔬 This is a nightly-only experimental API. (iter_intersperse #79524)

recently added

创建一个新的迭代器,该迭代器将 separator 的副本放置在原始迭代器的相邻项之间。 Read more

🔬 This is a nightly-only experimental API. (iter_intersperse #79524)

recently added

创建一个新的迭代器,该迭代器将 separator 生成的项放在原始迭代器的相邻项之间。 Read more

获取一个闭包并创建一个迭代器,该迭代器在每个元素上调用该闭包。 Read more

在迭代器的每个元素上调用一个闭包。 Read more

创建一个迭代器,该迭代器使用闭包确定是否应产生元素。 Read more

创建一个同时过滤和 maps 的迭代器。 Read more

创建一个迭代器,该迭代器给出当前迭代次数以及下一个值。 Read more

创建一个迭代器,它可以使用 peekpeek_mut 方法查看迭代器的下一个元素而不消耗它。有关更多信息,请参见他们的文档。 Read more

创建一个迭代器,该迭代器基于谓词 skip 个元素。 Read more

创建一个迭代器,该迭代器根据谓词产生元素。 Read more

🔬 This is a nightly-only experimental API. (iter_map_while #68537)

recently added

创建一个迭代器,该迭代器均基于谓词和 maps 产生元素。 Read more

创建一个跳过前 n 个元素的迭代器。 Read more

创建一个迭代器,它产生第一个 n 元素,如果底层迭代器提前结束,则产生更少的元素。 Read more

fold 相似的迭代器适配器,它保持内部状态并生成新的迭代器。 Read more

创建一个迭代器,其工作方式类似于 map,但是将嵌套的结构展平。 Read more

创建一个可简化嵌套结构体的迭代器。 Read more

创建一个迭代器,该迭代器在第一个 None 之后结束。 Read more

对迭代器的每个元素执行某些操作,将值传递给它。 Read more

借用一个迭代器,而不是使用它。 Read more

将迭代器转换为集合。 Read more

使用一个迭代器,从中创建两个集合。 Read more

🔬 This is a nightly-only experimental API. (iter_partition_in_place #62543)

new API

根据给定的谓词,对迭代器的元素进行就地重新排序,以使所有返回 true 的元素都在所有返回 false 的元素之前。 返回找到的 true 元素的数量。 Read more

🔬 This is a nightly-only experimental API. (iter_is_partitioned #62544)

new API

检查此迭代器的元素是否根据给定的谓词进行了分区,以便所有返回 true 的元素都在所有返回 false 的元素之前。 Read more

一个迭代器方法,它只要成功返回就应用函数,并产生单个最终值。 Read more

一个迭代器方法,该方法将一个容易犯错的函数应用于迭代器中的每个项,在第一个错误处停止并返回该错误。 Read more

通过应用操作将每个元素 fold 到一个累加器中,返回最终结果。 Read more

通过重复应用归约运算,将元素缩减为一个。 Read more

测试迭代器的每个元素是否与谓词匹配。 Read more

测试迭代器的任何元素是否与谓词匹配。 Read more

搜索满足谓词的迭代器的元素。 Read more

将函数应用于迭代器的元素,并返回第一个非无结果。 Read more

🔬 This is a nightly-only experimental API. (try_find #63178)

new API

将函数应用于迭代器的元素,并返回第一个真结果或第一个错误。 Read more

在迭代器中搜索元素,并返回其索引。 Read more

从右侧搜索迭代器中的元素,并返回其索引。 Read more

返回迭代器的最大元素。 Read more

返回迭代器的最小元素。 Read more

返回给出指定函数最大值的元素。 Read more

返回给出相对于指定比较函数的最大值的元素。 Read more

返回给出指定函数中最小值的元素。 Read more

返回给出相对于指定比较函数的最小值的元素。 Read more

反转迭代器的方向。 Read more

将成对的迭代器转换为一对容器。 Read more

创建一个迭代器,该迭代器将复制其所有元素。 Read more

创建一个迭代器,该迭代器将克隆所有元素。 Read more

不断重复的迭代器。 Read more

对迭代器的元素求和。 Read more

遍历整个迭代器,将所有元素相乘 Read more

Lexicographically 将此 Iterator 的元素与另一个元素进行比较。 Read more

🔬 This is a nightly-only experimental API. (iter_order_by #64295)

Lexicographically 就指定的比较函数而言,将此 Iterator 的元素与另一个元素进行比较。 Read more

Lexicographically 将此 Iterator 的元素与另一个元素进行比较。 Read more

🔬 This is a nightly-only experimental API. (iter_order_by #64295)

Lexicographically 就指定的比较函数而言,将此 Iterator 的元素与另一个元素进行比较。 Read more

确定此 Iterator 的元素是否与另一个元素相同。 Read more

🔬 This is a nightly-only experimental API. (iter_order_by #64295)

关于指定的相等函数,确定 Iterator 的元素是否与另一个元素相等。 Read more

确定此 Iterator 的元素是否与另一个元素不相等。 Read more

确定此 Iterator 的元素是否比另一个元素少 按字典顺序Read more

确定此 Iterator 的元素是否 按字典顺序 小于或等于另一个元素。 Read more

确定此 Iterator 的元素是否大于另一个元素的 按字典顺序Read more

确定此 Iterator 的元素是否 按字典顺序 大于或等于另一个元素。 Read more

🔬 This is a nightly-only experimental API. (is_sorted #53485)

new API

检查此迭代器的元素是否已排序。 Read more

🔬 This is a nightly-only experimental API. (is_sorted #53485)

new API

检查此迭代器的元素是否使用给定的比较器函数进行排序。 Read more

🔬 This is a nightly-only experimental API. (is_sorted #53485)

new API

检查此迭代器的元素是否使用给定的键提取函数进行排序。 Read more

此方法返回 selfother 之间的 OrderingRead more

比较并返回两个值中的最大值。 Read more

比较并返回两个值中的最小值。 Read more

将值限制为一定的时间间隔。 Read more

此方法测试 selfother 值是否相等,并由 == 使用。 Read more

此方法测试 !=

如果存在,则此方法返回 selfother 值之间的顺序。 Read more

此方法测试的内容少于 (对于 selfother),并且由 < 操作员使用。 Read more

此方法测试小于或等于 (对于 selfother),并且由 <= 运算符使用。 Read more

此方法测试是否大于或等于 (对于 selfother),并且由 >= 运算符使用。 Read more

此方法测试大于 (对于 selfother),并且由 > 操作员使用。 Read more

使用给定的格式化程序格式化该值。

从该源中提取一些字节到指定的缓冲区中,返回读取的字节数。 Read more

read 相似,不同之处在于它读入缓冲区的一部分。 Read more

🔬 This is a nightly-only experimental API. (can_vector #69941)

确定此 Read 是否具有有效的 read_vectored 实现。 Read more

🔬 This is a nightly-only experimental API. (read_initializer #42788)

确定该 Reader 是否可以与未初始化内存的缓冲区一起使用。 Read more

读取所有字节,直到此源中的 EOF 为止,然后将它们放入 bufRead more

读取所有字节,直到该源中的 EOF 为止,然后将它们附加到 bufRead more

读取填充 buf 所需的确切字节数。 Read more

为此 Read 实例创建 “by reference” 适配器。 Read more

将此 Read 实例的字节数转换为 IteratorRead more

创建一个适配器,它将将此流与另一个流链接。 Read more

创建一个适配器,该适配器最多可以从中读取 limit 字节。 Read more

在流中寻找以字节为单位的偏移量。 Read more

从流的开头返回当前搜索位置。 Read more

返回到流的开头。 Read more

🔬 This is a nightly-only experimental API. (seek_stream_len #59359)

返回此流的长度 (以字节为单位)。 Read more

🔬 This is a nightly-only experimental API. (async_stream #79024)

流产生的项的类型。

🔬 This is a nightly-only experimental API. (async_stream #79024)

尝试拉出该流的下一个值,如果该值尚不可用,则注册当前任务以进行唤醒,如果流已用尽,则返回 NoneRead more

🔬 This is a nightly-only experimental API. (async_stream #79024)

返回流剩余长度上的边界。 Read more

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

执行转换。

在此 writer 中写入一个缓冲区,返回写入的字节数。 Read more

类似于 write,不同之处在于它是从缓冲区片段中写入数据的。 Read more

🔬 This is a nightly-only experimental API. (can_vector #69941)

确定此 Writer 是否具有有效的 write_vectored 实现。 Read more

刷新此输出流,确保所有中间缓冲的内容均到达其目的地。 Read more

尝试将整个缓冲区写入此 writer。 Read more

将格式化的字符串写入此 writer,返回遇到的任何错误。 Read more

🔬 This is a nightly-only experimental API. (write_all_vectored #70436)

尝试将多个缓冲区写入此 writer。 Read more

为此 Write 实例创建 “by reference” 适配器。 Read more

Auto Trait Implementations

Blanket Implementations

获取 selfTypeIdRead more

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

从拥有的值中借用。 Read more

执行转换。

执行转换。

执行转换。

🔬 This is a nightly-only experimental API. (into_future #67644)

future 完成时将产生的输出。

🔬 This is a nightly-only experimental API. (into_future #67644)

我们要把它变成哪种 future?

🔬 This is a nightly-only experimental API. (into_future #67644)

根据一个值创建一个 future。

被迭代的元素的类型。

我们将其变成哪种迭代器?

从一个值创建一个迭代器。 Read more

🔬 This is a nightly-only experimental API. (pattern #27721)

API not fully fleshed out and ready to be stabilized

此模式的关联搜索者

🔬 This is a nightly-only experimental API. (pattern #27721)

API not fully fleshed out and ready to be stabilized

selfhaystack 构造关联的搜索器以进行搜索。 Read more

🔬 This is a nightly-only experimental API. (pattern #27721)

API not fully fleshed out and ready to be stabilized

检查模式是否与 haystack 中的任何位置匹配

🔬 This is a nightly-only experimental API. (pattern #27721)

API not fully fleshed out and ready to be stabilized

检查模式是否在 haystack 的前面匹配

🔬 This is a nightly-only experimental API. (pattern #27721)

API not fully fleshed out and ready to be stabilized

如果匹配,则从 haystack 的正面删除模式。

🔬 This is a nightly-only experimental API. (pattern #27721)

API not fully fleshed out and ready to be stabilized

检查模式是否与 haystack 的后面匹配

🔬 This is a nightly-only experimental API. (pattern #27721)

API not fully fleshed out and ready to be stabilized

如果匹配,则从 haystack 的后面删除模式。

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

通常通过克隆从借用数据中创建拥有的数据。 Read more

🔬 This is a nightly-only experimental API. (toowned_clone_into #41263)

recently added

使用借来的数据来替换拥有的数据,通常是通过克隆。 Read more

将给定值转换为 StringRead more

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

执行转换。

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

执行转换。