Rust 中的通用占位符或默认值
Generic placeholders or default values in Rust
我正在尝试编写通用命令行解析器。我在处理泛型类型的 "default" 值时遇到问题。 cmd.invoke()
returns a Result<K, E>
,所以那里没有问题,但是当 cmd_to_invoke
是 [=15 时,我如何表示 E
的占位符或默认值=]?在 C# 中,我可以使用 default(E)
。 Rust 中有这样的结构吗?
pub struct Cmd<K, E> {
cmds: Vec<Cmd<K, E>>,
}
impl<K, E> Cmd<K, E> {
pub fn invoke(&mut self, cmd_name: &str) -> Result<K, E> {
let cmd_to_invoke = self.cmds.iter_mut().find(|cmd| cmd.name == cmd_name);
if let Some(cmd) = cmd_to_invoke {
cmd.invoke()
} else {
// Some default / placeholder value for E
Err(/* ? */)
}
}
}
您可能正在寻找 Default
。
例如:
pub struct Cmd<K, E> {}
impl<K, E: Default> Cmd<K, E> {
pub fn invoke(&mut self, cmd_name: &str) -> Result<K, E> {
let cmd_to_invoke = self.cmds.iter_mut().find(|cmd| cmd.name == cmd_name);
if let Some(cmd) = cmd_to_invoke {
cmd.invoke()
} else {
// Some default / placeholder value for E
Err(Default::default())
}
}
}
值得注意的是 std
中的大多数错误类型和流行的 crate 都没有实现 Default
。
在 Rust 中处理多种错误类型的惯用方法是为您的应用程序、库或组件定义您自己的错误 enum
,它为每个可能的底层错误类型实现 From
。这通常会使代码更简单、更易于阅读,并且与 ?
运算符一起工作得非常好。 Here is an example.
如果您编写的库确实必须处理 any 错误类型,那么这将不起作用。在那种情况下,您可能只剩下将 E
约束到 std::error::Error
特征,然后制作一个可以从中转换的自定义错误类型,可能将底层错误作为特征对象引用。
我正在尝试编写通用命令行解析器。我在处理泛型类型的 "default" 值时遇到问题。 cmd.invoke()
returns a Result<K, E>
,所以那里没有问题,但是当 cmd_to_invoke
是 [=15 时,我如何表示 E
的占位符或默认值=]?在 C# 中,我可以使用 default(E)
。 Rust 中有这样的结构吗?
pub struct Cmd<K, E> {
cmds: Vec<Cmd<K, E>>,
}
impl<K, E> Cmd<K, E> {
pub fn invoke(&mut self, cmd_name: &str) -> Result<K, E> {
let cmd_to_invoke = self.cmds.iter_mut().find(|cmd| cmd.name == cmd_name);
if let Some(cmd) = cmd_to_invoke {
cmd.invoke()
} else {
// Some default / placeholder value for E
Err(/* ? */)
}
}
}
您可能正在寻找 Default
。
例如:
pub struct Cmd<K, E> {}
impl<K, E: Default> Cmd<K, E> {
pub fn invoke(&mut self, cmd_name: &str) -> Result<K, E> {
let cmd_to_invoke = self.cmds.iter_mut().find(|cmd| cmd.name == cmd_name);
if let Some(cmd) = cmd_to_invoke {
cmd.invoke()
} else {
// Some default / placeholder value for E
Err(Default::default())
}
}
}
值得注意的是 std
中的大多数错误类型和流行的 crate 都没有实现 Default
。
在 Rust 中处理多种错误类型的惯用方法是为您的应用程序、库或组件定义您自己的错误 enum
,它为每个可能的底层错误类型实现 From
。这通常会使代码更简单、更易于阅读,并且与 ?
运算符一起工作得非常好。 Here is an example.
如果您编写的库确实必须处理 any 错误类型,那么这将不起作用。在那种情况下,您可能只剩下将 E
约束到 std::error::Error
特征,然后制作一个可以从中转换的自定义错误类型,可能将底层错误作为特征对象引用。