Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 派生PartialEq时,无法移出包含装箱特征对象的枚举上的借用内容_Rust_Ownership_Ownership Semantics - Fatal编程技术网

Rust 派生PartialEq时,无法移出包含装箱特征对象的枚举上的借用内容

Rust 派生PartialEq时,无法移出包含装箱特征对象的枚举上的借用内容,rust,ownership,ownership-semantics,Rust,Ownership,Ownership Semantics,我正在尝试编写一个枚举派生PartialEq,其中包含一个trait对象,该对象可以手动执行此操作。我使用该解决方案是为了迫使Trait的实现者编写一个相等方法。这无法编译: trait Trait { fn partial_eq(&self, rhs: &Box<Trait>) -> bool; } impl PartialEq for Box<Trait> { fn eq(&self, rhs: &Box<

我正在尝试编写一个枚举派生
PartialEq
,其中包含一个trait对象,该对象可以手动执行此操作。我使用该解决方案是为了迫使
Trait
的实现者编写一个相等方法。这无法编译:

trait Trait {
    fn partial_eq(&self, rhs: &Box<Trait>) -> bool;
}

impl PartialEq for Box<Trait> {
    fn eq(&self, rhs: &Box<Trait>) -> bool {
        self.partial_eq(rhs)
    }
}

#[derive(PartialEq)]
enum Enum {
    Trait(Box<Trait>),
}
trait{
fn部分均衡器(&self,rhs:&Box)->bool;
}
框的impl PartialEq{
fn均衡器(&self,rhs:&Box)->bool{
自身部分均衡(rhs)
}
}
#[衍生(部分)]
枚举枚举{
特征(框),
}
错误[E0507]:无法移出借用的内容
-->src/main.rs:13:11
|
13 |特征(框),
|^^^^^^^^^^^^^^无法移出借用的内容

仅当我手动
impl PartialEq for Enum
时才编译此文件。为什么会出现这种情况?

扩展自动派生的
PartialEq实现会显示更好的错误消息:

impl ::std::cmp::PartialEq for Enum {
    #[inline]
    fn eq(&self, __arg_0: &Enum) -> bool {
        match (&*self, &*__arg_0) {
            (&Enum::Trait(ref __self_0), &Enum::Trait(ref __arg_1_0)) => {
                true && (*__self_0) == (*__arg_1_0)
            }
        }
    }
    #[inline]
    fn ne(&self, __arg_0: &Enum) -> bool {
        match (&*self, &*__arg_0) {
            (&Enum::Trait(ref __self_0), &Enum::Trait(ref __arg_1_0)) => {
                false || (*__self_0) != (*__arg_1_0)
            }
        }
    }
}
错误[E0507]:无法移出借用的内容
-->src/main.rs:21:40
|
21 | true&(*uuuu self_0)=(*uu arg_1_0)
|^^^^^^^^^^^^^^^^无法移出借用的内容
错误[E0507]:无法移出借用的内容
-->src/main.rs:29:41
|
29 |假| | |(*|u self_0)!=(*_arg_1_0)
|^^^^^^^^^^^^^^^^无法移出借用的内容
这被追踪为锈蚀问题和其他问题


您可能还需要自己为这种类型实现
PartialEq

您可能希望在
部分eq
中使用
&Trait
<代码>&Box
不需要双间接寻址。