fn main() {
let mut data = vec![];
for n in 0..5 {
data.push(Some(n));
}
print_all(data);
}
fn print_all(data:Vec<Option<i32>>) {
for item in data {
println!("{:?}", item);
}
}
Noneを含む処理
use rand::Rng;
fn random()-> Option<i32> {
let n = rand::thread_rng().gen_range(0..10);
match n {
0 => None,
_ => Some(n)
}
}
fn main() {
let mut data = vec![];
for n in 0..10 {
data.push(random(n));
}
print_all(data);
}
fn print_all(data:Vec<Option<i32>>) {
for item in data {
print(item);
}
}
fn print(item:Option<i32>){
match item {
None => println!("no-data..."),
Some(n) => println!("No, {}.", n)
}
}
### Panicによる強制終了
fn print(item:Option<i32>){
match item {
None => panic!("NODATA!"),
Some(n) => println!("No, {}.", n)
}
}
### Resultによるエラーリカバリ
enum Result<T,E>{
Ok(T),
Err(E),
}
Errを使ってエラー処理を行う
fn print(item:Option<i32>)->Result<String, String>{
match item {
None => {
Err(String::from("ERROR IS OCCURED."))
},
Some(n) => {
println!("No, {}.", n);
Ok(String::from("OK"))
}
}
}
### print_allでResultによるエラー処理を実装
fn print_all(data:Vec<Option<i32>>) {
for item in data {
let res = print(item);
match res {
Ok(s) => println!("--- {} ---", s),
Err(s) => println!("*** {} ***", s)
}
}
}
### より細かなエラー処理
enum ErrKin {
Caution,
Danger
}
fn print_all(data:Vec<Option<i32>>) {
for item in data {
let res = print(item);
match res {
Ok(s) => println!("--- {} ---", s),
Err(s) => match k {
ErrKind::Caution => {
println!("*** CAUTION!! ***");
},
ErrKind::Danger => {
println!("DANGER!!");
panic!("DANGER ERROR.");
}
}
}
}
}
fn print(item:Option<i32>)->Result<String, ErrKind>{
match item {
None => {
Err(ErrKind::Danger)
},
Some(n) => {
println!("No, {}.", n);
if n == 1 {
Err(ErrKind::Caution)
} else {
Ok(String::from("OK"))
}
}
}
}