【问题标题】:binary operation `|` cannot be applied to type二元运算`|`不能应用于类型
【发布时间】:2016-04-14 14:25:18
【问题描述】:

我有这个错误

错误:二元运算| 不能应用于类型&mut u16

使用此代码,

fn f_op(op: &mut u16) {

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

解决它把&mut改成&

fn f_op(op: & u16) {

但我想知道为什么我不能将|&mut 一起使用,当然有充分的理由,但有人可以向我解释。

Play-Rust

【问题讨论】:

  • 由于大多数原语(包括 u16)都 impl Copy,所以只按值获取它们更惯用,因为它们会被复制,afaict

标签: rust


【解决方案1】:

因为BitOr trait is not implemented&mut u16.. 但是,它是&u16

正如 viraptor 指出的那样,您也可以通过以下方式取消引用它:

*op | 0xFFF;

.. 这将使它成为 u16.. 它还实现了 BitOr 特征,如您所见。

【讨论】:

  • 现在我知道没有明显的理由使用 * 来实现,但可以为 &mut 实现,这只是一个假设性问题
  • @AngelAngel 好吧,当然,您可以&mut 实现它。和Box。和Rc。和Arc。还有P(用于rustc)。和Cell。和*const。和*mut。可能还有更多,但您必须在某个时候停止;也可能是最小集。
  • @DK。当然,但是我认为只为不可变引用实现它是相当随意的,并且会导致混淆:/ 为原始指针实现它是非常不安全的。因此,对于 &mut 的 impl,BitOr 将为所有安全的原始类型实现。
【解决方案2】:

您可能想要or 值,而不是引用。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-13
    • 2019-08-23
    • 2016-09-20
    • 2015-08-12
    相关资源
    最近更新 更多