Struct alloc::boxed::Box 1.0.0[−][src]
Expand description
堆分配的指针类型。
有关更多信息,请参见 模块级文档。
Implementations
创建一个具有未初始化内容的新 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
创建一个具有未初始化内容的新 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
创建一个具有未初始化内容的新 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
创建一个具有未初始化内容的新 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
创建一个新的 Pin<Box<T, A>>
。
如果 T
未实现 Unpin
,则 x
将被固定在内存中并且无法移动。
将 Box<T>
转换为 Box<[T]>
这种转换不会在堆上分配,而是就地进行。
创建一个具有未初始化内容的新 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
使用提供的分配器中未初始化的内容创建一个新的 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
使用提供的分配器中未初始化的内容创建一个新的 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
转换为 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
转换为 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
从给定分配器中的裸指针构造 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
消耗 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
返回基础分配器的引用。
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
尝试将 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
🔬 This is a nightly-only experimental API. (iter_advance_by
#77404)
recently added
通过 n
元素从后向前推进迭代器。 Read more
这是 Iterator::try_fold()
的反向版本: 它从迭代器的后面开始接收元素。 Read more
一种迭代器方法,从后面开始,将迭代器的元素减少为单个最终值。 Read more
将 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
从迭代器创建一个值。 Read more
将单个 u128
写入此哈希器。
将单个 usize
写入此哈希器。
将单个 i128
写入此哈希器。
将单个 isize
写入此哈希器。
🔬 This is a nightly-only experimental API. (iter_advance_by
#77404)
recently added
通过 n
元素使迭代器前进。 Read more
fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter> where
U: IntoIterator<Item = Self::Item>,
[src]
fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter> where
U: IntoIterator<Item = Self::Item>,
[src]接受两个迭代器,并依次在两个迭代器上创建一个新的迭代器。 Read more
将两个迭代器压缩为成对的单个迭代器。 Read more
🔬 This is a nightly-only experimental API. (iter_intersperse
#79524)
recently added
创建一个新的迭代器,该迭代器将 separator
的副本放置在原始迭代器的相邻项之间。 Read more
fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G> where
G: FnMut() -> Self::Item,
[src]
fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G> where
G: FnMut() -> Self::Item,
[src]🔬 This is a nightly-only experimental API. (iter_intersperse
#79524)
recently added
创建一个新的迭代器,该迭代器将 separator
生成的项放在原始迭代器的相邻项之间。 Read more
获取一个闭包并创建一个迭代器,该迭代器在每个元素上调用该闭包。 Read more
创建一个迭代器,该迭代器使用闭包确定是否应产生元素。 Read more
创建一个同时过滤和 maps 的迭代器。 Read more
fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P> where
P: FnMut(&Self::Item) -> bool,
[src]
fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P> where
P: FnMut(&Self::Item) -> bool,
[src]fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P> where
P: FnMut(&Self::Item) -> bool,
[src]
fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P> where
P: FnMut(&Self::Item) -> bool,
[src]创建一个迭代器,该迭代器根据谓词产生元素。 Read more
🔬 This is a nightly-only experimental API. (iter_map_while
#68537)
recently added
创建一个迭代器,该迭代器均基于谓词和 maps 产生元素。 Read more
创建一个迭代器,其工作方式类似于 map,但是将嵌套的结构展平。 Read more
创建一个可简化嵌套结构体的迭代器。 Read more
对迭代器的每个元素执行某些操作,将值传递给它。 Read more
#[must_use = "if you really need to exhaust the iterator, consider `.for_each(drop)` instead"]fn collect<B>(self) -> B where
B: FromIterator<Self::Item>,
[src]
#[must_use = "if you really need to exhaust the iterator, consider `.for_each(drop)` instead"]fn collect<B>(self) -> B where
B: FromIterator<Self::Item>,
[src]将迭代器转换为集合。 Read more
使用一个迭代器,从中创建两个集合。 Read more
fn partition_in_place<'a, T, P>(self, predicate: P) -> usize where
Self: DoubleEndedIterator<Item = &'a mut T>,
T: 'a,
P: FnMut(&T) -> bool,
[src]
fn partition_in_place<'a, T, P>(self, predicate: P) -> usize where
Self: DoubleEndedIterator<Item = &'a mut T>,
T: 'a,
P: FnMut(&T) -> bool,
[src]🔬 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
fn try_for_each<F, R>(&mut self, f: F) -> R where
F: FnMut(Self::Item) -> R,
R: Try<Output = ()>,
1.27.0[src]
fn try_for_each<F, R>(&mut self, f: F) -> R where
F: FnMut(Self::Item) -> R,
R: Try<Output = ()>,
1.27.0[src]一个迭代器方法,该方法将一个容易犯错的函数应用于迭代器中的每个项,在第一个错误处停止并返回该错误。 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
fn rposition<P>(&mut self, predicate: P) -> Option<usize> where
Self: ExactSizeIterator + DoubleEndedIterator,
P: FnMut(Self::Item) -> bool,
[src]
fn rposition<P>(&mut self, predicate: P) -> Option<usize> where
Self: ExactSizeIterator + DoubleEndedIterator,
P: FnMut(Self::Item) -> bool,
[src]从右侧搜索迭代器中的元素,并返回其索引。 Read more
返回给出指定函数最大值的元素。 Read more
返回给出相对于指定比较函数的最大值的元素。 Read more
返回给出指定函数中最小值的元素。 Read more
返回给出相对于指定比较函数的最小值的元素。 Read more
反转迭代器的方向。 Read more
将成对的迭代器转换为一对容器。 Read more
创建一个迭代器,该迭代器将复制其所有元素。 Read more
创建一个迭代器,该迭代器将克隆所有元素。 Read more
Lexicographically 将此 Iterator
的元素与另一个元素进行比较。 Read more
fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering where
I: IntoIterator,
F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Ordering,
[src]
fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering where
I: IntoIterator,
F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Ordering,
[src]Lexicographically 就指定的比较函数而言,将此 Iterator
的元素与另一个元素进行比较。 Read more
fn partial_cmp<I>(self, other: I) -> Option<Ordering> where
I: IntoIterator,
Self::Item: PartialOrd<<I as IntoIterator>::Item>,
1.5.0[src]
fn partial_cmp<I>(self, other: I) -> Option<Ordering> where
I: IntoIterator,
Self::Item: PartialOrd<<I as IntoIterator>::Item>,
1.5.0[src]Lexicographically 将此 Iterator
的元素与另一个元素进行比较。 Read more
fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering> where
I: IntoIterator,
F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,
[src]
fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering> where
I: IntoIterator,
F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,
[src]Lexicographically 就指定的比较函数而言,将此 Iterator
的元素与另一个元素进行比较。 Read more
fn eq<I>(self, other: I) -> bool where
I: IntoIterator,
Self::Item: PartialEq<<I as IntoIterator>::Item>,
1.5.0[src]
fn eq<I>(self, other: I) -> bool where
I: IntoIterator,
Self::Item: PartialEq<<I as IntoIterator>::Item>,
1.5.0[src]fn eq_by<I, F>(self, other: I, eq: F) -> bool where
I: IntoIterator,
F: FnMut(Self::Item, <I as IntoIterator>::Item) -> bool,
[src]
fn eq_by<I, F>(self, other: I, eq: F) -> bool where
I: IntoIterator,
F: FnMut(Self::Item, <I as IntoIterator>::Item) -> bool,
[src]fn ne<I>(self, other: I) -> bool where
I: IntoIterator,
Self::Item: PartialEq<<I as IntoIterator>::Item>,
1.5.0[src]
fn ne<I>(self, other: I) -> bool where
I: IntoIterator,
Self::Item: PartialEq<<I as IntoIterator>::Item>,
1.5.0[src]fn lt<I>(self, other: I) -> bool where
I: IntoIterator,
Self::Item: PartialOrd<<I as IntoIterator>::Item>,
1.5.0[src]
fn lt<I>(self, other: I) -> bool where
I: IntoIterator,
Self::Item: PartialOrd<<I as IntoIterator>::Item>,
1.5.0[src]fn le<I>(self, other: I) -> bool where
I: IntoIterator,
Self::Item: PartialOrd<<I as IntoIterator>::Item>,
1.5.0[src]
fn le<I>(self, other: I) -> bool where
I: IntoIterator,
Self::Item: PartialOrd<<I as IntoIterator>::Item>,
1.5.0[src]fn gt<I>(self, other: I) -> bool where
I: IntoIterator,
Self::Item: PartialOrd<<I as IntoIterator>::Item>,
1.5.0[src]
fn gt<I>(self, other: I) -> bool where
I: IntoIterator,
Self::Item: PartialOrd<<I as IntoIterator>::Item>,
1.5.0[src]fn ge<I>(self, other: I) -> bool where
I: IntoIterator,
Self::Item: PartialOrd<<I as IntoIterator>::Item>,
1.5.0[src]
fn ge<I>(self, other: I) -> bool where
I: IntoIterator,
Self::Item: PartialOrd<<I as IntoIterator>::Item>,
1.5.0[src]🔬 This is a nightly-only experimental API. (is_sorted
#53485)
new API
检查此迭代器的元素是否使用给定的比较器函数进行排序。 Read more
fn is_sorted_by_key<F, K>(self, f: F) -> bool where
F: FnMut(Self::Item) -> K,
K: PartialOrd<K>,
[src]
fn is_sorted_by_key<F, K>(self, f: F) -> bool where
F: FnMut(Self::Item) -> K,
K: PartialOrd<K>,
[src]🔬 This is a nightly-only experimental API. (is_sorted
#53485)
new API
检查此迭代器的元素是否使用给定的键提取函数进行排序。 Read more
如果存在,则此方法返回 self
和 other
值之间的顺序。 Read more
Auto Trait Implementations
Blanket Implementations
从拥有的值中借用。 Read more
future 完成时将产生的输出。
根据一个值创建一个 future。
type Searcher = CharPredicateSearcher<'a, F>
type Searcher = CharPredicateSearcher<'a, F>
🔬 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
从 self
和 haystack
构造关联的搜索器以进行搜索。 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 的正面删除模式。
pub fn is_suffix_of(self, haystack: &'a str) -> bool where
CharPredicateSearcher<'a, F>: ReverseSearcher<'a>,
[src]
pub fn is_suffix_of(self, haystack: &'a str) -> bool where
CharPredicateSearcher<'a, F>: ReverseSearcher<'a>,
[src]🔬 This is a nightly-only experimental API. (pattern
#27721)
API not fully fleshed out and ready to be stabilized
检查模式是否与 haystack 的后面匹配
pub fn strip_suffix_of(self, haystack: &'a str) -> Option<&'a str> where
CharPredicateSearcher<'a, F>: ReverseSearcher<'a>,
[src]
pub fn strip_suffix_of(self, haystack: &'a str) -> Option<&'a str> where
CharPredicateSearcher<'a, F>: ReverseSearcher<'a>,
[src]🔬 This is a nightly-only experimental API. (pattern
#27721)
API not fully fleshed out and ready to be stabilized
如果匹配,则从 haystack 的后面删除模式。