前提・実現したいこと
参照の引数を持つ関数を別の関数に渡したいの中で何故かクロージャーを渡した場合にコンパイルが通る理由が分かりませんでした。
以下のように1~4まで試してみましたが、何故か2と3はコンパイルエラーとなりました。特に3と4はなぜ差が出るのが検討もつきませんでした。
発生している問題・エラーメッセージ
Compiling playground v0.0.1 (/playground) error[E0631]: type mismatch in function arguments --> src/main.rs:20:22 | 5 | fn f2<T: AsRef<[u32]>>(input: T) -> u32 { | --------------------------------------- found signature of `fn(_) -> _` ... 9 | fn g<F: Fn(&[u32]) -> u32>(func: F) -> u32 { | ----------------- required by this bound in `g` ... 20 | println!("{}", g(f2)); | ^^ expected signature of `for<'r> fn(&'r [u32]) -> _` error[E0271]: type mismatch resolving `for<'r> <fn(_) -> u32 {f2::<_>} as std::ops::FnOnce<(&'r [u32],)>>::Output == u32` --> src/main.rs:20:20 | 9 | fn g<F: Fn(&[u32]) -> u32>(func: F) -> u32 { | --- required by this bound in `g` ... 20 | println!("{}", g(f2)); | ^ expected bound lifetime parameter, found concrete lifetime error[E0631]: type mismatch in closure arguments --> src/main.rs:24:22 | 9 | fn g<F: Fn(&[u32]) -> u32>(func: F) -> u32 { | ----------------- required by this bound in `g` ... 23 | let h = |x| f2(x); | --------- found signature of `fn(_) -> _` 24 | println!("{}", g(h)); | ^ expected signature of `for<'r> fn(&'r [u32]) -> _` error[E0271]: type mismatch resolving `for<'r> <[closure@src/main.rs:23:13: 23:22] as std::ops::FnOnce<(&'r [u32],)>>::Output == u32` --> src/main.rs:24:20 | 9 | fn g<F: Fn(&[u32]) -> u32>(func: F) -> u32 { | --- required by this bound in `g` ... 24 | println!("{}", g(h)); | ^ expected bound lifetime parameter, found concrete lifetime error: aborting due to 4 previous errors Some errors have detailed explanations: E0271, E0631. For more information about an error, try `rustc --explain E0271`. error: could not compile `playground`. To learn more, run the command again with --verbose.
該当のソースコード
Rust
1fn f1(input: &[u32]) -> u32 { 2 input[0] 3} 4 5fn f2<T: AsRef<[u32]>>(input: T) -> u32 { 6 input.as_ref()[0] 7} 8 9fn g<F: Fn(&[u32]) -> u32>(func: F) -> u32 { 10 let input = vec![1, 2, 3]; 11 let output = func(&input); 12 output 13} 14 15fn main() { 16 // 1. ok 17 println!("{}", g(f1)); 18 19 // 2. error 20 println!("{}", g(f2)); 21 22 // 3. error 23 let h = |x| f2(x); 24 println!("{}", g(h)); 25 26 // 4. ok 27 println!("{}", g(|x| f2(x))); 28}
補足情報(FW/ツールのバージョンなど)
コードはRust Playgroundにもあります。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/06 09:49