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

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

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

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

Q&A

解決済

1回答

1049閲覧

Rustでイテレータを加工した後に、rev()を行いたい

UMA821

総合スコア27

Rust

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

0グッド

1クリップ

投稿2022/02/16 16:09

前提・実現したいこと

rfind関数を作成しようとしました。

発生している問題・エラーメッセージ

error[E0277]: the trait bound `Chars<'_>: ExactSizeIterator` is not satisfied --> Main.rs:5:48 | 5 | for (idex, val) in arg.chars().enumerate().rev() { | ^^^ the trait `ExactSizeIterator` is not implemented for `Chars<'_>` | = note: required because of the requirements on the impl of `DoubleEndedIterator` for `Enumerate<Chars<'_>>` error[E0277]: the trait bound `Chars<'_>: ExactSizeIterator` is not satisfied --> Main.rs:5:24 | 5 | for (idex, val) in arg.chars().enumerate().rev() { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `ExactSizeIterator` is not implemented for `Chars<'_>` | = note: required because of the requirements on the impl of `DoubleEndedIterator` for `Enumerate<Chars<'_>>` = note: required because of the requirements on the impl of `Iterator` for `Rev<Enumerate<Chars<'_>>>` = note: required because of the requirements on the impl of `IntoIterator` for `Rev<Enumerate<Chars<'_>>>` = note: required by `into_iter` error: aborting due to 2 previous errors For more information about this error, try `rustc --explain E0277`.

該当のソースコード

Rust

1fn rfind(arg: &str, moji: char) -> isize { 2 use std::convert::TryInto; 3 for (idex, val) in arg.chars().enumerate().rev() { 4 if val == moji { 5 return idex.try_into().unwrap(); 6 } 7 } 8 return -1; 9} 10fn main() { 11 println!("{}", rfind("abcdcba", 'a')); 12}

試したこと

Rust Iterator revにはDoubleEndedIteratorsでのみ動作するとあったので、終端がわかるように何かしらのcollectionに変換すればよいと思い、collectを使ってVec, VecDeque, LinkedListに変換してみましたが、効果はありませんでした。
どのようにすれば思い通りになるのでしょうか、回答よろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

cargo 1.58.0 (f01b232bc 2022-01-19)
rustc 1.58.1 (db9d1b20b 2022-01-20)
rustup 1.23.1 (3df2264a9 2020-11-30)

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

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

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

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

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

guest

回答1

0

自己解決

std::iter - revにはSelfはDoubleEndedIteratorトレイトを実装していなければいけないとあります。std::iter - enumerateが返すEnumerate<Self>型がDoubleEndedIteratorトレイトを実装しているのかというとSelfがExactSizeIteratorトレイトと、DoubleEndedIteratorトレイトが実装されていれば実装されているそうです。str - charsが返すChars<'_>型がExactSizeIteratorトレイトと、DoubleEndedIteratorトレイトを実装しているのかというと、DoubleEndedIteratorトレイトは実装されますが、ExactSizeIteratorトレイトは実装していないようです。したがってrevは呼び出せません。
一度Vecなどにしてstd::vec::IntoIterに変換することで、DoubleEndedIteratorトレイトが実装されているイテレータになり、revを呼び出すことができます。

Rust

1fn rfind(arg: &str, moji: char) -> isize { 2 use std::convert::TryInto; 3 for (idex, val) in arg.chars().enumerate().collect::<Vec<_>>().into_iter().rev() { 4 if val == moji { 5 return idex.try_into().unwrap(); 6 } 7 } 8 return -1; 9} 10fn main() { 11 println!("{}", rfind("abcdcba", 'a')); 12}

そもそも、str - char_indicesを使えば、返してくるCharIndices<'_>型がDoubleEndedIteratorトレイトを実装しているので、revを呼び出すことができます。

Rust

1fn rfind(arg: &str, moji: char) -> isize { 2 use std::convert::TryInto; 3 for (idex, val) in arg.char_indices().rev() { 4 if val == moji { 5 return idex.try_into().unwrap(); 6 } 7 } 8 return -1; 9} 10fn main() { 11 println!("{}", rfind("abcdcba", 'a')); 12}

投稿2022/02/18 08:39

UMA821

総合スコア27

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問