質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

Q&A

解決済

1回答

908閲覧

イテレーターの戻り値

namiki

総合スコア4

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

0グッド

1クリップ

投稿2022/01/08 05:56

Rustの初心者です。
本に書いてあることで、わからないことがあるので教えていただきたいです。
よろしくお願いします。

イテレーターの戻り値が Option<usize> ですが println!("{}", num);の書式でエラーにならないのはなぜでしょうか?

まずエラーになるコードです。

lang

1// Option<usize> doesn't implement `std::fmt::Display` と言われてエラーになる 2fn main() { 3 let o = Option::<usize>::Some(5); 4 println!("{}", o); 5}

次はエラーにならないコードです。
イテレーターはOption<usize>を返すと解釈していますが、エラーになりません。

lang

1fn main() { 2 let it = Iter { 3 current: 0, 4 max: 10, 5 }; 6 for num in it { 7 println!("{}", num); 8 } 9} 10 11struct Iter { 12 current: usize, 13 max: usize, 14} 15 16impl Iterator for Iter { 17 type Item = usize; 18 19 fn next(&mut self) -> Option<usize> { 20 self.current += 1; 21 if self.current - 1 < self.max { 22 Some(self.current - 1) 23 } else { 24 None 25 } 26 } 27} 28

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

rust

1for num in it { 2 println!("{}", num); 3}

このfor文は、大雑把には以下のようなコードと同じ動きをします。

rust

1loop { 2 match it.next() { 3 Some(num) => println!("{}", num), 4 _ => break, 5 } 6}

つまり、「イテレータのnext()を呼び、Someなら中身の値を使って処理を行い、さもなくばループを終了する」という動きです。
したがって、numの型は(IteratorItemである)usizeになります。

Rustのイテレータはそもそも「next()を呼んだとき、値がまだ残っていればSome(Item)を、さもなくばNoneを返す」ことで、イテレーションが続くのか終わるのかを示しています。
イテレータを頭から終わりまで走査する処理はよくあることなので、for文として糖衣構文になっているわけです。

投稿2022/01/08 08:46

equal-l2

総合スコア172

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

namiki

2022/01/08 23:06

equal-l2さま お返事ありがとうございます。 ご説明いただいた内容を読むと、なるほど となるのですけれど、 impl の部分に書かれたコード(ロジック)を見ると、とても思いつきません。 Option<usize>を返す というロジックになっているわけですから。 頭、かたすぎでしょうか? 笑
equal-l2

2022/01/09 00:19 編集

確かにパッと見てわかるような感じではないですね 自分もどこで学習したのかあまりはっきりした記憶がありません…… イテレータの仕組みについてはThe Bookにも載っていますので参考にしてみてください https://doc.rust-jp.rs/book-ja/ch13-02-iterators.html
namiki

2022/01/09 01:06

equal-l2さま 参考にさせて頂きます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問