as_ref().unwrap() 有快捷方式吗?
Is there a shortcut for as_ref().unwrap()?
在我的代码中,我有很多包含 Option<T>
的结构。我需要在很多地方使用它们,所以我的代码中充斥着像 car.engine.as_ref().unwrap()
这样的结构访问。这对代码可读性来说是痛苦的。
在 Option<T>
类型上是否有一个默认函数做同样的事情?喜欢 car.engine.get()
?当然,我可以为每个结构成员编写访问器函数,但这对于如此基本的东西来说似乎有点矫枉过正。我做错了吗?
我对宏不太了解,但是有没有办法用宏来缩短它?
我找不到类似的东西,这并不奇怪,因为 unwrap
通常不鼓励。如果你想处理错误情况,你可以这样做:
if let Some(ref e) = car.engine { println!("foo {}", e.serial); }
else { println!("nope"); }
否则,由于扩展特性,您可以轻松编写自己的函数:
trait OptionExt {
type Value;
fn unwrap_ref(&self) -> &Self::Value;
fn unwrap_mut(&mut self) -> &mut Self::Value;
}
impl <T> OptionExt for Option<T> {
type Value = T;
fn unwrap_ref(&self) -> &T { self.as_ref().unwrap() }
fn unwrap_mut(&mut self) -> &mut T { self.as_mut().unwrap() }
}
// Now you can write
let e = car.engine.unwrap_ref();
您可以利用 ?
运算符(自 Rust 1.22 起)也适用于 Option<T>
类型(就像它对 Result<T, E>
所做的那样):
struct Foo;
struct Bar {
foo: Option<Foo>,
// other optional fields
}
impl Bar {
fn use_optional_fields(&self) -> Option<&Foo> {
let foo = self.foo.as_ref()?;
// use optional fields
Some(foo)
}
}
在我的代码中,我有很多包含 Option<T>
的结构。我需要在很多地方使用它们,所以我的代码中充斥着像 car.engine.as_ref().unwrap()
这样的结构访问。这对代码可读性来说是痛苦的。
在 Option<T>
类型上是否有一个默认函数做同样的事情?喜欢 car.engine.get()
?当然,我可以为每个结构成员编写访问器函数,但这对于如此基本的东西来说似乎有点矫枉过正。我做错了吗?
我对宏不太了解,但是有没有办法用宏来缩短它?
我找不到类似的东西,这并不奇怪,因为 unwrap
通常不鼓励。如果你想处理错误情况,你可以这样做:
if let Some(ref e) = car.engine { println!("foo {}", e.serial); }
else { println!("nope"); }
否则,由于扩展特性,您可以轻松编写自己的函数:
trait OptionExt {
type Value;
fn unwrap_ref(&self) -> &Self::Value;
fn unwrap_mut(&mut self) -> &mut Self::Value;
}
impl <T> OptionExt for Option<T> {
type Value = T;
fn unwrap_ref(&self) -> &T { self.as_ref().unwrap() }
fn unwrap_mut(&mut self) -> &mut T { self.as_mut().unwrap() }
}
// Now you can write
let e = car.engine.unwrap_ref();
您可以利用 ?
运算符(自 Rust 1.22 起)也适用于 Option<T>
类型(就像它对 Result<T, E>
所做的那样):
struct Foo;
struct Bar {
foo: Option<Foo>,
// other optional fields
}
impl Bar {
fn use_optional_fields(&self) -> Option<&Foo> {
let foo = self.foo.as_ref()?;
// use optional fields
Some(foo)
}
}