RustのResult<T, E>型
rsenum Result<T, E> {
Ok(T),
Err(E),
}
is_ok
/ is_err
Result
が Ok
か Err
かを判定する。
類似: isRight
/ isLeft
(Haskell, Either
型)
rustlet x: Result<i32, &str> = Ok(10);
assert!(x.is_ok());
let y: Result<i32, &str> = Err("error");
assert!(y.is_err());
Haskell:
haskellisRight :: Either a b -> Bool
isLeft :: Either a b -> Bool
---
ok
/ err
Ok(T)
の場合は Some(T)
, Err(E)
の場合は None
を返す。
rustlet x: Result<i32, &str> = Ok(10);
assert_eq!(x.ok(), Some(10));
let y: Result<i32, &str> = Err("error");
assert_eq!(y.err(), Some("error"));
Haskell:
haskellrightToMaybe :: Either a b -> Maybe b
leftToMaybe :: Either a b -> Maybe a
---
map
rustlet x: Result<i32, &str> = Ok(10);
let y = x.map(|v| v * 2);
assert_eq!(y, Ok(20));
map_err
rustlet x: Result<i32, &str> = Err("error");
let y = x.map_err(|e| format!("wrapped: {}", e));
assert_eq!(y, Err(String::from("wrapped: error")));
and_then
Ok(T)
の場合、関数を適用して Result<U, E>
を返す (flatMap)
rustlet x: Result<i32, &str> = Ok(10);
let y = x.and_then(|v| if v > 5 { Ok(v * 2) } else { Err("too small") });
assert_eq!(y, Ok(20));
or_else
rustlet x: Result<i32, &str> = Err("error");
let y = x.or_else(|_| Ok(0));
assert_eq!(y, Ok(0));
unwrap
/ expect
Ok(T)
の場合は T
を返す。 Err(E)
の場合は panic。
rustlet x: Result<i32, &str> = Ok(10);
assert_eq!(x.unwrap(), 10);
let y: Result<i32, &str> = Err("error");
// y.unwrap(); // panic!
unwrap_or
Ok(T)
の場合は T
、 Err(E)
の場合はデフォルト値を返す。
rustlet x: Result<i32, &str> = Err("error");
assert_eq!(x.unwrap_or(42), 42);
Haskell:
haskellfromRight :: a -> Either b a -> a
---
unwrap_or_else
Ok(T)
の場合は T
、 Err(E)
の場合は関数適用した値を返す。
rustlet x: Result<i32, &str> = Err("error");
let y = x.unwrap_or_else(|_| 42);
assert_eq!(y, 42);
Haskell:
haskellfromRight' :: (e -> a) -> Either e a -> a
---
transpose
Result<Option<T>, E>
を Option<Result<T, E>>
に変換する。
rustlet x: Result<Option<i32>, &str> = Ok(Some(10));
assert_eq!(x.transpose(), Some(Ok(10)));
let y: Result<Option<i32>, &str> = Ok(None);
assert_eq!(y.transpose(), None);
iter
Ok(T)
の場合 T
をイテレートする。
rustlet x: Result<i32, &str> = Ok(10);
for v in x.iter() {
println!("{}", v); // 10
}
Haskell:
haskellmaybeToList :: Maybe a -> [a]
---
ok_or
Option<T>
を Result<T, E>
に変換する。
rustlet x: Option<i32> = Some(10);
assert_eq!(x.ok_or("error"), Ok(10));
let y: Option<i32> = None;
assert_eq!(y.ok_or("error"), Err("error"));
Haskell:
haskellmaybeToEither :: e -> Maybe a -> Either e a
---
ok_or_else
Option<T>
を Result<T, E>
に変換するが、 Err
の値を関数で生成する。
rustlet x: Option<i32> = None;
let y = x.ok_or_else(|| "generated error");
assert_eq!(y, Err("generated error"));
Haskell:
haskellmaybeToEither' :: (a -> e) -> Maybe a -> Either e a