C vs C++ vs Rust Part.2at TECHC vs C++ vs Rust Part.2 - 暇つぶし2ch■コピペモード□スレを通常表示□オプションモード□このスレッドのURL■項目テキスト50:デフォルトの名無しさん 21/12/16 23:20:42.17 22XvzF/H.net Rustのことは知らんのだけどsome, any, map, findって実質ループじゃないの? Rubyっぽい構文も見られるけどブロックを毎度呼び出してもらってるだけだからループじゃないとかいうわけ? 51:デフォルトの名無しさん 21/12/16 23:59:30.49 iS9fah9V.net >>50 登場していたSomeは値付きenumなのでデータの型です mapは変換するだけなのでそれ自体にループ要素はないです 一方でfindなどはループを内包している高階関数になりますね だから>>49にて「今回は可能ならばループを直接使わずに高階関数イテレータ使用」と書いたのです 宿題となっていた類似部分を別関数へ切り出しが出来ました これでわかりやすくなったでしょうか? fn prime<T>() -> Unfold<T, impl FnMut(&mut T) -> Option<T>> where T: Copy + num::Zero + num::One + num::CheckedAdd + std::cmp::PartialOrd, { unfold(T::one(), |a| { inc(*a, T::one(), |x| x > T::zero()) // 無条件に+1していき次の素数を探す .inspect(|b| *a = *b) // unfoldのため値更新 .find(|b| inc(T::one(), T::one(), |x| x < *b) // 自分より小さい数で+1していき約数を見つける .all(|c| inc(T::zero(), c, |x| x <= *b) // その約数の候補を自分以下で足し算していく .all(|d| d != *b)))}) // 自分が倍数になっていなければOK } fn inc<T>(s: T, a: T, f: impl Fn(T) -> bool) -> Unfold<T, impl FnMut(&mut T) -> Option<T>> where T: Copy + num::Zero + num::One + num::CheckedAdd + std::cmp::PartialOrd, { unfold(s, move |x| { *x = x.checked_add(&a)?; f(*x).then(|| *x) }) } 次ページ最新レス表示レスジャンプ類似スレ一覧スレッドの検索話題のニュースおまかせリストオプションしおりを挟むスレッドに書込スレッドの一覧暇つぶし2ch