如何在结构中创建空指针?

时间:2016-08-18 19:33:24

标签: struct rust

如何在结构中创建空指针属性,就像在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,
      }
  }
}

2 个答案:

答案 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,
      }
   }
}