受this question的启发,我想问一下如何处理Rust中的输入数据类型错误。例如,以下函数要求输入数据类型为enum Animal
。用户实际上如何为输入提供未定义的数据类型,甚至是空数据。
我应该在比赛中添加None => None
或_ => 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,??
}
编译错误:
error: no associated item named `BadCat` found for type `Animal` in the current scope
--> <anon>:20:25
|
20 | let p: Animal = Animal::BadCat("whiskers".to_owned()); // Badcat not defined,??
| ^^^^^^^^^^^^^^
答案 0 :(得分:4)
Rust是强 1 ,静态类型,编译时类型检查语言。
这意味着,与Python不同,用户将无效类型传递给您的函数不可能(除非他们通过{{传递无效强制传递的数据) 1}},但你无法合理地检测到这一点。请参阅我的post,了解int main(){
int count;
std::cin >> count;
int inputs[count];
for (int i =0;i<count;i++){
std::cin >> inputs[i];
}
return 0;
}
的错误转换。你不必担心这个。
在更一般的情况下,你唯一需要担心Rust中的类型变量检查的时候是从Rust外部接收数据,例如通过配置或数据文件,或FFI功能。在这些情况下,通常会返回某种unsafe
来表示不良数据。但是,在某些情况下,特别是在FFI中,如果您收到的数据特别严重,bool
可能会接受。
这种类型的检查通常不涉及枚举上的Result<Animal,ErrorMessage>
语句,而是更基本的检查,例如关于字符串或整数比较的断言是您尝试的一组已知值之一重新解释为更高级别的枚举类型。
1 对于什么&#34;强类型&#34;存在一些不一致和不一致的问题。实际上意味着,在这种情况下,我使用它来表示&#34;很少有任何隐式类型强制&#34;。