【问题标题】:Vector of enum values creates ownership issues枚举值向量会产生所有权问题
【发布时间】:2014-12-14 10:06:26
【问题描述】:

我有两段代码在几天前运行良好。它们看起来相当简单:

1.

let mut mask = 0 as c_ulong;
for bit in bits.iter() {
    mask |= *bit as c_ulong;
}

2.

for bit in vec!(...).iter() {
    if res & *bit as c_ulong != 0 {
        bits.push(*bit);
    }
}

两种情况下的向量迭代向量都包含一个enum,比如:

#[allow(non_camel_case_types)]
#[deriving(PartialEq,Show)]
pub enum SomeEnum {
    BLAH                 = 0x01,
    ...
}

但不幸的是,现在该代码会导致所有 *bit 表达式出现以下错误。

cannot move out of dereference of `&`-pointer

我不明白这个错误。为什么现在不允许?我有一个指向不可变向量的指针,其中枚举变量实际上只是int 值。

另外,我该如何解决?我知道第一种情况可以转换为使用.into_iter() - 没关系,之后我不需要那个向量。但是在第二个片段中,我实际上不能在.into_iter() 之后使用两次bit。虽然我只是第一次比较!

我在这里错过了一些琐碎的事情吗?

【问题讨论】:

    标签: rust ownership


    【解决方案1】:

    您的类型曾经是Copy,但现在是this trait is now opt-in

    #[deriving(Clone, Copy)](或将CloneCopy 添加到现有#[deriving] 属性的特征列表中)添加到您的类型。您需要同时实现CloneCopy,因为Copy is a subtrait of Clone(任何实现Copy 的类型也可以轻松实现Clone)。

    pub trait Copy: Clone { }
    

    【讨论】:

    • 啊,太好了,我不知道它终于实现了。
    • 1.0 现在是#[derive(Clone, Copy)]。每个Copy 类型也必须实现Clone
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多