将可变特征对象引用移动到框中

时间:2015-04-14 07:15:27

标签: rust

如何将可变特征对象引用移动到框中?例如我或许会期待

struct A {a:i32}
trait B {
    fn dummy(&self) {}
}
impl B for A {}

fn accept_b(x:&mut B) -> Box<B> {
    Box::new(*x)
}

fn main() {
    let mut a = A{a:0};
    accept_b(&a);
}

<子> (playpen link)

...要工作,但它会错误地显示为

<anon>:8:5: 8:13 error: the trait `core::marker::Sized` is not implemented for the type `B` [E0277]
<anon>:8     Box::new(*x)
             ^~~~~~~~
<anon>:8:5: 8:13 note: `B` does not have a constant size known at compile-time
<anon>:8     Box::new(*x)
             ^~~~~~~~
<anon>:8:14: 8:16 error: cannot infer an appropriate lifetime due to conflicting requirements
<anon>:8     Box::new(*x)
                      ^~
<anon>:7:33: 9:2 note: first, the lifetime cannot outlive the anonymous lifetime #1 defined on the block at 7:32...
<anon>:7 fn accept_b(x:&mut B) -> Box<B> {
<anon>:8     Box::new(*x)
<anon>:9 }
<anon>:8:14: 8:16 note: ...so that expression is assignable (expected `B`, found `B`)
<anon>:8     Box::new(*x)
                      ^~
note: but, the lifetime must be valid for the static lifetime...
<anon>:8:5: 8:17 note: ...so that it can be closed over into an object
<anon>:8     Box::new(*x)
             ^~~~~~~~~~~~
<anon>:13:14: 13:16 error: mismatched types:
 expected `&mut B`,
    found `&A`
(values differ in mutability) [E0308]
<anon>:13     accept_b(&a);
                       ^~
error: aborting due to 3 previous errors

...有效地抱怨我无法将特质对象移动到框中。我将值放在首先的框中,然后将该框投射到一个特性框中吗?

可变性规则不应该过渡性地确保我在accept_b中获得的特征是底层对象的唯一所有者,从而支持移动到框中吗?或者Rust没有记录必要的信息来提供这种精确性?我是否误解了可变借用语义?发生了什么事?

1 个答案:

答案 0 :(得分:6)

  

可变性规则不应该过渡性地确保我在accept_b中获得的特征是底层对象的唯一所有者,从而支持移动到框中吗?

不,绝对没有。 accept_b借用了引用,而不是拥有它。

可变性规则只会让您确定您是唯一借用该对象的人,但它不会给您所有权。

实际上,永远不可能摆脱借来的内容并留下参考资料。如果您想要移出&mut引用,可以使用std::mem::replace(..)之类的函数,但它们要求您放置另一个对象来代替您要移出的对象,这又涉及复制实际的内存数据,因此类型必须是Sized

所以不,如果&mut T不是T,则无法移出Sized