使用Box时,无法移出位于共享引用后面的"*X"



我理解引发此错误的原因,但不确定该如何修复。理想情况下,我希望避免使用Copy

fn get_random_samples<'a>(kmers: &[Box<str>], sample_size: usize) -> Vec<Box<str>> {
let mut rng = rand::thread_rng();
kmers
.choose_multiple(&mut rng, sample_size)
.map(|item| *item)
.collect::<Vec<Box<str>>>()
}

这引发了编译错误:

error[E0507]: cannot move out of `*item` which is behind a shared reference
--> srclib.rs:384:21
|
384 |         .map(|item| *item)
|                     ^^^^^ move occurs because `*item` has type `Box<str>`, which does not implement the `Copy` trait

我也试过:

fn get_random_samples<'a>(kmers: &[Box<str>], sample_size: usize) -> Vec<Box<str>> {
let mut rng = rand::thread_rng();
kmers
.choose_multiple(&mut rng, sample_size)
.copied()
.collect::<Vec<Box<str>>>()
}

正如从上一个问题(字符串切片的随机采样(中学到的,但这引发了一个不同的错误:

error[E0277]: the trait bound `Box<str>: std::marker::Copy` is not satisfied
--> srclib.rs:384:10
|
384  |         .copied()
|          ^^^^^^ the trait `std::marker::Copy` is not implemented for `Box<str>`
|
note: required by a bound in `std::iter::Iterator::copied`
--> C:Usersshant.rustuptoolchainsnightly-x86_64-pc-windows-msvclib/rustlib/src/rustlibrarycoresrcitertraitsiterator.rs:2987:12
|
2987 |         T: Copy,
|            ^^^^ required by this bound in `std::iter::Iterator::copied`

这两个错误似乎都指向了Copy特性,理想情况下我希望避免这种特性。

任何帮助都将不胜感激!。

附言:Rust是个新手,如果有更好的方法,请提出建议。

如果您想避免复制/克隆,您需要返回一个引用。例如:

use rand::prelude::SliceRandom;
fn get_random_samples(kmers: &[Box<str>], sample_size: usize) -> Vec<&Box<str>> {
let mut rng = rand::thread_rng();
kmers
.choose_multiple(&mut rng, sample_size)
.collect()
}

游乐场

或:

use rand::prelude::SliceRandom;
fn get_random_samples(kmers: &[Box<str>], sample_size: usize) -> Vec<&str> {
let mut rng = rand::thread_rng();
kmers.choose_multiple(&mut rng, sample_size).map(|e| e as &str).collect()
}

游乐场

最新更新