[過去ログ] Rust part21 (1002レス)
前次1-
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
368: デフォルトの名無しさん [] 2023/09/22(金) 16:15:11.47 ID:v8mgsVW8(1/4) AAS
>>366
366(1): デフォルトの名無しさん [sage] 2023/09/22(金) 12:36:56.71 ID:E1X0qleO(1) AAS
lifetimeの問題もあるかもしれないがimpl Iteratorの型をとるところに関数内で生成したイテレータを渡しているのがそもそもおかしい
mapにはhogeの外から引数として関数を渡しているので再帰呼出しごとにイテレータの型は変わらないですし
```
let mut v = Vec::new();
hoge(|(&a, b)| a + b, &[1, 3, 5], &mut v);
```
という形でhogeを呼び出せばイテレータの型は自動的に推論されると思うんですが...
370: デフォルトの名無しさん [] 2023/09/22(金) 18:31:55.39 ID:v8mgsVW8(2/4) AAS
>>369
369(1): デフォルトの名無しさん [] 2023/09/22(金) 18:07:36.44 ID:KH67E8jw(1) AAS
impl TraitはTraitを実装した型のいずれか一つを受け入れるだけで、Traitを実装した型全てを受け入れるわけではない
mapの中に直接クロージャを渡せば確かにその制限に引っかかりますが、今回は再帰の中で一つの関数を使いまわしているのでimpl Iteratorの型は一つに固定されませんか?
371: デフォルトの名無しさん [] 2023/09/22(金) 18:41:57.56 ID:v8mgsVW8(3/4) AAS
>>365
365(1): デフォルトの名無しさん [] 2023/09/22(金) 09:19:17.11 ID:dkRHHNCe(1/2) AAS
fn hoge(
func: &impl Fn((&i64, i64)) -> i64,
arr: &[i64],
ret: &mut Vec<impl Iterator<Item = i64>>
) {
ret.push(arr.iter().zip(std::iter::repeat(arr[0])).map(func).collect()[0]);
for i in 1..arr.len() {
hoge(func, &arr[i..], ret);
}
}
イテレータのまま保持して遅延評価させたいんです
373
(1): デフォルトの名無しさん [] 2023/09/22(金) 19:29:43.87 ID:v8mgsVW8(4/4) AAS
>>372
372(2): デフォルトの名無しさん [sage] 2023/09/22(金) 18:43:25.81 ID:8SLDLfd5(1) AAS
関数定義から一意な具体型に推論されるのは戻り値型に書いた impl の話ですね
引数型に書いた impl は単にジェネリック引数を匿名化したものという扱いなので
hoge は I: Iterator<Item=i64> なる任意の I で単一化できるような定義が求められます

外部リンク[html]:doc.rust-lang.org

なので引数で&mut引き回してdynも使いたくないということであれば↓になりますかね

外部リンク:play.rust-lang.org
コンパイル通りました!ありがとうございます!
ただもう少しわがままを言うと、実際の実装ではメソッドチェーンの箇所がこれの2倍ぐらいの長さなので具体的なイテレータの型を書かずにコンパイラ任せにしたかったんですが、話を見る限りどうも無理そうですね...
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.052s