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,即使您认为自己只是在构建一个脏草稿。改为处理错误。
Option<TCPStream>如果您想保留此调用模式,则需要将类型更改为。anOption表示可能缺少值(即 null),有两个枚举变体:Some(_)和None。
一旦完成此操作,您可以通过调用as_mut检索Option<&mut T>.
在 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)
| 归档时间: |
|
| 查看次数: |
5482 次 |
| 最近记录: |