将值从引用计数复制到拥有的框

时间:2014-05-10 08:13:53

标签: rust

我在代码(std::rc::Rc)中使用引用计数器来跟踪数据结构中多个位置的记录。但是,当我从数据结构中取出记录时,我想将其转换为拥有的指针。

理想情况下,我想销毁所有引用计数并基础记录移动到拥有的指针(无需将其从Rc中复制出来)但我不知道认为这是可能的,因为没有办法保证我已经销毁了所有的Rc-s。

所以我试图通过装箱克隆来创建自己的指针。以下是我尝试做的简化示例:

use std::rc::Rc;

#[deriving(Show, Clone)]
struct Person {
  age: int,
  name: ~str,
}

fn main() {
  let x = Rc::new(Person{ age: 31, name: "Alex".to_owned() });
  let y = box (*x).clone();

  println!("{0:?}", *x);
  println!("{0:?}", y);
}

但是当我编译它时,我得到了

work.rs:11:19: 11:20 error: unexpected token: `.`
work.rs:11   let y = box (*x).clone();
                         ^
alex@alex-xubuntu:~/src/sandbox$ rustc work.rs && ./work

有没有人有任何想法为什么这不起作用?

请注意,以下 可以正常工作,但需要额外付费:

use std::rc::Rc;

#[deriving(Show, Clone)]
struct Person {
  age: int,
  name: ~str,
}

fn main() {
  let x = Rc::new(Person{ age: 31, name: "Alex".to_owned() });
  let y = (*x).clone();
  let z = box y;

  println!("{0:?}", *x);
  println!("{0:?}", z);
}

这是我的生锈版本:

alex@alex-xubuntu:~/src/sandbox$ rustc --version
rustc 0.11-pre (e454851 2014-05-08 06:11:37 -0700)
host: i686-unknown-linux-gnu

提前致谢。

1 个答案:

答案 0 :(得分:2)

box的语法允许放置;宽松的EBNF:

"box" [ "(" expr ? ")" ] expr

如果缺少展示位置值,则会将其视为::std::owned::HEAP;例如,box foo相当于box () foobox (HEAP) foo

这会使您的案例瘫痪,因为它会将*x解释为展示位置值,然后它会尝试将.clone()解析为表达式,这是不合法的。

您必须以考虑到这一点的方式编写它:

let y = box () (*x).clone();