连接字符串并将它们转换为 &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
存储在某个地方并填充参考 String
s:
的地图
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() {}
我们使用 &*
到 Deref
,String
到 str
,然后使用另一个参考以结束 &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() {}
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
存储在某个地方并填充参考 String
s:
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() {}
我们使用 &*
到 Deref
,String
到 str
,然后使用另一个参考以结束 &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() {}