2016-04-14 16 views
3

angewendet werden, ich habe diesen Fehlerbinäre Operation `|` kann nicht auf den Typ

error: binary operation | cannot be applied to type &mut u16

Mit diesem Code

fn f_op(op: &mut u16) { 

    let mut addr: u16 = (op | 0xFFF); 
    ..// 
} 

es &mut ändern Lösen &

fn f_op(op: & u16) { 

Aber ich frage mich, warum ich | mit &mut nicht verwenden kann, sicher dort exi Das ist ein guter Grund, aber jemand kann es mir erklären.

Play-Rust

+0

Da die meisten primitiven (einschließlich u16) impl kopieren ist es idiomatisch, sie nur nach Wert zu nehmen, da sie kopiert werden, afaict – Restioson

Antwort

7

Da die BitOr trait is not implemented für &mut u16 .. ist es jedoch für &u16.

BitOr trait

Wie viraptor weist darauf hin, man kann auch dereferenzieren mit:

*op | 0xFFF; 

.. das es ein u16 .. die auch implementiert das BitOr Merkmal machen würde, wie Sie oben sehen können.

+0

Jetzt weiß ich, dass es keinen ersichtlichen Grund gibt, zu implementieren, mit *, aber könnte implementiert werden & mut, es ist nur eine hypothetische Frage –

+1

@AngelAngel Nun, sicher, du könntest * es für '& mut' implementieren. Und 'Box'. Und 'Rc'. Und 'Arc'. Und 'P' (benutzt in' rustc'). Und 'Zelle'. Und '* const'. Und '* mut'. Es gibt wahrscheinlich mehr, aber Sie müssen * irgendwann * aufhören; könnte auch das Minimalset sein. –

+1

@DK. Sicher, aber * ich denke *, dass es nur für unveränderliche Referenzen implementiert ist ziemlich willkürlich und führt zu Verwirrung:/Die Implementierung für rohe Zeiger ist höchst unsicher. Mit einem Impl für & mut sollte BitOr für alle sicheren primitiven Typen implementiert werden. –

3

Sie wollen wahrscheinlich den Wert auf or, nicht die Referenz.

let mut addr: u16 = *op | 0xFFF; 
Verwandte Themen