连接字符串并将它们转换为 &str

Concat String and convert them to &str

fn lyrics_more_bottles(song_template: &mut String, number: i32) {
    let mut template_partials = HashMap::new();
    let mut start_num = number.to_string();
    let mut remaining_num = (number - 1).to_string();

    template_partials.insert("start", start_num + " bottles");
    template_partials.insert("repeat", start_num + " bottles");
    template_partials.insert("remaining", remaining_num + " bottles");
    template_partials.insert("message", "Take one down and pass it around");

    resolve_template(song_template, template_partials);
}

我无法将那些连接的字符串转换为 &str。我试图将它们放在括号中并调用 .as_str()。没有运气。

我需要一个 HashMap<&str, &str>,所以 String 不是一个选项。

如果你需要return函数中的&str,你运气不好,见.

如果你 只是 需要将切片放入 HashMap 并进一步向下传递,你需要将 String 存储在某个地方并填充参考 Strings:

的地图
use std::collections::HashMap;

fn resolve_template(_: &mut String, _: HashMap<&str, &str>) {}

fn lyrics_more_bottles(song_template: &mut String, number: i32) {
    let mut start_num = number.to_string();
    let mut remaining_num = (number - 1).to_string();

    let start = start_num.clone() + " bottles";
    let repeat = start_num + " bottles";
    let remaining = remaining_num + " bottles";

    let mut template_partials = HashMap::new();

    template_partials.insert("start", &*start);
    template_partials.insert("repeat", &*repeat);
    template_partials.insert("remaining", &*remaining);
    template_partials.insert("message", "Take one down and pass it around");

    resolve_template(song_template, template_partials);
}

fn main() {}

我们使用 &*DerefStringstr,然后使用另一个参考以结束 &str

请注意,let mut template_partials 行必须在创建 字符串后移动 ,否则当删除字符串时,映射可能包含对无效内存的引用。此外,start_num 需要克隆,因为它被使用了两次。


就个人而言,我只是使用 format! 并使用相同的字符串两次,而不是克隆和修改它两次:

use std::collections::HashMap;

fn resolve_template(_: &mut String, _: HashMap<&str, &str>) {}

fn lyrics_more_bottles(song_template: &mut String, number: i32) {
    let start_and_repeat = format!("{} bottles", number);
    let remaining = format!("{} bottles", number - 1);

    let mut template_partials = HashMap::new();

    template_partials.insert("start", &*start_and_repeat);
    template_partials.insert("repeat", &*start_and_repeat);
    template_partials.insert("remaining", &*remaining);
    template_partials.insert("message", "Take one down and pass it around");

    resolve_template(song_template, template_partials);
}

fn main() {}