将结构与String匹配的模式

Tia*_*ago 1 string pattern-matching rust

是否可以匹配String字段?我不能使这个代码工作.

struct Foo {
    x: int,
    y: int,
    str: String
}

pub fn main() {
    let a = Foo { x: 1, y: 2 , str: "Hi".to_string()};
    match a {
        Foo { x: x, y: y, str: "Hi".to_string() } => println!("Found {}, {}", x, y),
        _ => {}
    }
}
Run Code Online (Sandbox Code Playgroud)

给出了这个错误:

<anon>:10:36: 10:37 error: expected one of `,` or `...`, found `.`
<anon>:10         Foo { x: x, y: y, str: "Hi".to_string() } => println!("Found {}, {}", x, y),
                                             ^
Run Code Online (Sandbox Code Playgroud)

win*_*ner 6

match情况可能不包含这样的表达式"Hi".to_string(),唯一不变的(例如3,"Hi")或变量(例如x)要匹配上,String现场您将需要使用模式卫士:

match a {
    Foo { x: x, y: y, str: ref str } if str == &"Hi" =>
        println!("Found {}, {}", x, y),
    _ => {}
}
Run Code Online (Sandbox Code Playgroud)

if str == &"Hi"是模式守卫检查的价值String.请注意,模式保护强制我们使用ref捕获String对它的引用,而不是将其移出结构.