GeezerVison is showing doc.rust-lang.org (truncated) — Box in std::boxed - Rust pub struct Box<T, A = Global>(/* private fields */)
where
A: Allocator,
T: ?Sized;
Expand descriptionImplementations§
Attempts to downcast the box to a concrete type.
§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));
🔬This is a nightly-only experimental API. (downcast_unchecked #90850)
Downcasts the box to a concrete type.
For a safe alternative see downcast.
§Examples
#![feature(downcast_unchecked)]
use std::any::Any;
let x: Box<dyn Any> = Box::new(1_usize);
unsafe {
assert_eq!(*x.downcast_unchecked::<usize>(), 1);
}
§Safety
The contained value must be of type T. Calling this method
with the incorrect type is undefined behavior.
Attempts to downcast the box to a concrete type.
§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));
🔬This is a nightly-only experimental API. (downcast_unchecked #90850)
Downcasts the box to a concrete type.
For a safe alternative see downcast.
§Examples
#![feature(downcast_unchecked)]
use std::any::Any;
let x: Box<dyn Any + Send> = Box::new(1_usize);
unsafe {
assert_eq!(*x.downcast_unchecked::<usize>(), 1);
}
§Safety
The contained value must be of type T. Calling this method
with the incorrect type is undefined behavior.
Attempts to downcast the box to a concrete type.
§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));
🔬This is a nightly-only experimental API. (downcast_unchecked #90850)
Downcasts the box to a concrete type.
For a safe alternative see downcast.
§Examples
#![feature(downcast_unchecked)]
use std::any::Any;
let x: Box<dyn Any + Send + Sync> = Box::new(1_usize);
unsafe {
assert_eq!(*x.downcast_unchecked::<usize>(), 1);
}
§Safety
The contained value must be of type T. Calling this method
with the incorrect type is undefined behavior.
Allocates memory on the heap and then places x into it.
This doesn’t actually allocate if T is zero-sized.
§Examples
Constructs a new box with uninitialized contents.
§Examples
let mut five = Box::<u32>::new_uninit();
// Deferred initialization:
five.write(5);
let five = unsafe { five.assume_init() };
assert_eq!(*five, 5)
Constructs a new Box with uninitialized contents, with the memory
being filled with 0 bytes.
See MaybeUninit::zeroed for examples of correct and incorrect usage
of this method.
§Examples
let zero = Box::<u32>::new_zeroed();
let zero = unsafe { zero.assume_init() };
assert_eq!(*zero, 0)
Constructs a new Pin<Box<T>>. If T does not implement Unpin, then
x will be pinned in memory and unable to be moved.
Constructing and pinning of the Box can also be done in two steps: Box::pin(x)
does the same as Box::into_pin(Box::new(x)). Consider using
into_pin if you already have a Box<T>, or if you want to
construct a (pinned) Box in a different way than with Box::new.
🔬This is a nightly-only experimental API. (allocator_api #32838)
Allocates memory on the heap then places x into it,
returning an error if the allocation fails
This doesn’t actually allocate if T is zero-sized.
§Examples
#![feature(allocator_api)]
let five = Box::try_new(5)?;
🔬This is a nightly-only experimental API. (allocator_api #32838)
Constructs a new box with uninitialized contents on the heap,
returning an error if the allocation fails
§Examples
#![feature(allocator_api)]
let mut five = Box::<u32>::try_new_uninit()?;
// Deferred initialization:
five.write(5);
let five = unsafe { five.assume_init() };
assert_eq!(*five, 5);
🔬This is a nightly-only experimental API. (allocator_api #32838)
Constructs a new Box with uninitialized contents, with the memory
being filled with 0 bytes on the heap
See MaybeUninit::zeroed for examples of correct and incorrect usage
of this method.
§Examples
#![feature(allocator_api)]
let zero = Box::<u32>::try_new_zeroed()?;
let zero = unsafe { zero.assume_init() };
assert_eq!(*zero, 0);
🔬This is a nightly-only experimental API. (smart_pointer_try_map #144419)
Maps the value in a box, reusing the allocation if possible.
f is called on the value in the box, and the result is returned, also boxed.
Note: this is an associated function, which means that you have
to call it as Box::map(b, f) instead of b.map(f). This
is so that there is no conflict with a method on the inner type.
§Examples
#![feature(smart_pointer_try_map)]
let b = Box::new(7);
let new = Box::map(b, |i| i + 7);
assert_eq!(*new, 14);
🔬This is a nightly-only experimental API. (smart_pointer_try_map #144419)
Attempts to map the value in a box, reusing the allocation if possible.
f is called on the value in the box, and if the operation succeeds, the result is
returned, also boxed.
Note: this is an associated function, which means that you have
to call it as Box::try_map(b, f) instead of b.try_map(f). This
is so that there is no conflict with a method on the inner type.
§Examples
#![feature(smart_pointer_try_map)]
let b = Box::new(7);
let new = Box::try_map(b, u32::try_from).unwrap();
assert_eq!(*new, 7);
🔬This is a nightly-only experimental API. (allocator_api #32838)
Allocates memory in the given allocator then places x into it.
This doesn’t actually allocate if T is zero-sized.
§Examples
#![feature(allocator_api)]
use std::alloc::System;
let five = Box::new_in(5, System);
🔬This is a nightly-only experimental API. (allocator_api #32838)
Allocates memory in the given allocator then places x into it,
returning an error if the allocation fails
This doesn’t actually allocate if T is zero-sized.
§Examples
#![feature(allocator_api)]
use std::alloc::System;
let five = Box::try_new_in(5, System)?;
🔬This is a nightly-only experimental API. (allocator_api #32838)
Constructs a new box with uninitialized contents in the provided allocator.
§Examples
#![feature(allocator_api)]
use std::alloc::System;
let mut five = Box::<u32, _>::new_uninit_in(System);
// Deferred initialization:
five.write(5);
let five = unsafe { five.assume_init() };
assert_eq!(*five, 5)
🔬This is a nightly-only experimental API. (allocator_api #32838)
Constructs a new box with uninitialized contents in the provided allocator,
returning an error if the allocation fails
§Examples
#![feature(allocator_api)]
use std::alloc::System;
let mut five = Box::<u32, _>::try_new_uninit_in(System)?;
// Deferred initialization:
five.write(5);
let five = unsafe { five.assume_init() };
assert_eq!(*five, 5);
🔬This is a nightly-only experimental API. (allocator_api #32838)
Constructs a new Box with uninitialized contents, with the memory
being filled with 0 bytes in the provided allocator.
See MaybeUninit::zeroed for examples of correct and incorrect usage
of this method.
§Examples
#![feature(allocator_api)]
use std::alloc::System;
let zero = Box::<u32, _>::new_zeroed_in(System);
let zero = unsafe { zero.assume_init() };
assert_eq!(*zero, 0)
🔬This is a nightly-only experimental API. (allocator_api #32838)
Constructs a new Box with uninitialized contents, with the memory
being filled with 0 bytes in the provided allocator,
returning an error if the allocation fails,
See MaybeUninit::zeroed for examples of correct and incorrect usage
of this method.
§Examples
#![feature(allocator_api)]
use std::alloc::System;
let zero = Box::<u32, _>::try_new_zeroed_in(System)?;
let zero = unsafe { zero.assume_init() };
assert_eq!(*zero, 0);
🔬This is a nightly-only experimental API. (allocator_api #32838)
Constructs a new Pin<Box<T, A>>. If T does not implement Unpin, then
x will be pinned in memory and unable to be moved.
Constructing and pinning of the Box can also be done in two steps: Box::pin_in(x, alloc)
does the same as Box::into_pin(Box::new_in(x, alloc)). Consider using
into_pin if you already have a Box<T, A>, or if you want to
construct a (pinned) Box in a different way than with Box::new_in.
§Examples
#![feature(allocator_api)]
use std::alloc::System;
let x = Box::pin_in(1, System);
🔬This is a nightly-only experimental API. (box_into_boxed_slice #71582)
Converts a Box<T> into a Box<[T]>
This conversion does not allocate on the heap and happens in place.
🔬This is a nightly-only experimental API. (box_into_inner #80437)
Consumes the Box, returning the wrapped value.
§Examples
#![feature(box_into_inner)]
let c = Box::new(5);
assert_eq!(Box::into_inner(c), 5);
🔬This is a nightly-only experimental API. (box_take #147212)
Consumes the Box without consuming its allocation, returning the wrapped value and a Box
to the uninitialized memory where the wrapped value used to live.
This can be used together with write to reuse the allocation for multiple
boxed values.
§Examples
#![feature(box_take)]
let c = Box::new(5);
// take the value out of the box
let (value, uninit) = Box::take(c);
assert_eq!(value, 5);
// reuse the box for a second value
let c = Box::write(uninit, 6);
assert_eq!(*c, 6);
🔬This is a nightly-only experimental API. (clone_from_ref #149075)
Allocates memory on the heap then clones src into it.
This doesn’t actually allocate if src is zero-sized.
§Examples
#![feature(clone_from_ref)]
let hello: Box<str> = Box::clone_from_ref("hello");
🔬This is a nightly-only experimental API. (clone_from_ref #149075)
Allocates memory on the heap then clones src into it, returning an error if allocation fails.
This doesn’t actually allocate if src is zero-sized.
§Examples
#![feature(clone_from_ref)]
#![feature(allocator_api)]
let hello: Box<str> = Box::try_clone_from_ref("hello")?;
🔬This is a nightly-only experimental API. (clone_from_ref #149075)
Allocates memory in the given allocator then clones src into it.
This doesn’t actually allocate if src is zero-sized.
§Examples
#![feature(clone_from_ref)]
#![feature(allocator_api)]
use std::alloc::System;
let hello: Box<str, System> = Box::clone_from_ref_in("hello", System);
🔬This is a nightly-only experimental API. (clone_from_ref #149075)
Allocates memory in the given allocator then clones src into it, returning an error if allocation fails.
This doesn’t actually allocate if src is zero-sized.
§Examples
#![feature(clone_from_ref)]
#![feature(allocator_api)]
use std::alloc::System;
let hello: Box<str, System> = Box::try_clone_from_ref_in("hello", System)?;
Constructs a new boxed slice with uninitialized contents.
§Examples
let mut values = Box::<[u32]>::new_uninit_slice(3);
// Deferred initialization:
values[0].write(1);
values[1].write(2);
values[2].write(3);
let values = unsafe { values.assume_init() };
assert_eq!(*values, [1, 2, 3])
Constructs a new boxed slice with uninitialized contents, with the memory
being filled with 0 bytes.
See MaybeUninit::zeroed for examples of correct and incorrect usage
of this method.
§Examples
let values = Box::<[u32]>::new_zeroed_slice(3);
let values = unsafe { values.assume_init() };
assert_eq!(*values, [0, 0, 0])
🔬This is a nightly-only experimental API. (allocator_api #32838)
Constructs a new boxed slice with uninitialized contents. Returns an error if
the allocation fails.
§Examples
#![feature(allocator_api)]
let mut values = Box::<[u32]>::try_new_uninit_slice(3)?;
// Deferred initialization:
values[0].write(1);
values[1].write(2);
values[2].write(3);
let values = unsafe { values.assume_init() };
assert_eq!(*values, [1, 2, 3]);
🔬This is a nightly-only experimental API. (allocator_api #32838)
Constructs a new boxed slice with uninitialized contents, with the memory
being filled with 0 bytes. Returns an error if the allocation fails.
See MaybeUninit::zeroed for examples of correct and incorrect usage
of this method.
§Examples
#![feature(allocator_api)]
let values = Box::<[u32]>::try_new_zeroed_slice(3)?;
let values = unsafe { values.assume_init() };
assert_eq!(*values, [0, 0, 0]);
🔬This is a nightly-only experimental API. (allocator_api #32838)
Constructs a new boxed slice with uninitialized contents in the provided allocator.
§Examples
#![feature(allocator_api)]
use std::alloc::System;
let mut values = Box::<[u32], _>::new_uninit_slice_in(3, System);
// Deferred initialization:
values[0].write(1);
values[1].write(2);
values[2].write(3);
let values = unsafe { values.assume_init() };
assert_eq!(*values, [1, 2, 3])
🔬This is a nightly-only experimental API. (allocator_api #32838)
Constructs a new boxed slice with uninitialized contents in the provided allocator,
with the memory being filled with 0 bytes.
See MaybeUninit::zeroed for examples of correct and incorrect usage
of this method.
§Examples
#![feature(allocator_api)]
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])
🔬This is a nightly-only experimental API. (allocator_api #32838)
Constructs a new boxed slice with uninitialized contents in the provided allocator. Returns an error if
the allocation fails.
§Examples
#![feature(allocator_api)]
use std::alloc::System;
let mut values = Box::<[u32], _>::try_new_uninit_slice_in(3, System)?;
// Deferred initialization:
values[0].write(1);
values[1].write(2);
values[2].write(3);
let values = unsafe { values.assume_init() };
assert_eq!(*values, [1, 2, 3]);
🔬This is a nightly-only experimental API. (allocator_api #32838)
Constructs a new boxed slice with uninitialized contents in the provided allocator, with the memory
being filled with 0 bytes. Returns an error if the allocation fails.
See MaybeUninit::zeroed for examples of correct and incorrect usage
of this method.
§Examples
#![feature(allocator_api)]
use std::alloc::System;
let values = Box::<[u32], _>::try_new_zeroed_slice_in(3, System)?;
let values = unsafe { values.assume_init() };
assert_eq!(*values, [0, 0, 0]);
🔬This is a nightly-only experimental API. (alloc_slice_into_array #148082)
Converts the boxed slice into a boxed array.
This operation does not reallocate; the underlying array of the slice is simply reinterpreted as an array type.
§Errors
Returns the original Box<[T]> in the Err variant if self.len() does not equal N.
§Examples
#![feature(alloc_slice_into_array)]
let box_slice: Box<[i32]> = Box::new([1, 2, 3]);
let box_array: Box<[i32; 3]> = box_slice.into_array().unwrap();
Converts to Box<T, A>.
§Safety
As with MaybeUninit::assume_init,
it is up to the caller to guarantee that the value
really is in an initialized state.
Calling this when the content is not yet fully initialized
causes immediate undefined behavior.
§Examples
let mut five = Box::<u32>::new_uninit();
// Deferred initialization:
five.write(5);
let five: Box<u32> = unsafe { five.assume_init() };
assert_eq!(*five, 5)
Writes the value and converts to Box<T, A>.
This method converts the box similarly to Box::assume_init but
writes value into it before conversion thus guaranteeing safety.
In some scenarios use of this method may improve performance because
the compiler may be able to optimize copying from stack.
§Examples
let big_box = Box::<[usize; 1024]>::new_uninit();
let mut array = [0; 1024];
for (i, place) in array.iter_mut().enumerate() {
*place = i;
}
// The optimizer may be able to elide this copy, so previous code writes
// to heap directly.
let big_box = Box::write(big_box, array);
for (i, x) in big_box.iter().enumerate() {
assert_eq!(*x, i);
}
Converts to Box<[T], A>.
§Safety
As with MaybeUninit::assume_init,
it is up to the caller to guarantee that the values
really are in an initialized state.
Calling this when the content is not yet fully initialized
causes immediate undefined behavior.
§Examples
let mut values = Box::<[u32]>::new_uninit_slice(3);
// Deferred initialization:
values[0].write(1);
values[1].write(2);
values[2].write(3);
let values = unsafe { values.assume_init() };
assert_eq!(*values, [1, 2, 3])
Constructs a box from a raw pointer.
After calling this function, the raw pointer is owned by the
resulting Box. Specifically, the Box destructor will call
the destructor of T and free the allocated memory. For this
to be safe, the memory must have been allocated in accordance
with the memory layout used by Box .
§Safety
This function is unsafe because improper use may lead to
memory problems. For example, a double-free may occur if the
function is called twice on the same raw pointer.
The raw pointer must point to a block of memory allocated by the global allocator.
The safety conditions are described in the memory layout section.
Note that the considerations for unsafe code apply to all Box<T> values.
§Examples
Recreate a Box which was previously converted to a raw pointer
using Box::into_raw:
let x = Box::new(5);
let ptr = Box::into_raw(x);
let x = unsafe { Box::from_raw(ptr) };
Manually create a Box from scratch by using the global allocator:
use std::alloc::{alloc, Layout};
unsafe {
let ptr = alloc(Layout::new::<i32>()) as *mut i32;
// In general .write is required to avoid attempting to destruct
// the (uninitialized) previous contents of `ptr`, though for this
// simple example `*ptr = 5` would have worked as well.
ptr.write(5);
let x = Box::from_raw(ptr);
}
Constructs a box from a NonNull pointer.
After calling this function, the NonNull pointer is owned by
the resulting Box. Specifically, the Box destructor will call
the destructor of T and free the allocated memory. For this
to be safe, the memory must have been allocated in accordance
with the memory layout used by Box .
§Safety
This function is unsafe because improper use may lead to
memory problems. For example, a double-free may occur if the
function is called twice on the same NonNull pointer.
The non-null pointer must point to a block of memory allocated by the global allocator.
The safety conditions are described in the memory layout section.
Note that the considerations for unsafe code apply to all Box<T> values.
§Examples
Recreate a Box which was previously converted to a NonNull
pointer using Box::into_non_null:
let x = Box::new(5);
let non_null = Box::into_non_null(x);
let x = unsafe { Box::from_non_null(non_null) };
Manually create a Box from scratch by using the global allocator:
use std::alloc::{alloc, Layout};
use std::ptr::NonNull;
unsafe {
let non_null = NonNull::new(alloc(Layout::new::<i32>()).cast::<i32>())
.expect("alloc should have successfully allocated memory");
// In general .write is required to avoid attempting to destruct
// the (uninitialized) previous contents of `non_null`.
non_null.write(5);
let x = Box::from_non_null(non_null);
}
Consumes the Box, returning a wrapped raw pointer.
The pointer will be properly aligned and non-null.
After calling this function, the caller is responsible for the
memory previously managed by the Box. In particular, the
caller should properly destroy T and release the memory, taking
into account the memory layout used by Box. The easiest way to
do this is to convert the raw pointer back into a Box with the
Box::from_raw function, allowing the Box destructor to perform
the cleanup.
Note: this is an associated function, which means that you have
to call it as Box::into_raw(b) instead of b.into_raw(). This
is so that there is no conflict with a method on the inner type.
§Examples
Converting the raw pointer back into a Box with Box::from_raw
for automatic cleanup:
let x = Box::new(String::from("Hello"));
let ptr = Box::into_raw(x);
let x = unsafe { Box::from_raw(ptr) };
Manual cleanup by explicitly running the destructor and deallocating
the memory:
use std::alloc::{dealloc, Layout};
use std::ptr;
let x = Box::new(String::from("Hello"));
let ptr = Box::into_raw(x);
unsafe {
ptr::drop_in_place(ptr);
dealloc(ptr as *mut u8, Layout::new::<String>());
}
Note: This is equivalent to the following:
let x = Box::new(String::from("Hello"));
let ptr = Box::into_raw(x);
unsafe {
drop(Box::from_raw(ptr));
}
Consumes the Box, returning a wrapped NonNull pointer.
The pointer will be properly aligned.
After calling this function, the caller is responsible for the
memory previously managed by the Box. In particular, the
caller should properly destroy T and release the memory, taking
into account the memory layout used by Box. The easiest way to
do this is to convert the NonNull pointer back into a Box with the
Box::from_non_null function, allowing the Box destructor to
perform the cleanup.
Note: this is an associated function, which means that you have
to call it as Box::into_non_null(b) instead of b.into_non_null().
This is so that there is no conflict with a method on the inner type.
§Examples
Converting the NonNull pointer back into a Box with Box::from_non_null
for automatic cleanup:
let x = Box::new(String::from("Hello"));
let non_null = Box::into_non_null(x);
let x = unsafe { Box::from_non_null(non_null) };
Manual cleanup by explicitly running the destructor and deallocating
the memory:
use std::alloc::{dealloc, Layout};
let x = Box::new(String::from("Hello"));
let non_null = Box::into_non_null(x);
unsafe {
non_null.drop_in_place();
dealloc(non_null.as_ptr().cast::<u8>(), Layout::new::<String>());
}
Note: This is equivalent to the following:
let x = Box::new(String::from("Hello"));
let non_null = Box::into_non_null(x);
unsafe {
drop(Box::from_non_null(non_null));
}
🔬This is a nightly-only experimental API. (allocator_api #32838)
Constructs a box from a raw pointer in the given allocator.
After calling this function, the raw pointer is owned by the
resulting Box. Specifically, the Box destructor will call
the destructor of T and free the allocated memory. For this
to be safe, the memory must have been allocated in accordance
with the memory layout used by Box .
§Safety
This function is unsafe because improper use may lead to
memory problems. For example, a double-free may occur if the
function is called twice on the same raw pointer.
The raw pointer must point to a block of memory allocated by alloc.
The safety conditions are described in the memory layout section.
Note that the considerations for unsafe code apply to all Box<T, A> values.
§Examples
Recreate a Box which was previously converted to a raw pointer
using Box::into_raw_with_allocator:
#![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) };
Manually create a Box from scratch by using the system allocator:
#![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;
// In general .write is required to avoid attempting to destruct
// the (uninitialized) previous contents of `ptr`, though for this
// simple example `*ptr = 5` would have worked as well.
ptr.write(5);
let x = Box::from_raw_in(ptr, System);
}
🔬This is a nightly-only experimental API. (allocator_api #32838)
Constructs a box from a NonNull pointer in the given allocator.
After calling this function, the NonNull pointer is owned by
the resulting Box. Specifically, the Box destructor will call
the destructor of T and free the allocated memory. For this
to be safe, the memory must have been allocated in accordance
with the memory layout used by Box .
§Safety
This function is unsafe because improper use may lead to
memory problems. For example, a double-free may occur if the
function is called twice on the same raw pointer.
The non-null pointer must point to a block of memory allocated by alloc.
The safety conditions are described in the memory layout section.
Note that the considerations for unsafe code apply to all Box<T, A> values.
§Examples
Recreate a Box which was previously converted to a NonNull pointer
using Box::into_non_null_with_allocator:
#![feature(allocator_api)]
use std::alloc::System;
let x = Box::new_in(5, System);
let (non_null, alloc) = Box::into_non_null_with_allocator(x);
let x = unsafe { Box::from_non_null_in(non_null, alloc) };
Manually create a Box from scratch by using the system allocator:
#![feature(allocator_api)]
use std::alloc::{Allocator, Layout, System};
unsafe {
let non_null = System.allocate(Layout::new::<i32>())?.cast::<i32>();
// In general .write is required to avoid attempting to destruct
// the (uninitialized) previous contents of `non_null`.
non_null.write(5);
let x = Box::from_non_null_in(non_null, System);
}
🔬This is a nightly-only experimental API. (allocator_api #32838)
Consumes the Box, returning a wrapped raw pointer and the allocator.
The pointer will be properly aligned and non-null.
After calling this function, the caller is responsible for the
memory previously managed by the Box. In particular, the
caller should properly destroy T and release the memory, taking
into account the memory layout used by Box. The easiest way to
do this is to convert the raw pointer back into a Box with the
Box::from_raw_in function, allowing the Box destructor to perform
the cleanup.
Note: this is an associated function, which means that you have
to call it as Box::into_raw_with_allocator(b) instead of b.into_raw_with_allocator(). This
is so that there is no conflict with a method on the inner type.
§Examples
Converting the raw pointer back into a Box with Box::from_raw_in
for automatic cleanup:
#![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) };
Manual cleanup by explicitly running the destructor and deallocating
the memory:
#![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>());
}
🔬This is a nightly-only experimental API. (allocator_api #32838)
Consumes the Box, returning a wrapped NonNull pointer and the allocator.
The pointer will be properly aligned.
After calling this function, the caller is responsible for the
memory previously managed by the Box. In particular, the
caller should properly destroy T and release the memory, taking
into account the memory layout used by Box. The easiest way to
do this is to convert the NonNull pointer back into a Box with the
Box::from_non_null_in function, allowing the Box destructor to
perform the cleanup.
Note: this is an associated function, which means that you have
to call it as Box::into_non_null_with_allocator(b) instead of
b.into_non_null_with_allocator(). This is so that there is no
conflict with a method on the inner type.
§Examples
Converting the NonNull pointer back into a Box with
Box::from_non_null_in for automatic cleanup:
#![feature(allocator_api)]
use std::alloc::System;
let x = Box::new_in(String::from("Hello"), System);
let (non_null, alloc) = Box::into_non_null_with_allocator(x);
let x = unsafe { Box::from_non_null_in(non_null, alloc) };
Manual cleanup by explicitly running the destructor and deallocating
the memory:
#![feature(allocator_api)]
use std::alloc::{Allocator, Layout, System};
let x = Box::new_in(String::from("Hello"), System);
let (non_null, alloc) = Box::into_non_null_with_allocator(x);
unsafe {
non_null.drop_in_place();
alloc.deallocate(non_null.cast::<u8>(), Layout::new::<String>());
}
Returns a raw mutable pointer to the Box’s contents.
The caller must ensure that the Box outlives the pointer this
function returns, or else it will end up dangling.
This method guarantees that for the purpose of the aliasing model, this method
does not materialize a reference to the underlying memory, and thus the returned pointer
will remain valid when mixed with other calls to as_ptr, as_mut_ptr, and as_non_null.
Note that calling other methods that materialize references to the memory
may still invalidate this pointer.
See the example below for how this guarantee can be used.
§Examples
Due to the aliasing guarantee, the following code is legal:
unsafe {
let mut b = Box::new(0);
let ptr1 = Box::as_mut_ptr(&mut b);
ptr1.write(1);
let ptr2 = Box::as_mut_ptr(&mut b);
ptr2.write(2);
// Notably, the write to `ptr2` did *not* invalidate `ptr1`:
ptr1.write(3);
}
Returns a raw pointer to the Box’s contents.
The caller must ensure that the Box outlives the pointer this
function returns, or else it will end up dangling.
The caller must also ensure that the memory the pointer (non-transitively) points to
is never written to (except inside an UnsafeCell) using this pointer or any pointer
derived from it. If you need to mutate the contents of the Box, use as_mut_ptr.
This method guarantees that for the purpose of the aliasing model, this method
does not materialize a reference to the underlying memory, and thus the returned pointer
will remain valid when mixed with other calls to as_ptr, as_mut_ptr, and as_non_null.
Note that calling other methods that materialize mutable references to the memory,
as well as writing to this memory, may still invalidate this pointer.
See the example below for how this guarantee can be used.
§Examples
Due to the aliasing guarantee, the following code is legal:
unsafe {
let mut v = Box::new(0);
let ptr1 = Box::as_ptr(&v);
let ptr2 = Box::as_mut_ptr(&mut v);
let _val = ptr2.read();
// No write to this memory has happened yet, so `ptr1` is still valid.
let _val = ptr1.read();
// However, once we do a write...
ptr2.write(1);
// ... `ptr1` is no longer valid.
// This would be UB: let _val = ptr1.read();
}
🔬This is a nightly-only experimental API. (box_as_non_null #157345)
Returns a NonNull pointer to the Box’s contents.
The caller must ensure that the Box outlives the pointer this
function returns, or else it will end up dangling.
This method guarantees that for the purpose of the aliasing model, this method
does not materialize a reference to the underlying memory, and thus the returned pointer
will remain valid when mixed with other calls to as_ptr, as_mut_ptr, and as_non_null.
Note that calling other methods that materialize references to the memory
may still invalidate this pointer.
See the example below for how this guarantee can be used.
§Examples
Due to the aliasing guarantee, the following code is legal:
#![feature(box_as_non_null)]
unsafe {
let mut b = Box::new(0);
let ptr1 = Box::as_non_null(&mut b);
ptr1.write(1);
let ptr2 = Box::as_non_null(&mut b);
ptr2.write(2);
// Notably, the write to `ptr2` did *not* invalidate `ptr1`:
ptr1.write(3);
}
🔬This is a nightly-only experimental API. (allocator_api #32838)
Returns a reference to the underlying allocator.
Note: this is an associated function, which means that you have
to call it as Box::allocator(&b) instead of b.allocator(). This
is so that there is no conflict with a method on the inner type.
Consumes and leaks the Box, returning a mutable reference,
&'a mut T.
Note that the type T must outlive the chosen lifetime 'a. If the type
has only static references, or none at all, then this may be chosen to be
'static.
This function is mainly useful for data that lives for the remainder of the program’s life,
i.e., memory that is meant to leak. If the memory should eventually be freed, prefer to use
Box::into_raw or Box::into_non_null instead. Reconstructing (“unleaking”) a Box from
the mutable reference returned here (e.g. via Box::from_raw) is only possible if the
allocator is Global, and even then it is a grey area (meaning it is possible under specific
circumstances but many seemingly harmless ways of doing it are undefined behavior) and should
be avoided.
Note: this is an associated function, which means that you have
to call it as Box::leak(b) instead of b.leak(). This
is so that there is no conflict with a method on the inner type.
§Examples
Simple usage:
let x = Box::new(41);
let static_ref: &'static mut usize = Box::leak(x);
*static_ref += 1;
assert_eq!(*static_ref, 42);
Unsized data:
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]);
Converts a Box<T> into a Pin<Box<T>>. If T does not implement Unpin, then
*boxed will be pinned in memory and unable to be moved.
This conversion does not allocate on the heap and happens in place.
This is also available via From.
Constructing and pinning a Box with Box::into_pin(Box::new(x))
can also be written more concisely using Box::pin(x).
This into_pin method is useful if you already have a Box<T>, or you are
constructing a (pinned) Box in a different way than with Box::new.
§Notes
It’s not recommended that crates add an impl like From<Box<T>> for Pin<T>,
as it’ll introduce an ambiguity when calling Pin::from.
A demonstration of such a poor impl is shown below.
ⓘstruct Foo; // A type defined in this crate.
impl From<Box<()>> for Pin<Foo> {
fn from(_: Box<()>) -> Pin<Foo> {
Pin::new(Foo)
}
}
let foo = Box::new(());
let bar = Pin::from(foo);
Trait Implementations§1.80.0 · Source§This implementation is required to make sure that the Box<[I]>: IntoIterator
implementation doesn’t overlap with IntoIterator for T where T: Iterator blanket.
1.80.0 · Source§This implementation is required to make sure that the &Box<[I]>: IntoIterator
implementation doesn’t overlap with IntoIterator for T where T: Iterator blanket.
1.80.0 · Source§This implementation is required to make sure that the &mut Box<[I]>: IntoIterator
implementation doesn’t overlap with IntoIterator for T where T: Iterator blanket.
1.99.0 · Source§This implementation is required to make sure that the Box<[I; N]>: IntoIterator
implementation doesn’t overlap with IntoIterator for T where T: Iterator blanket.
1.99.0 · Source§This implementation is required to make sure that the &Box<[I; N]>: IntoIterator
implementation doesn’t overlap with IntoIterator for T where T: Iterator blanket.
1.99.0 · Source§This implementation is required to make sure that the &mut Box<[I; N]>: IntoIterator
implementation doesn’t overlap with IntoIterator for T where T: Iterator blanket.
🔬This is a nightly-only experimental API. (allocator_api #32838) Attempts to allocate a block of memory. Read more
🔬This is a nightly-only experimental API. (allocator_api #32838) Behaves like allocate, but also ensures that the returned memory is zero-initialized. Read more
🔬This is a nightly-only experimental API. (allocator_api #32838) Deallocates the memory referenced by ptr. Read more
🔬This is a nightly-only experimental API. (allocator_api #32838) Attempts to extend the memory block. Read more
🔬This is a nightly-only experimental API. (allocator_api #32838) Behaves like grow, but also ensures that the new contents are set to zero before being
returned. Read more
🔬This is a nightly-only experimental API. (allocator_api #32838) Attempts to shrink the memory block. Read more1.64.0 · Source§Available on Hermit or Motor OS or Trusty or Unix or WASI only. 1.71.0 · Source§Available on Windows only.
Converts this type into a mutable reference of the (usually inferred) input type. 1.63.0 · Source§Available on Hermit or Motor OS or Trusty or Unix or WASI only.
Converts this type into a shared reference of the (usually inferred) input type. 1.71.0 · Source§Available on Windows only.
🔬This is a nightly-only experimental API. (async_fn_traits) Call the AsyncFn, returning a future which may borrow from the called closure.
🔬This is a nightly-only experimental API. (async_fn_traits)
🔬This is a nightly-only experimental API. (async_fn_traits) Call the AsyncFnMut, returning a future which may borrow from the called closure.
🔬This is a nightly-only experimental API. (async_fn_traits) Output type of the called closure’s future.
🔬This is a nightly-only experimental API. (async_fn_traits)
🔬This is a nightly-only experimental API. (async_fn_traits) Call the AsyncFnOnce, returning a future which may move out of the called closure.
🔬This is a nightly-only experimental API. (async_iterator #79024) The type of items yielded by the async iterator.
🔬This is a nightly-only experimental API. (async_iterator #79024) Attempts to pull out the next value of this async iterator, registering the
current task for wakeup if the value is not yet available, and returning
None if the async iterator is exhausted. Read more
🔬This is a nightly-only experimental API. (async_iterator #79024) Returns the bounds on the remaining length of the async iterator. Read more
Immutably borrows from an owned value. Read more
Mutably borrows from an owned value. Read more
Returns the contents of the internal buffer, filling it with more data, via Read methods, if empty. Read more
Marks the given amount of additional bytes from the internal buffer as having been read.
Subsequent calls to read only return bytes that have not been marked as read. Read more
🔬This is a nightly-only experimental API. (buf_read_has_data_left #86423) Checks if there is any data left to be read. Read more
Reads all bytes into buf until the delimiter byte or EOF is reached. Read more
Skips all bytes until the delimiter byte or EOF is reached. Read more
Reads all bytes until a newline (the 0xA byte) is reached, and append
them to the provided String buffer. Read more
Returns an iterator over the contents of this reader split on the byte
byte. Read more
Returns an iterator over the lines of this reader. Read more
Returns a new box with a clone() of this box’s contents.
§Examples
let x = Box::new(5);
let y = x.clone();
// The value is the same
assert_eq!(x, y);
// But they are unique objects
assert_ne!(&*x as *const i32, &*y as *const i32);
Copies source’s contents into self without creating a new allocation.
§Examples
let x = Box::new(5);
let mut y = Box::new(10);
let yp: *const i32 = &*y;
y.clone_from(&x);
// The value is the same
assert_eq!(x, y);
// And no allocation occurred
assert_eq!(yp, &*y);
Copies source’s contents into self without creating a new allocation,
so long as the two are of the same length.
§Examples
let x = Box::new([5, 6, 7]);
let mut y = Box::new([8, 9, 10]);
let yp: *const [i32] = &*y;
y.clone_from(&x);
// The value is the same
assert_eq!(x, y);
// And no allocation occurred
assert_eq!(yp, &*y);
Performs copy-assignment from source. Read more
Performs copy-assignment from source. Read more
Performs copy-assignment from source. Read more
Performs copy-assignment from source. Read more
Performs copy-assignment from source. Read more
🔬This is a nightly-only experimental API. (coroutine_trait #43122) The type of value this coroutine yields. Read more
🔬This is a nightly-only experimental API. (coroutine_trait #43122) The type of value this coroutine returns. Read more
🔬This is a nightly-only experimental API. (coroutine_trait #43122) Resumes the execution of this coroutine. Read more
🔬This is a nightly-only experimental API. (coroutine_trait #43122) The type of value this coroutine yields. Read more
🔬This is a nightly-only experimental API. (coroutine_trait #43122) The type of value this coroutine returns. Read more
🔬This is a nightly-only experimental API. (coroutine_trait #43122) Resumes the execution of this coroutine. Read more
Formats the value using the given formatter. Read more
Creates a Box<T>, with the Default value for T.
Creates an empty [T] inside a Box.
Returns the “default value” for a type. Read more
Returns the “default value” for a type. Read more
Returns the “default value” for a type. Read more
Returns the “default value” for a type. Read more
The resulting type after dereferencing.
Dereferences the value.
Mutably dereferences the value.
Formats the value using the given formatter. Read more
Removes and returns an element from the end of the iterator. Read more
Returns the nth element from the end of the iterator. Read more
🔬This is a nightly-only experimental API. (iter_next_chunk #98326) Advances from the back of the iterator and returns an array containing the next
N values in sequence. Read more
🔬This is a nightly-only experimental API. (iter_advance_by #77404) Advances the iterator from the back by n elements. Read more
An iterator method that reduces the iterator’s elements to a single,
final value, starting from the back. Read more
Searches for an element of an iterator from the back that satisfies a predicate. Read more
Executes the destructor for this type. Read more
🔬This is a nightly-only experimental API. (pin_ergonomics #130494) Execute the destructor for this type, but different to Drop::drop, it requires self
to be pinned. Read more
👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
Returns the lower-level source of this error, if any. Read more
🔬This is a nightly-only experimental API. (error_generic_member_access #99301) Provides type-based access to context intended for error reports. Read more
👎Deprecated since 1.42.0: use the Display impl or to_string()
Returns the exact remaining length of the iterator. Read more
🔬This is a nightly-only experimental API. (exact_size_is_empty #35428) Returns true if the iterator is empty. Read more
Extends a collection with the contents of an iterator. Read more
🔬This is a nightly-only experimental API. (extend_one #72631) Extends a collection with exactly one element.
🔬This is a nightly-only experimental API. (extend_one #72631) Reserves capacity in a collection for the given number of additional elements. Read more
🔬This is a nightly-only experimental API. (fn_traits #29625) Performs the call operation.
🔬This is a nightly-only experimental API. (fn_traits #29625) Performs the call operation.
The returned type after the call operator is used.
🔬This is a nightly-only experimental API. (fn_traits #29625) Performs the call operation.
Converts a &CStr into a Box<CStr>,
by copying the contents into a newly allocated Box.
Copies the string into a newly allocated Box<OsStr>.
Creates a boxed Path from a reference.
This will allocate and clone path to it.
Converts a &[T] into a Box<[T]>
This conversion allocates on the heap
and performs a copy of slice and its contents.
§Examples
// create a &[u8] which will be used to create a Box<[u8]>
let slice: &[u8] = &[104, 101, 108, 108, 111];
let boxed_slice: Box<[u8]> = Box::from(slice);
println!("{boxed_slice:?}");
Converts a &mut CStr into a Box<CStr>,
by copying the contents into a newly allocated Box.
Copies the string into a newly allocated Box<OsStr>.
Creates a boxed Path from a reference.
This will allocate and clone path to it.
Converts a &mut [T] into a Box<[T]>
This conversion allocates on the heap
and performs a copy of slice and its contents.
§Examples
// create a &mut [u8] which will be used to create a Box<[u8]>
let mut array = [104, 101, 108, 108, 111];
let slice: &mut [u8] = &mut array;
let boxed_slice: Box<[u8]> = Box::from(slice);
println!("{boxed_slice:?}");
Converts a &mut str into a Box<str>
This conversion allocates on the heap
and performs a copy of s.
§Examples
let mut original = String::from("hello");
let original: &mut str = &mut original;
let boxed: Box<str> = Box::from(original);
println!("{boxed}");
Converts a &str into a Box<str>
This conversion allocates on the heap
and performs a copy of s.
§Examples
let boxed: Box<str> = Box::from("hello");
println!("{boxed}");
Converts a str into a box of dyn Error + Send + Sync.
§Examples
use std::error::Error;
let a_str_error = "a str error";
let a_boxed_error = Box::<dyn Error + Send + Sync>::from(a_str_error);
assert!(
size_of::<Box<dyn Error + Send + Sync>>() == size_of_val(&a_boxed_error))
Converts a str into a box of dyn Error.
§Examples
use std::error::Error;
let a_str_error = "a str error";
let a_boxed_error = Box::<dyn Error>::from(a_str_error);
assert!(size_of::<Box<dyn Error>>() == size_of_val(&a_boxed_error))
Converts to this type from the input type.
Converts a Box<Path> into a PathBuf.
This conversion does not allocate or copy memory.
Converts a Box<T> into a Pin<Box<T>>. If T does not implement Unpin, then
*boxed will be pinned in memory and unable to be moved.
This conversion does not allocate on the heap and happens in place.
This is also available via Box::into_pin.
Constructing and pinning a Box with <Pin<Box<T>>>::from(Box::new(x))
can also be written more concisely using Box::pin(x).
This From implementation is useful if you already have a Box<T>, or you are
constructing a (pinned) Box in a different way than with Box::new.
Move a boxed object to a new, reference counted, allocation.
§Example
let original: Box<i32> = Box::new(1);
let shared: Rc<i32> = Rc::from(original);
assert_eq!(1, *shared);
Move a boxed object to a new, reference-counted allocation.
§Example
let unique: Box<str> = Box::from("eggplant");
let shared: Arc<str> = Arc::from(unique);
assert_eq!("eggplant", &shared[..]);
Converts a boxed slice into a vector by transferring ownership of
the existing heap allocation.
§Examples
let b: Box<[i32]> = vec![1, 2, 3].into_boxed_slice();
assert_eq!(Vec::from(b), vec![1, 2, 3]);
Converts to this type from the input type.
Converts a Box<str> into a Box<[u8]>
This conversion does not allocate on the heap and happens in place.
§Examples
// create a Box<str> which will be used to create a Box<[u8]>
let boxed: Box<str> = Box::from("hello");
let boxed_str: Box<[u8]> = Box::from(boxed);
// create a &[u8] which will be used to create a Box<[u8]>
let slice: &[u8] = &[104, 101, 108, 108, 111];
let boxed_slice = Box::from(slice);
assert_eq!(boxed_slice, boxed_str);
Converts the given boxed str slice to a String.
It is notable that the str slice is owned.
§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)
Converts a Cow<'a, CStr> into a Box<CStr>,
by copying the contents if they are borrowed.
Converts a Cow<'a, OsStr> into a Box<OsStr>,
by copying the contents if they are borrowed.
Creates a boxed Path from a clone-on-write pointer.
Converting from a Cow::Owned does not clone or allocate.
Converts a Cow<'_, [T]> into a Box<[T]>
When cow is the Cow::Borrowed variant, this
conversion allocates on the heap and copies the
underlying slice. Otherwise, it will try to reuse the owned
Vec’s allocation.
Converts a Cow<'_, str> into a Box<str>
When cow is the Cow::Borrowed variant, this
conversion allocates on the heap and copies the
underlying str. Otherwise, it will try to reuse the owned
String’s allocation.
§Examples
use std::borrow::Cow;
let unboxed = Cow::Borrowed("hello");
let boxed: Box<str> = Box::from(unboxed);
println!("{boxed}");
let unboxed = Cow::Owned("hello".to_string());
let boxed: Box<str> = Box::from(unboxed);
println!("{boxed}");
Converts a Cow into a box of dyn Error + Send + Sync.
§Examples
use std::error::Error;
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!(
size_of::<Box<dyn Error + Send + Sync>>() == size_of_val(&a_boxed_error))
Converts a Cow into a box of dyn Error.
§Examples
use std::error::Error;
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!(size_of::<Box<dyn Error>>() == size_of_val(&a_boxed_error))
Converts a type of Error into a box of dyn Error.
§Examples
use std::error::Error;
use std::fmt;
#[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 == size_of_val(&an_error));
let a_boxed_error = Box::<dyn Error>::from(an_error);
assert!(size_of::<Box<dyn Error>>() == size_of_val(&a_boxed_error))
Converts a type of Error + Send + Sync into a box of
dyn Error + Send + Sync.
§Examples
use std::error::Error;
use std::fmt;
#[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 == size_of_val(&an_error));
let a_boxed_error = Box::<dyn Error + Send + Sync>::from(an_error);
assert!(
size_of::<Box<dyn Error + Send + Sync>>() == size_of_val(&a_boxed_error))
Converts a PathBuf into a Box<Path>.
This conversion currently should not allocate memory,
but this behavior is not guaranteed on all platforms or in all future versions.
Converts a String into a box of dyn Error + Send + Sync.
§Examples
use std::error::Error;
let a_string_error = "a string error".to_string();
let a_boxed_error = Box::<dyn Error + Send + Sync>::from(a_string_error);
assert!(
size_of::<Box<dyn Error + Send + Sync>>() == size_of_val(&a_boxed_error))
Converts a String into a box of dyn Error.
§Examples
use std::error::Error;
let a_string_error = "a string error".to_string();
let a_boxed_error = Box::<dyn Error>::from(a_string_error);
assert!(size_of::<Box<dyn Error>>() == size_of_val(&a_boxed_error))
Converts the given String to a boxed str slice that is owned.
§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)
Converts a T into a Box<T>
The conversion allocates on the heap and moves t
from the stack into it.
§Examples
let x = 5;
let boxed = Box::new(5);
assert_eq!(Box::from(x), boxed);
Converts a vector into a boxed slice.
Before doing the conversion, this method discards excess capacity like Vec::shrink_to_fit.
§Examples
assert_eq!(Box::from(vec![1, 2, 3]), vec![1, 2, 3].into_boxed_slice());
Any excess capacity is removed:
let mut vec = Vec::with_capacity(10);
vec.extend([1, 2, 3]);
assert_eq!(Box::from(vec), vec![1, 2, 3].into_boxed_slice());
Converts a [T; N] into a Box<[T]>
This conversion moves the array to newly heap-allocated memory.
§Examples
let boxed: Box<[u8]> = Box::from([4, 2]);
println!("{boxed:?}");
The type of value produced on completion.
Attempts to resolve the future to a final value, registering
the current task for wakeup if the value is not yet available. Read more
Returns the hash value for the values written so far. Read more
Writes a single u8 into this hasher.
Writes a single u16 into this hasher.
Writes a single u32 into this hasher.
Writes a single u64 into this hasher.
Writes a single u128 into this hasher.
Writes a single usize into this hasher.
Writes a single i8 into this hasher.
Writes a single i16 into this hasher.
Writes a single i32 into this hasher.
Writes a single i64 into this hasher.
Writes a single i128 into this hasher.
Writes a single isize into this hasher.
🔬This is a nightly-only experimental API. (hasher_prefixfree_extras #96762) Writes a length prefix into this hasher, as part of being prefix-free. Read more
🔬This is a nightly-only experimental API. (hasher_prefixfree_extras #96762) Writes a single str into this hasher. Read more
Which kind of iterator are we turning this into?
The type of the elements being iterated over.
Which kind of iterator are we turning this into?
The type of the elements being iterated over.
Which kind of iterator are we turning this into?
The type of the elements being iterated over.
Which kind of iterator are we turning this into?
The type of the elements being iterated over.
Which kind of iterator are we turning this into?
The type of the elements being iterated over.
Which kind of iterator are we turning this into?
The type of the elements being iterated over.
The type of the elements being iterated over.
Advances the iterator and returns the next value. Read more
Returns the bounds on the remaining length of the iterator. Read more
Returns the nth element of the iterator. Read more
Consumes the iterator, returning the last element. Read more
🔬This is a nightly-only experimental API. (iter_next_chunk #98326) Advances the iterator and returns an array containing the next N values. Read more
Consumes the iterator, counting the number of iterations and returning it. Read more
🔬This is a nightly-only experimental API. (iter_advance_by #77404) Advances the iterator by n elements. Read more
Creates an iterator starting at the same point, but stepping by
the given amount at each iteration. Read more
Takes two iterators and creates a new iterator over both in sequence. Read more
‘Zips up’ two iterators into a single iterator of pairs. Read more
🔬This is a nightly-only experimental API. (iter_intersperse #79524) Creates a new iterator which places a copy of separator between items
of the original iterator. Read more
🔬This is a nightly-only experimental API. (iter_intersperse #79524) Creates a new iterator which places an item generated by separator
between items of the original iterator. Read more
Takes a closure and creates an iterator which calls that closure on each
element. Read more
Calls a closure on each element of an iterator. Read more [Page truncated to keep GeezerVison snappy.] |