2017-07-08 5 views
4

このコード:パターンガードで使用すると、それはなぜ借りるのですか?

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 

私は試合のパターンでmutably借りることができないことを理解し、なぜコンパイラはr.iter()がmutably借りていることを考えるのですか?変更可能な方法で借りる別の方法iter_mutがあります。

&[u8]に別の機能を導入せずにb';'が含まれていることを確認するにはどうすればよいですか? mutably借りないiterが、iter結果はmutably借りている -

答えて

5

エラーメッセージは、もう少し微妙です。

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';') => {} 
     _ => {} 
    } 
} 

Iterator::anyが変更可能な参照によってselfを取るためです現実的には、これは過度に攻撃的な借りチェッカーの例ですe。マッチガードの「外側」から何かを借りるのは悪い考えですが、マッチガードで作成したものを別に借りても安全です。

借用チェッカーがRustのMIRレイヤーを使用するように書き直された場合、この特定のケースが機能する可能性があります。

も参照してください:

+0

それはイテレータのための意味を成しています::任意の可変参照することによって自己を取りますか? – user12341234

+2

@ user12341234はい、そうです。 'next'を呼び出すためにイテレータを変更することができなければなりません。イテレータは、イテレータの内部状態を更新し、各呼び出しごとに異なるものを返すことができます。 – Shepmaster

関連する問題