Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
7
Help us understand the problem. What are the problem?

posted at

updated at

[Rust] Result メソッド早見表

Rust で ResultOption を扱う際に、if letmatch を使うよりも専用のメソッドを使用した方が簡潔に書ける場合があります。

変換前の型と変換後の型からメソッドを探したかったため、早見表を作成しました。

Option に関しては別記事にしました。

参考「[Rust] Option メソッド早見表 - Qiita

※バージョン 1.55.0 現在、安定化されているメソッドのみ記載。
※ライフタイムは省略。
※基本的に Self 型が含むジェネリクスのトレイト境界は省略。

※変換前の型と変換後の型に基づくソートでなく、おおよその機能のまとまりでソートしています。
※特に注記がないものは固有メソッド、トレイト実装メソッドは各概要欄に記載。
self の型が参照で &, &mut が付いている場合でも、Rust の機能であるメソッド呼び出し時の自動参照によって、参照が付いていない型の値も呼ぶことができます

参考「Result in std::result - Rust

1. Result 型が持つメソッド

unwrap_* 系メソッドは、パニックを起こすものと起こさないものがあります。

1.1. パニックを起こさないメソッド

1.1.1. self 以外に引数があるメソッド

self 引数 戻り値 メソッド 概要
Result<T, E> T T unwrap_or Ok を取得する
Err ならデフォルト値 default: T にする
※動作は unwrap_or_else と同じ
※デフォルト値に関数の戻り値を使う場合は unwrap_or_else で遅延評価することを推奨
Result<T, E> F: FnOnce(E) -> T T unwrap_or_else Ok を取得する
Err なら関数 F の変換をして取得する
Result<T, E> F: FnOnce(T) -> U Result<U, E> map Ok なら関数 F の変換をする
Result<T, E> U,
F: FnOnce(T) -> U
U map_or Ok なら関数 F の変換をして取得する
Err ならデフォルト値 default: U にする
※動作は map_or_else と同じ
※デフォルト値に関数の戻り値を使う場合は map_or_else で遅延評価することを推奨
Result<T, E> D: FnOnce(E) -> U,
F: FnOnce(T) -> U
U map_or_else Ok なら関数 F の変換をして取得する
Err なら関数 D の変換をして取得する
Result<T, E> Result<U, E> Result<U, E> and 両方とも Ok なら Ok
※動作は and_then と同じ
(※両方の値が Ok になることを期待していて、その場合は常に両方の値を評価するため、and_then による遅延評価にしなくても良い)
Result<T, E> F: FnOnce(T) -> Result<U, E> Result<U, E> and_then Ok なら関数 F の変換をする
Ok から Err への変換もできる
Result<T, E> Result<T, F> Result<T, F> or どちらかが Ok なら Ok
※動作は or_else と同じ
※引数に関数の戻り値を使う場合は or_else で遅延評価することを推奨
Result<T, E> O: FnOnce(E) -> Result<T, F> Result<T, F> or_else Err なら関数 O の変換をする
Err から Ok への変換もできる
Result<T, E> O: FnOnce(E) -> F Result<T, F> map_err Err なら関数 O の変換をする
&mut Result<T, E> &Result<T, E> () clone_from selfsource: &Result<T, E> を複製 (クローン) する
(Clone トレイト実装メソッド)

1.1.2. self 以外に引数があるメソッドの応用

map_ormap_or_else メソッドで type U = Result<V, G>; とすることで、OkErr の両方の型を変換することができます。

self 引数 戻り値 メソッド 概要
Result<T, E> Result<V, G>,
F: FnOnce(T) -> Result<V, G>
Result<V, G> map_or Ok なら関数 F の変換をして取得する
Ok から Err への変換もできる
Err ならデフォルト値 default: Result<V, G> にする
Err から Ok への変換もできる
※動作は map_or_else と同じ
※デフォルト値に関数の戻り値を使う場合は map_or_else で遅延評価することを推奨
Result<T, E> D: FnOnce(E) -> Result<V, G>,
F: FnOnce(T) -> Result<V, G>
Result<V, G> map_or_else Ok なら関数 F の変換をして取得する
Ok から Err への変換もできる
Err なら関数 D の変換をして取得する
Err から Ok への変換もできる

1.1.3. self 以外に引数がないメソッド

