如何在结构中创建空指针属性,就像在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)
您可以使用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)
| 归档时间: |
|
| 查看次数: |
5877 次 |
| 最近记录: |