此代码:
fn t(r: &[u8]) {
match r {
_ if r.iter().any(|&x| x == b';') => {}
_ => {}
}
}
给我错误:
error[E0301]: cannot mutably borrow in a pattern guard
|
10 | _ if r.iter().any(|&x| x == b';') => {}
| ^^^^^^^^ borrowed mutably in pattern guard
我理解我不能在匹配模式中可靠地借用,但为什么编译器会认为r.iter()
可以互相借用?有一个单独的方法iter_mut
可供借用。
如何在不引入单独功能的情况下检查&[u8]
是否包含b';'
?
答案 0 :(得分:5)
错误消息稍微有些细微差别 - iter
不会可靠地借用,但iter
的结果是可以借用的。这是因为Iterator::any
通过可变引用获取self
:
fn any<F>(&mut self, f: F) -> bool
where
F: FnMut(Self::Item) -> bool,
这是一个复制品:
struct X;
impl X {
fn new() -> X { X }
fn predicate(&mut self) -> bool { true }
}
fn main() {
match () {
_ if X::new().predicate() => {}
_ => {}
}
}
我只是检查切片contains
是否为值:
fn t(r: &[u8]) {
match r {
_ if r.contains(&b';') => {}
_ => {}
}
}
实际上,这是借用检查员过于激进的一个例子。可以从比赛后卫的“外线”借来一些东西是个坏主意,但是在比赛后卫中创造的东西可能是安全的。
当借用检查器被重写为使用Rust的MIR层时,这种特殊情况可能会起作用。
另见: