为什么我不能从函数返回 Vec<&str>?

Jam*_*mes 5 rust

我正在尝试返回 aVec<&str>但在转换u64&strwhile 循环内部时遇到了问题:

fn latest_ids<'a>(current_id: u64, latest_id: u64) -> Vec<&'a str> {
    let mut ids: Vec<&str> = vec![];
    let mut start = current_id;
    while !(start >= latest_id) {
        start += 1;
        ids.push(start.to_string().as_str());
    }
    ids
}
Run Code Online (Sandbox Code Playgroud)

无法返回引用临时值的值

如果我只返回一个,Vec<String>那么它工作正常。

fn latest_ids<'a>(current_id: u64, latest_id: u64) -> Vec<String> {
    let mut ids: Vec<String> = vec![];
    let mut start = current_id;
    while !(start >= latest_id) {
        start += 1;
        ids.push(start.to_string());
    }
    ids
}
Run Code Online (Sandbox Code Playgroud)

在此之后调用的下一个函数需要一个&str类型参数,所以我应该返回 aVec<&str>还是只返回 aVec<String>并让调用者处理转换?

获得以下结果后要调用的下一个函数latest_ids()

pub fn add_queue(job: &Job, ids: Vec<&str>) -> Result<(), QueueError> {
    let meta_handler = MetaService {};

    match job.meta_type {
        MetaType::One => meta_handler.one().add_fetch_queue(ids).execute(),
        MetaType::Two => meta_handler.two().add_fetch_queue(ids).execute(),
        MetaType::Three => meta_handler.three().add_fetch_queue(ids).execute(),
    }
}
Run Code Online (Sandbox Code Playgroud)

Sim*_*ead 2

您引入的生命周期是说“我正在返回一个字符串引用向量,其生命周期比该函数的生命周期长”。这不是真的,因为您正在创建一个Stringthen 存储对它的引用。该引用将在创建的范围结束时消失String

纯粹从“设计”角度回答你的问题:

我应该返回 Vec<&str> 还是只返回 String 类型的 Vec 并让调用者处理转换?

该方法称为latest_ids.. 并且您传入的 ID 是 64 位整数。我认为考虑到方法的名称,您应该返回 64 位整数并且调用者应该执行转换,这是可以接受的。

fn main() -> std::io::Result<()> {

    let ids: Vec<String> = latest_ids(5, 10).iter().map(|n| n.to_string()).collect();
    let ids_as_string_references: Vec<&str> = ids.iter().map(|n| &**n).collect();

    println!("{:?}", ids_as_string_references);

    Ok(())
}

fn latest_ids(current_id: u64, latest_id: u64) -> Vec<u64> {
    let mut ids = vec![];
    let mut start = current_id;
    while !(start >= latest_id) {
        start += 1;
        ids.push(start);
    }
    ids
}
Run Code Online (Sandbox Code Playgroud)

印刷:["6", "7", "8", "9", "10"]

这里的双重处理是因为你要求参考。根据代码周围的进一步上下文,可能不需要双重处理。如果您使用有关需要引用向量的下一个函数的更多信息来更新您的问题,&str我可以更新我的答案以帮助重新设计它。