如何 运行 结果上的函数或默认值?
How do I run a function on a Result or default to a value?
我们希望 运行 函数在 Result
或者如果结果实际上是一个错误有一个默认值。类似于:
let is_dir = entry.file_type().is_dir() || false
// ^--- file_type() returns a Result
// ^--- default to false if Result is an IOError
目前,我们正在使用:
let is_dir = entry.file_type().map(|t| t.is_dir()).unwrap_or(false);
但这似乎非常令人困惑,运行 一个 map
在单个项目结果上。有更好的方法吗?
您可能更熟悉和熟悉 map
函数,因为它在 Iterator
s 中很常见,但使用 map
与 Result
s 和 Option
s 在 Rust 中也被认为是惯用的。如果你想让你的代码更简洁,你可以像这样使用 map_or
:
let is_dir = entry.file_type().map_or(false, |t| t.is_dir());
或者,如果您发现 map
不清楚,您可以使用 if
或 match
来更明确(和冗长):
let is_dir = if let Ok(file_type) = entry.file_type() {
file_type.is_dir()
} else {
false
};
或
let is_dir = match entry.file_type() {
Ok(file_type) => file_type.is_dir(),
_ => false,
};
不一定更好或更坏,但您可以选择:)
我们希望 运行 函数在 Result
或者如果结果实际上是一个错误有一个默认值。类似于:
let is_dir = entry.file_type().is_dir() || false
// ^--- file_type() returns a Result
// ^--- default to false if Result is an IOError
目前,我们正在使用:
let is_dir = entry.file_type().map(|t| t.is_dir()).unwrap_or(false);
但这似乎非常令人困惑,运行 一个 map
在单个项目结果上。有更好的方法吗?
您可能更熟悉和熟悉 map
函数,因为它在 Iterator
s 中很常见,但使用 map
与 Result
s 和 Option
s 在 Rust 中也被认为是惯用的。如果你想让你的代码更简洁,你可以像这样使用 map_or
:
let is_dir = entry.file_type().map_or(false, |t| t.is_dir());
或者,如果您发现 map
不清楚,您可以使用 if
或 match
来更明确(和冗长):
let is_dir = if let Ok(file_type) = entry.file_type() {
file_type.is_dir()
} else {
false
};
或
let is_dir = match entry.file_type() {
Ok(file_type) => file_type.is_dir(),
_ => false,
};
不一定更好或更坏,但您可以选择:)