Rust中无法访问的模式匹配

时间:2014-09-01 18:39:07

标签: pattern-matching rust

我想尝试用变量写一个匹配条件,即

fn sub(x: uint ,y: uint) -> Vec<char> {
    let mut out: Vec<char> = Vec::new();
    out.push('-');
    let mut xw: bool = true;
    let mut yw: bool = true;
    let mut count: uint = 0;
    while xw || yw {
        match count {
            x => {out.push('2'); xw = false;}
            y => {out.push('1'); yw = false;}
            _ => {out.push('_');}
        }
    count+=1;
   }
etc

我得到&#34;错误:无法访问的模式&#34; ...

有没有办法很好地做到这一点,还是我回到if陈述?

提前致谢

1 个答案:

答案 0 :(得分:0)

你有点坚持使用ifs(虽然你可以在比赛中使用它们作为后卫)。最可读的选项可能是常规的if链。

这就是你需要编写模式匹配以使其工作的方法:

fn sub(x: uint, y: uint) -> Vec<char> {
    let mut out: Vec<char> = Vec::new();
    out.push('-');
    let mut xw: bool = true;
    let mut yw: bool = true;
    let mut count: uint = 0;
    while xw || yw {
        match count {
            a if a == x => { out.push('2'); xw = false; },
            b if b == y => { out.push('1'); yw = false; },
            _ => out.push('_')
        }
    count+=1;
   }
   // etc
   out
}

您的代码存在的问题是您的x与您传递给您的函数的x不同。相反,x中的match表示&#34;取任何值count并将其绑定到名称x&#34;。

这意味着第一个条件将始终匹配(在函数式编程中,它是&#34; irrefutable&#34;),因此编译器会提醒您匹配的下一个分支无法访问。

如上所述,您可以使用&#34; guard&#34;来避免这种情况,即此代码中的if a == x

match count {
     a if a == x => ...