为什么在用于护身符时它会不可取用?

时间:2017-07-08 14:00:56

标签: rust

此代码:

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';'

1 个答案:

答案 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层时,这种特殊情况可能会起作用。

另见: