rust 创建结构的示例时出现缺少结构字段错误

xvw2m8pv  于 2022-12-04  发布在  其他
关注(0)|答案(2)|浏览(207)

我想通过调用给定结构体的new成员函数来创建一个结构体,方法是只初始化一些字段。我得到了一个错误error[E0063]: missing fields b and join_handle in initializer of B::B。这是我的示例代码
main.rs

mod B;
mod A;

fn main() {
    println!("Hello, world!");
}

A.rs

pub struct AS {
    a: String
}

B.rs

use crate::A::AS;
use std::thread;

pub struct B {
    a: String,
    b: AS,
    join_handle: thread::JoinHandle<()>
}

impl B {
    fn new() -> B {
        B {
            a: String::from("Hi"),
        }
    }
}

如何部分初始化结构体?

ftf50wuq

ftf50wuq1#

你不能部分初始化一个结构体。你可以在B中使用Option s:

struct B {
    a: String,
    b: Option<AS>,
    join_handle: Option<thread::JoinHandle<()>>,
}
impl B {
    fn new() -> Self {
        Self {
            a: String::from("hi"),
            b: None,
            join_handle: None,
        }
    }
}

或者使用构建器:

use std::thread;
fn main() {
    println!("Hello, world!");
}

pub struct AS {
    a: String
}

pub struct B {
    a: String,
    b: AS,
    join_handle: thread::JoinHandle<()>
}

impl B {
    fn builder() -> BBuilder {
        BBuilder {
            a: String::from("Hi"),
            b: None,
            join_handle: None,
        }
    }
}

struct BBuilder {
    a: String,
    b: Option<AS>,
    join_handle: Option<thread::JoinHandle<()>>,
}

impl BBuilder {
    fn a(mut self, b: AS) -> Self {
        self.b = Some(b);
        self
    }
    fn join_handle(mut self, join_handle: thread::JoinHandle<()>) -> Self {
        self.join_handle = Some(join_handle);
        self
    }
    fn build(self) -> Option<B> {
        let Self{ a, b, join_handle } = self;
        let b = b?;
        let join_handle = join_handle?;
        Some(B { a, b, join_handle })
    }
}
bnl4lu3b

bnl4lu3b2#

你不能。你不能在Rust中部分初始化任何东西。
也许你需要把一些字段设置为可选字段。

相关问题