繁体   English   中英

如何在 Rust 的闭包内返回对新集合的引用?

[英]How might I return a reference to a new collection inside of a closure in Rust?

我正在尝试使用来自外部库的类似地图的 function ,该库基本上具有以下形状:

fn map_like<'a, F>(nums: &[usize], f: F) -> Vec<&'a [u8]>
where
    F: Fn(usize) -> &'a [u8],
{
    nums.iter().map(|num| f(*num)).collect()
}

我也有一个不断的查找“表”:

const NAMES: [&str; 4] = ["Ada", "Hal", "Max", "Val"];

以及先前生成的用于在表中查找项目的索引数组:

let indices: &[usize] = &[0, 3, 1, 2];

我想使用类似地图的 function 从查找表和索引中生成一个“问候”数组(作为字节)。

我可以生成以下琐碎的“问候”:

let greetings: Vec<&[u8]> = map_like(indices, &|i| {
    let name: &str = NAMES[i];
    let greeting: &str = name;
    greeting.as_bytes()
});

// Prints `[[65, 100, 97], [86, 97, 108], [72, 97, 108], [77, 97, 120]]`
println!("{:?}", greetings);

但我真正想做的是用每个名字格式化一个更大的问候语:

// Does not compile
let greetings: Vec<&[u8]> = map_like(indices, &|i| {
    let name: &str = NAMES[i];
    let greeting: String = format!("Hello, {}!", name);
    greeting.as_bytes()
});

不幸的是,编译器不允许这样做。 它抛出以下错误:

error[E0515]: cannot return reference to local variable `greeting`
  --> src/main.rs:10:9
   |
10 |         greeting.as_bytes()
   |         ^^^^^^^^^^^^^^^^^^^ returns a reference to data owned by the current function

我相信我什至了解正在发生的事情: format宏正在创建一个闭包本地的新String ,而as_bytes又创建了一个对它的引用。 由于这个新字符串在闭包结束时被释放,这将导致一个悬空引用,这是编译器不允许的。

即便如此,我还是不知所措。 我想不出一个合理的方法来从编译器满意的每个名称中构造一个更大的问候语。 什么是惯用的 Rust 方法?

您应该返回带有所有权的 String 而不是返回引用。 也就是说,使用String而不是&[u8]像:

fn map_like<F>(nums: &[usize], f: F) -> Vec<String>
where
    F: Fn(usize) -> String,
{
    nums.iter().map(|num| f(*num)).collect()
}

let greetings: Vec<String> = map_like(indices, &|i| {
    let name: &str = NAMES[i];
    let greeting: String = format!("Hello, {}!", name);
    greeting
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM