我想要一个同时接受&str
和String
的函数。我知道这样做的唯一方法是使用Into<String>
。
但是,在函数内部,我正在尝试匹配Into<String>
。这会导致一些问题,因为手臂是&str
。
这就是我所拥有的(剥离):
struct Location {
language: String,
}
fn new<Str>(language: Str) -> Location
where
Str: Into<String>,
{
Location {
language: {
match &*language.into() {
"canada" => "ca".to_owned(),
"uk" => "uk2".to_owned(),
_ => language.into(),
}
},
}
}
fn main() {}
这会产生错误:
error[E0382]: use of moved value: `language`
--> src/main.rs:14:22
|
11 | match &*language.into() {
| -------- value moved here
...
14 | _ => language.into(),
| ^^^^^^^^ value used here after move
|
= note: move occurs because `language` has type `Str`, which does not implement the `Copy` trait
我的目标是允许传递任何内容,canada
和uk
被换出(其他一切都被遗弃)。
现在,它正在为匹配运算符将language
转换为&str
,这非常有用。唯一的问题是我仍然需要language
作为默认手臂的引用。
我该如何接近这个?是否有一些微不足道的方法可以解决这个问题?
答案 0 :(得分:3)
Rust非常聪明,可以看到匹配语句的_ =>
部分实际上没有借用该值,所以你可以这样做
fn new<Str>(language: Str) -> Location
where
Str: Into<String>,
{
Location {
language: {
let s = language.into();
match &*s {
"canada" => "ca".to_owned(),
"uk" => "uk2".to_owned(),
_ => s,
}
},
}
}