Error handling 处理输入数据未定义错误
受此启发,我想问一下如何处理Rust中的输入数据类型错误。例如,以下函数要求输入数据类型为Error handling 处理输入数据未定义错误,error-handling,rust,Error Handling,Rust,受此启发,我想问一下如何处理Rust中的输入数据类型错误。例如,以下函数要求输入数据类型为enum Animal。用户实际输入的数据类型没有定义,甚至是空的,如何 我应该在匹配中添加一个None=>None或\u=>None use std::fmt; use std::io::prelude::*; pub enum Animal { Cat(String), Dog, } impl fmt::Display for Animal { fn fmt(&sel
enum Animal
。用户实际输入的数据类型没有定义,甚至是空的,如何
我应该在匹配中添加一个None=>None
或\u=>None
use std::fmt;
use std::io::prelude::*;
pub enum Animal {
Cat(String),
Dog,
}
impl fmt::Display for Animal {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
Animal::Cat(ref c) => f.write_str("c"),
Animal::Dog => f.write_str("d"),
}
}
}
fn main() {
let p: Animal = Animal::Cat("whiskers".to_owned()); // yes, work!
let p: Animal = Animal::BadCat("whiskers".to_owned()); // Badcat not defined,??
}
编译器错误:
错误:在当前作用域中找不到类型“Animal”的名为“BadCat”的关联项
--> :20:25
|
20 |让p:Animal=Animal::BadCat(“胡须”。to_owned());//未定义Badcat,??
| ^^^^^^^^^^^^^^
Rust是一种强大的静态类型编译时类型检查语言
这意味着与Python不同,用户不可能将无效类型传递给您的函数(除非他们传递的数据是通过unsafe
无效强制的,但您无法合理地检测到这一点。请参阅我的关于对bool
的不正确转换)。你不必为此担心
在更一般的情况下,您唯一需要担心在Rust中检查类型变量的时间是从外部Rust接收数据时,例如通过配置或数据文件,或者通过FFI函数。在这些情况下,通常会返回某种类型的结果
,以指示不良数据。然而,在某些情况下,特别是在FFI中,如果您收到的数据格式特别不正确,则可以接受恐慌代码>
这种类型的检查通常不涉及枚举上的match
语句,而是更基本的检查,例如关于字符串或整数比较的断言,这些比较是您试图重新解释为更高级别枚举类型的一组已知值之一
1在“强类型”的实际含义上存在一些不一致和分歧,在本例中,我用它来表示“几乎没有任何隐式类型强制”。代码中没有输入处理-只有一个未定义的enum
变量。而且,匹配
是详尽的;无需使用。
,因为包含了动物
的所有选项-其他任何选项都将是纯类型错误,就像您的情况一样。