self 戻り値 メソッド 概要
Result<T, E> T unwrap_or_default Ok を取得する
Err ならデフォルト値 <T as Default>::default() にする
Result<T, E> Option<T> ok OkOption で取得する
Result<T, E> Option<E> err ErrOption で取得する
&Result<T, E> bool is_ok Ok かどうか確認する
&Result<T, E> bool is_err Err かどうか確認する
Result<T, E> IntoIter<T> into_iter Ok をイテレータに変換する
type Item = T;
(IntoIterator トレイト実装メソッド)
&Result<T, E> Iter<T> into_iter Ok を参照のイテレータに変換する
type Item = &T;
※動作は <Result<T, E>>::iter と同じ
(IntoIterator トレイト実装メソッド)
&mut Result<T, E> IterMut<T> into_iter Ok を可変参照のイテレータに変換する
type Item = &mut T;
※動作は <Result<T, E>>::iter_mut と同じ
(IntoIterator トレイト実装メソッド)
&Result<T, E> Iter<T> iter Ok を参照のイテレータに変換する
type Item = &T;
&mut Result<T, E> IterMut<T> iter_mut Ok を可変参照のイテレータに変換する
type Item = &mut T;
&Result<T, E> Result<T, E> clone self を複製 (クローン) する
(Clone トレイト実装メソッド)
&Result<T, E> Result<&T, &E> as_ref TE を参照にする
&Result<T, E> Result<&<T as Deref>::Target, &E> as_deref TE を参照にし、さらに Tderef する
&mut Result<T, E> Result<&mut T, &mut E> as_mut TE を可変参照にする
&mut Result<T, E> Result<&mut <T as Deref>::Target, &mut E> as_deref_mut TE を可変参照にし、さらに Tderef_mut する
(※ DerefMutDeref のサブトレイトで、deref_mut の戻り値の型は <T as Deref>::Target で正しいです。<T as DerefMut>::Target ではありません)
Result<Option<T>, E> Option<Result<T, E>> transpose ResultOption を入れ替える
Ok(Some(_)) -> Some(Ok(_)),
Ok(None) -> None,
Err(_) -> Some(Err(_))
※バージョン 1.55.0 現在、const として扱う機能は不安定

1.1.4. 引数がある関連関数 (self 引数がない関数)

"Rust By Example" の古い版では「静的メソッド」(「スタティックメソッド」) と表記されていましたが、新しい版では「関連関数」表記になっています。

参考「Methods - Rust By Example

引数 戻り値 メソッド 概要
I: IntoIterator<Item = Result<A, E>> Result<V, E>
where V: FromIterator<A>
from_iter イテレータに変換可能な型 (イテレータ型も含む) から Result 型に変換する
ただし、戻り値の Ok が持つ値はイテレータから変換可能な型でなければならない
(FromIterator トレイト実装メソッド)
I: Iterator<Item = Result<U, E>> Result<T, E>
where T: Sum<U>
sum イテレータの全要素が Ok ならそれらを加算した値を Ok で取得する
ただし、戻り値の Ok が持つ値はイテレータの要素を加算した結果の型でなければならない
Err が要素に含まれていたら Err を返す
イテレータが空の場合、T 型によって異なるが、基本的には Ok(0) 等が返り、Err にならない
(Sum トレイト実装メソッド)
I: Iterator<Item = Result<U, E>> Result<T, E>
where T: Product<U>
product イテレータの全要素が Ok ならそれらを乗算した値を Ok で取得する
ただし、戻り値の Ok が持つ値はイテレータの要素を乗算した結果の型でなければならない
Err が要素に含まれていたら Err を返す
イテレータが空の場合、T 型によって異なるが、基本的には Ok(1) 等が返り、Err にならない
(Product トレイト実装メソッド)

1.2. パニックを起こすメソッド

※パニックを起こすメソッドは、Rust の内部的なコードやサンプルコード、テストコード等で良く用いられますが、テストコード以外でば通常は使わないべきです。
expectexpect_err メソッドは戻り値を得るためだけでなく、テストコード中で「パニックが起きない」ことを確認する目的でも使用されます。

1.2.1. self 以外に引数があるメソッド

self 引数 戻り値 メソッド 概要
Result<T, E> &str T expect Ok を取得する
Err なら msg: &str の値でパニックを起こす
Ok であることを期待する
Result<T, E> &str E expect_err Err を取得する
Ok なら msg: &str の値でパニックを起こす
Err であることを期待する

1.2.2. self 以外に引数がないメソッド

self 戻り値 メソッド 概要
Result<T, E> T unwrap Ok を取得する
Err なら Err が持つ値でパニックを起こす
Result<T, E> E unwrap_err Err を取得する
Ok なら Ok が持つ値でパニックを起こす

2. Result 型が実装するその他のトレイト

※具体的なメソッドは省略。

  • Copy, PartialEq, PartialOrd, Eq, Ord, Debug, Hash (#[derive] による実装)
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
7
Help us understand the problem. What are the problem?