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

Ale*_*sev 6 struct rust

如何在结构中创建空指针属性,就像在C++中一样?我不太明白如何制作指向内存中空白空间的指针.

C++

struct test{
    string data;
    assocc *el;
}
srtuct assocc {
  T *data;
}
Run Code Online (Sandbox Code Playgroud)

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,
      }
  }
}
Run Code Online (Sandbox Code Playgroud)

Nat*_*ara 13

您的代码存在一些问题.首先,Rust类型名称通常是CamelCased,所以让我们从那开始:

struct Test {
     data: String,
     ponts: *const Option<Assocc<T>>,
}

struct Assocc<T> {
    data: T,
}
Run Code Online (Sandbox Code Playgroud)

接下来,因为Test包含泛型类型的东西T,它本身需要是通用的:

struct Test<T> {
     data: String,
     ponts: *const Option<Assocc<T>>,
}

struct Assocc<T> {
    data: T,
}
Run Code Online (Sandbox Code Playgroud)

除非你在FFI中你绝对需要存储一个原始指针,否则最好让你的Test结构拥有Assoc:

struct Test<T> {
     data: String,
     ponts: Option<Assocc<T>>,
}

struct Assocc<T> {
    data: T,
}
Run Code Online (Sandbox Code Playgroud)

并且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 }
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,让我们添加一个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));
}
Run Code Online (Sandbox Code Playgroud)


ant*_*oyo 6

您可以使用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,
      }
  }
}
Run Code Online (Sandbox Code Playgroud)

但是您确定要在 Rust 中使用原始指针吗?在 Rust 中,我们主要使用引用

在 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,
      }
   }
}
Run Code Online (Sandbox Code Playgroud)