在匹配实现Into <string>的值时使用移动的值

时间:2018-01-29 03:52:01

标签: rust match

我想要一个同时接受&strString的函数。我知道这样做的唯一方法是使用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

我的目标是允许传递任何内容,canadauk被换出(其他一切都被遗弃)。

现在,它正在为匹配运算符将language转换为&str,这非常有用。唯一的问题是我仍然需要language作为默认手臂的引用。

我该如何接近这个?是否有一些微不足道的方法可以解决这个问题?

1 个答案:

答案 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,
            }
        },
    }
}

On the Playground