如何在结构中创建空指针属性,就像在C ++中一样?我不太明白如何制作指向内存中空白空间的指针。
C ++
struct test{
string data;
assocc *el;
}
srtuct assocc {
T *data;
}
锈
struct test {
data: String,
ponts: *const Option<assocc<T>>,
}
struct assocc<T> {
data: T,
}
impl test {
fn new(data: String) -> test {
test {
data: data,
ponts: None,/*This don't work*/
}
}
}
impl<T> assocc<T> {
fn new(data: T) -> assocc {
assocc {
data: data,
}
}
}
答案 0 :(得分:12)
您的代码存在一些问题。首先,Rust类型名称通常是CamelCased,所以让我们从那开始:
struct Test {
data: String,
ponts: *const Option<Assocc<T>>,
}
struct Assocc<T> {
data: T,
}
接下来,因为Test
包含了泛型T
的内容,所以它本身需要是通用的:
struct Test<T> {
data: String,
ponts: *const Option<Assocc<T>>,
}
struct Assocc<T> {
data: T,
}
除非您在绝对需要存储原始指针的情况下执行FFI,否则最好只让Test
结构拥有Assoc
:
struct Test<T> {
data: String,
ponts: Option<Assocc<T>>,
}
struct Assocc<T> {
data: T,
}
impl
块中的某些类型需要更改以添加一些泛型:
impl<T> Test<T> {
fn new(data: String) -> Test<T> {
Test {
data: data,
points: None,
}
}
}
impl<T> Assocc<T> {
fn new(data: T) -> Assocc<T> {
Assocc { data: data }
}
}
最后,让我们添加一个main函数,以确保我们可以按照我们的期望实际使用结构:
struct Test<T> {
data: String,
ponts: Option<Assocc<T>>,
}
struct Assocc<T> {
data: T,
}
impl<T> Test<T> {
fn new(data: String) -> Test<T> {
Test {
data: data,
ponts: None,
}
}
}
impl<T> Assocc<T> {
fn new(data: T) -> Assocc<T> {
Assocc { data: data }
}
}
fn main() {
let mut t = Test::new("Hello!".to_string());
t.ponts = Some(Assocc::new(32));
}
答案 1 :(得分:3)
您可以使用std::ptr::null
:
struct Test<T> {
data: String,
ponts: *const Option<Assocc<T>>,
}
struct Assocc<T> {
data: T,
}
impl<T> Test<T> {
fn new(data: String) -> Test<T> {
Test {
data: data,
ponts: std::ptr::null(),
}
}
}
impl<T> Assocc<T> {
fn new(data: T) -> Assocc<T> {
Assocc {
data: data,
}
}
}
但你确定要在Rust中使用原始指针吗?在Rust中,我们主要使用references。
在Rust中执行此操作的更为惯用的方法如下:
struct Test<'a, T: 'a> {
data: String,
ponts: Option<&'a Assocc<T>>,
}
impl<'a, T> Test<'a, T> {
fn new(data: String) -> Test<'a, T> {
Test {
data: data,
ponts: None,
}
}
}