我想尝试用变量写一个匹配条件,即
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
陈述?
提前致谢
答案 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 => ...