我在代码(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
提前致谢。
答案 0 :(得分:2)
box
的语法允许放置;宽松的EBNF:
"box" [ "(" expr ? ")" ] expr
如果缺少展示位置值,则会将其视为::std::owned::HEAP
;例如,box foo
相当于box () foo
和box (HEAP) foo
。
这会使您的案例瘫痪,因为它会将*x
解释为展示位置值,然后它会尝试将.clone()
解析为表达式,这是不合法的。
您必须以考虑到这一点的方式编写它:
let y = box () (*x).clone();