如何在具有空值的结构中设置字段?

Pal*_*gam 4 null optional rust

新手 rustacean 在这里。我正在编写一个 TCP 客户端,并且conn在我的客户端结构中有一个字段。我的客户端实现了两种方法new来实例化结构并连接以打开与服务器的连接并将其设置为conn字段的值

pub struct FistClient {
    addr: String,
    conn: TcpStream,
}

impl FistClient {
    pub fn new(ip: &str, port: &str) -> Self {
        FistClient {
            addr: String::from(ip) + ":" + &String::from(port),
            // conn: <some-defaullt-value>,
        }
    }

    pub fn connect(&mut self, ip: &str, port: &str) {
        let res = TcpStream::connect(&self.addr);
        match res {
            Ok(c) => self.conn = c,
            Err(_) => panic!(),
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我想conn将新方法中的字段设置为某个默认值。在 Go 中,我可以做类似的事情,conn: nil但在这里不起作用。我也尝试Default::default()过,但该特性没有实现,TCPStream我应该如何将其设置为默认值?

Den*_*ret 11

nullRust 中没有(并且没有空指针异常,Rust 是为安全而设计的)。

你必须要么

1)使用选项(即类型的字段Option<TcpStream>

2)或更好:构建结构时返回结果

在这里,最好的选择可能是从返回 a 的函数内部进行连接Result<FistClient>,这样您就不必检查您的结构是否具有有效的流。

我会做这样的事情:

pub struct FistClient {
    addr: String,
    conn: TcpStream,
}

impl FistClient {
    pub fn new(ip: &str, port: &str) -> Result<Self> {
        let addr = format!("{}:{}", ip, port);
        let conn = TcpStream::connect(&addr)?;
        Ok(FistClient { addr, conn })
    }
}
Run Code Online (Sandbox Code Playgroud)

旁注:最好不要通过调用 来构建应用程序panic,即使您认为自己只是在构建一个脏草稿。改为处理错误

  • @d3Roux 您可以使用 `my_client = FirstClient::new(ip, port)?;` 实例化它(`?` 通常根据应用程序的逻辑被本地错误处理替换)。 (2认同)

Séb*_*uld 5

Option<TCPStream>如果您想保留此调用模式,则需要将类型更改为。anOption表示可能缺少值(即 null),有两个枚举变体:Some(_)None

一旦完成此操作,您可以通过调用as_mut检索Option<&mut T>.


Pet*_*all 5

在 Rust 中, 的想法null是用Option. 您为字段指定类型Option<TcpStream>以指示它可能不存在 ( None),或者是有效值 ( Some(TcpStream))。

pub struct FistClient {
    addr: String,
    conn: Option<TcpStream>,
}

impl FistClient {
    pub fn new(ip: &str, port: &str) -> Self {
        FistClient {
            addr: String::from(ip) + ":" + &String::from(port),
            conn: None,
        }
    }

    pub fn connect(&mut self, ip: &str, port: &str) {
        let res = TcpStream::connect(&self.addr);
        match res {
            Ok(c) => self.conn = Some(c),
            Err(_) => panic!(),
        }
    }
}
Run Code Online (Sandbox Code Playgroud)