Rustを始めてまだ日が浅いものです。
イテレータのmap
メソッドに渡す関数を状態によって変化させたいと考え、match
式でクロージャを返すようなコードを書いてみたのですが、match arms have incompatible types
というエラーを返されました。型の不一致的な問題だとは思うのですが、こういったことを実現したい場合どのようにすればよいのでしょうか?
Rust
1use std::io; 2 3fn main() { 4 let mut input = String::new(); 5 io::stdin().read_line(&mut input).unwrap(); 6 let num: u32 = input.trim().parse().unwrap(); 7 8 let func = match num { 9 0 => |i| i * i, 10 1 => |i| i + 1, 11 2 => |i| i + i, 12 _ => |_| 0, 13 }; 14 15 println!("func({}) = {}", 5, func(5)); 16}
$ cargo run Compiling playground v0.1.0 (省略) error[E0308]: match arms have incompatible types --> src/main.rs:10:14 | 8 | let func = match num { | ________________- 9 | | 0 => |i| i * i, | | --------- this is found to be of type `[closure@src/main.rs:9:14: 9:23] ` 10 | | 1 => |i| i + 1, | | ^^^^^^^^^ expected closure, found a different closure 11 | | 2 => |i| i + i, 12 | | _ => |_| 0, 13 | | }; | |_____- `match` arms have incompatible types | = note: expected type `[closure@src/main.rs:9:14: 9:23]` found type `[closure@src/main.rs:10:14: 10:23]` = note: no two closures, even if identical, have the same type = help: consider boxing your closure and/or using it as a trait object error: aborting due to previous error For more information about this error, try `rustc --explain E0308`. error: Could not compile `playground`. To learn more, run the command again with --verbose.
色々検索ワードを考えてはみたのですが一向に見つからなかったので質問した次第です。もとい、当方Rustの型とクロージャへの理解がかなり不足しているのだと思います。何か参考になるページ等ありましたら紹介してただければと思います。
回答、よろしくお願いいたします
バージョン
$ rustc --version rustc 1.37.0 (eae3437df 2019-08-13)
他に必要な情報があれば修正欄にお願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/16 15:34
2019/10/16 15:45