C vs C++ vs Rust Part.2

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2021/12/15(水) 12:35:50.91ID:biBE4xC0
競え
※前スレ
C++ vs Rust
https://mevius.5ch.net/test/read.cgi/tech/1619219089/
2021/12/23(木) 23:52:41.64ID:NwYcCv97
>>182
1億回の素数判定を個別に考えると平均2.5回の足し算となりもちろん無理です
そこで過去の判定時で用いた足し算の結果を後の判定時に用いる方法で
結果的に平均2.5回の足し算で済ませています

また、単純にエラトステネスのふるいでは1億の長さの配列が必要となりますが
まず時間と空間を逆転させることで必要となる配列の長さを減らしています
さらに再帰的に子と孫のイテレータを活用することで
>>173の表のように1億(=10^8)まで判定時で配列の長さ1231に抑えています
その時点で子と孫では配列の長さ27となっています

>>183
そんなO(N)のペースでメモリを使用していくのはいずれ限界もありますし
メモリキャッシュヒットの観点からも望ましくないと思います

さらに今回は小さい方から順に素数を返すイテレータです
イテレータ利用者は1億を超えて素数を利用するかもしれませんし
逆にもっと少ない小さい数のみ利用するかもしれません
最初に上限が1億など決まって開始する古典的エラトステネスのふるいでは上手くいかないのです
2021/12/24(金) 00:05:23.52ID:jmk0MHfo
キャッシュヒット率の話するならベンチマークとってくれ
2021/12/24(金) 00:12:47.34ID:1YPq+lkD
わざわざ決まってる数列を順番に出力するイテレータ書くのにそんな記述が必要になるのか
ちょっと普通のループでいいからC言語で書いてみてよ
2021/12/24(金) 00:19:39.24ID:HWkip0+R
>>185
ベンチマークをとる前に実装が必要だな
その前に新たなアルゴリズムも必要か
エラトステネスの篩は「指定された整数以下の素数を求めるアルゴリズム」だからイテレーターとは相性が悪そうだ
188デフォルトの名無しさん
垢版 |
2021/12/24(金) 19:37:12.56ID:MpuWLPBj
イテレータにすると、プログラミングの方向が変わるんですよ。
詳細を未来に先送りできるんです。
伝統ある手続き型の手法では、システムやライブラリを書く人が詳細を実装し、使う人は大まかな指示を出しましたよね。
イテレータ手法は、未来に詳細を決定する。
つまり使う人が細かいことを決める事になるんです。
そこらへんの詳しい話は、書籍クリーンアーキテクチャに載ってます。
この本に書かれてることがすべて正しいとは言いませんが、正しいことにしろ間違ってることにしろ、読んでおいて損はないです。
2021/12/24(金) 19:43:08.10ID:jmk0MHfo
イテレータ特有の話と言うより遅延評価全般の話に読めるが
2021/12/24(金) 20:57:48.40ID:4EcCA1ju
イテレータ万能説を唱えて長文するガチキチおじさんwww
yieldはgeneratorをレイトバインド
for(range)はiteratorをレイトバインド
async/awaitはfutrueをレイトバインド
詳細を未来に先送り!キリッw
191デフォルトの名無しさん
垢版 |
2021/12/24(金) 21:06:12.59ID:MpuWLPBj
>>190
さあご一緒に、キリツ!
2021/12/24(金) 21:28:57.48ID:fTLW+5qu
レイト「バインド」?
2021/12/24(金) 21:44:54.12ID:cMhJNtck
クリーンアーキテクチャを出してるから遅延評価のことじゃなく
IoCの一例としての高階関数のことを言いたいんじゃないかな?
2021/12/24(金) 22:01:56.18ID:piC+XKnR
昔は局所化して先送りにできることは素晴らしいことだと思ってた
でも最近そんなのは些末な事で、無能な働き者が気にすることだったなと考えを改めた
木を見て森を見ずと言うべきか
2021/12/24(金) 22:55:30.83ID:UVQKl71H
>>188
ある意味その考え方も正しいかもしれませんが
イテレータは例えば大ざっぱに分けても5種類はあるので
自分が作る部分がどの部分かによってその立場も変わると思います
(1) 発信イテレータ … >>174で示しました素数生成、レンジ(0..n)、配列やVecに対するiter()などチェーンでは先頭に来るもの
(2) 仲介イテレータ … map()、filter()、enumerate()などチェーンでは中間に来るもの
(3) 受信イテレータ … find()、fold()、collect()などチェーンでは最後に来るもの
(4) 合成イテレータ … chain()、zip()、merge()など複数のイテレータを入力とするもの
(5) 創造イテレータ … unfold()などイテレータを生み出す汎用イテレータ
とりあえず(4)(5)は置いとくにしても自分が作る部分は用途によって(1)か(2)か(3)と変わるため大きく立場も異なります

>>189
一般的に遅延評価による先送りといえば主役はクロージャですね
上述したイテレータを作り出すunfold()もクロージャを渡すことで成立しています

>>190
futureは「未来に先送り」ではなく「未来を先取り」と捉えたほうがよくないでしょうか
そして遅延評価というよりも並行並列評価する形になりますね
したがって今回の話には適さないかなと思います
196デフォルトの名無しさん
垢版 |
2021/12/24(金) 23:02:03.16ID:UVQKl71H
>>186
> わざわざ決まってる数列を順番に出力するイテレータ書くのにそんな記述が必要になるのか

決まってる数列ではなく毎回算出するんですよ
記述については各々のイテレータはそれぞれ何らかの構造体にすぎないので >>176に示しましたように
「(a) イテレータとなる構造体の型宣言」「(b) その構造体の初期値定義 new()」「(c) 今回は自分と子と孫がいるためその関係記述」
があってようやく、>174に示しました「(d) イテレータ自体の毎回の算出コード」がそこに加わります
一般的にも今回の特殊な用途(c)を除いた3つ(a)(b)(d)は必要です
さらに>>195でいうところの仲介型イテレータはそれらの記述に加えて
「(e) 他のイテレータのメソッドとなりチェーンできるようにするための宣言」がさらに必要となります

上述(a)(b)(d)の部分の記述だけならば
お手軽にイテレータを生成できる itertools::unfold() を使えるケースだと
例えばフィボナッチ数列を返すジェネリックなイテレータは
以下のように初期値と処理クロージャを1つunfold()に与えてやればイテレータを作れます

fn fibonacci<T>() -> impl Iterator<Item=T>
 where T: Clone + num::Zero + num::One + num::CheckedAdd + std::cmp::PartialEq,
{
 itertools::unfold((T::one(), T::one()), |(m, n)| {
  if *m == T::zero() {
   // overflow
   return None;
  }
  // shift: ret <- m <- n <- next
  let next = m.checked_add(&*n).unwrap_or(T::zero());
  let ret = m.clone();
  *m = n.clone();
  *n = next;
Some(ret)
})
}
2021/12/24(金) 23:05:16.16ID:UVQKl71H
>>185
そのためにもぜひ異なるアルゴリズムの実装を作ってくださるとベンチ比較できますね
いまのところ足し算で素数生成するイテレータの実装は以前に作った明らかに非常に遅い>>62
今回作った動作O(N log log N)でメモリ使用量O(√N / log N)となる>>174の2つしかないのです

>>187
そうなんですよ
エラトステネスのふるいは最初に上限数を指定するためそのままではイテレータと相性がよくないです
またメモリ使用量も大きくなってしまいます
そのため試行錯誤のうえ新たなアルゴリズムが生まれたのが今回の実装です
もっと良い方法を考えついた方は教えていただけるとうれしいです
2021/12/24(金) 23:17:20.90ID:759ZBatD
より良い方法に興味があるんなら、普通に既存実装を研究してみたらいいんじゃない?
例えばRubyの標準添付ライブラリにも Prime.each があるよ
ソースはここ https://github.com/ruby/prime

おれはそこまで素数のアルゴリズム自体には興味ないから考えないけど
2021/12/25(土) 01:08:34.65ID:0QMGJaE9
>>197
CかC++で書いて
2021/12/25(土) 04:20:39.50ID:9OzOPrjS
C/C++/Rustならどの言語も理解できないほどの特異な書き方や奇妙な省略もなくどれも似たようなもんだ
どれか一つで書かれていれば普通のプログラマーなら読めるだろう
それでもわからない部分があれば質問したら皆が教えてくれるぞ
201デフォルトの名無しさん
垢版 |
2021/12/25(土) 06:09:26.55ID:sZ4+jXNJ
>>195
ええその通りです。
ですから使いどころを間違っていると思うのです。
2021/12/25(土) 09:05:26.62ID:0QMGJaE9
>>200
普通のプログラマじゃなくて雑魚なんで
Rustで書かれたコードはわからないしRustの説明が欲しいわけじゃない
C/C++で書かれてれば説明無用だから全部わかるならC/C++で書いてくれない?
2021/12/25(土) 13:08:57.90ID:6OMvh/ue
Ruby の無限generator は、遅延評価する。lazy

普通に、メソッドチェーンを左から処理していくと、
無限に処理できないので、右から処理していく

素数は、6 で割って余りが、1 か5

余りが3なら、3で割り切れる。
余りが2, 4なら、2で割り切れる
2021/12/25(土) 13:31:00.64ID:Jczj7qaZ
素数に2,3が含まれるの忘れてる?
2021/12/25(土) 13:54:13.44ID:0QMGJaE9
if (25 % 6 == 1) {
//25は素数?
}
2021/12/25(土) 14:02:33.11ID:+KvRe5Is
>>205
さすがに必要条件と十分条件がわからないのはどうかと思う
2021/12/25(土) 14:14:33.50ID:0QMGJaE9
>>206
わからない
説明して
2021/12/25(土) 14:21:15.89ID:6Qf096MJ
>>194
その考え方がまさに木を見て森を見ず
209デフォルトの名無しさん
垢版 |
2021/12/25(土) 14:40:34.51ID:E7PEPPKI
>>207
6で割って余りが1か5になるのは素数であることの必要条件や
xが素数⇒x%6=1,5
2021/12/25(土) 15:29:54.15ID:0QMGJaE9
その事実を利用してまずは数を6で割って余りが1 or 5のとき
改めて素数かどうかを判定する関数に通すってことか?
rem = X % 6
if ((rem == 1 || rem == 5) && is_prime(X)) {
// Xは素数
}
else {
// Xは合成数
}
2021/12/25(土) 16:04:02.04ID:a8rAfIFO
必要十分を理解してないエンジンは無価値
212デフォルトの名無しさん
垢版 |
2021/12/25(土) 16:50:37.75ID:sZ4+jXNJ
電気モーターの時代だから。
2021/12/25(土) 17:51:05.49ID:cg2rHVf2
>>195
発信、受信、仲介、合成、創造?
コンピューターサイエンス分野を見てもRust公式を見てもそんな用語は1つもないけど
それってもしかしてあんたの個人的な思想ですか?それなら知りたくないのでウザいので黙っててもらえますか?
したがって今回のRustオジサンは気持ち悪い基地外だと思います
2021/12/25(土) 17:58:00.70ID:+KvRe5Is
>>213
気持ちはわかるけど最後の一文が個人的な気持ちになってて同じ穴の狢になってない?
2021/12/25(土) 18:19:18.17ID:IFpjnGkc
>発信、受信、仲介、合成、創造
たしかにこの用語なんなん? どっから出てきたの?
どの界隈のコンセンサスで得てる言葉なの?
2021/12/25(土) 18:20:04.09ID:IFpjnGkc
>コンサンサスで
じゃなくて、コンセンサスを
217デフォルトの名無しさん
垢版 |
2021/12/25(土) 18:26:25.36ID:E7PEPPKI
ワイもこの用語はわかんなかった
2021/12/25(土) 19:07:03.87ID:PUQlITfY
仲介なんて不動産屋でしか聞いたことないわw
2021/12/25(土) 19:14:05.00ID:9OzOPrjS
イテレーターを作ったことがない初心者プログラマーには理解が難しいと思うが
命名はともかくイテレーターがそのように分類されることは俺でもわかるぜ

>(1) 発信イテレータ … >>174で示しました素数生成、レンジ(0..n)、配列やVecに対するiter()などチェーンでは先頭に来るもの

これはRustだとimpl Iterator for XXXのみ実装のイテレーター
つまり他者のnext()は利用せずに他者に対してnext()を提供

>(2) 仲介イテレータ … map()、filter()、enumerate()などチェーンでは中間に来るもの

これはRustだとimpl Iterator for XXXおよびimpl XXX for Iteratorと両方実装のイテレーター
つまり他者のnext()を利用しつつ別の他者に対してnext()を提供

>(3) 受信イテレータ … find()、fold()、collect()などチェーンでは最後に来るもの

これはRustだとimpl XXX for Iteratorのみ実装のイテレーター
つまり他者のnext()を利用するが他者に対してnext()を提供せず

以前に議論されていた消費者プログラマー(?)だと区別を一生気付かないままかもしれぬ
2021/12/25(土) 19:17:12.81ID:Jczj7qaZ
本来の用語は何?
2021/12/25(土) 19:46:48.90ID:+KvRe5Is
>>218
デザインパターンのMediatorとかでは聞いたことあるのでは

>>220
2-4あたりをひっくるめてiterator adaptorというのはよく聞くけど細かい分類は >>195 の造語っぽい
222デフォルトの名無しさん
垢版 |
2021/12/25(土) 20:41:43.56ID:qfkDfu3c
>>219
自演バレバレやぞw
2021/12/25(土) 21:08:04.90ID:9OzOPrjS
>>220
知らん
しかしプログラマーとしてはそれらの違いは必須の知識
なんせ真逆だからな
impl Iterator for XXX
impl XXX for Iterator

>>222
わざわざ知らない役をやって同調するバカをおびき寄せてから知ってる役をしてるってか?
しねーよ
2021/12/25(土) 21:22:55.51ID:0QMGJaE9
足し算で素数を求めるアルゴリズムについて知りたいんだが誰かC/C++で書ける人いないの?
2021/12/25(土) 21:41:11.69ID:Sq1Xjjv1
独自に分類名を付けようとする試みは評価するが
チュートリアルに書いてるレベルの内容で
「初心者プログラマーには理解が難しいと思うが」とか言っちゃう初心者プログラマーはどうかと思う
2021/12/25(土) 21:53:14.53ID:Sq1Xjjv1
公式用語はsource、adapter、consumer
227デフォルトの名無しさん
垢版 |
2021/12/25(土) 22:31:39.88ID:sZ4+jXNJ
イテレータはライブラリ作者と利用者の間でループをやり取りするには便利なものです。
しかし、それ以外で使ってもパッとしない。
2021/12/25(土) 23:31:43.20ID:nV1lOrYt
>>203 >>210
素数列の生成でそんな何度も割り算しまくるような無駄はしないはず
そんなことしていたら足し算平均2.5回のより遅くなってしまう
2021/12/25(土) 23:46:56.47ID:cn6bnobm
試し割り法で検索しろ
230デフォルトの名無しさん
垢版 |
2021/12/26(日) 00:33:01.70ID:kT157QEc
>>228
素数が足し算平均2.5回程度で求まるアルゴリズムを説明してくれないか?
231デフォルトの名無しさん
垢版 |
2021/12/26(日) 02:08:18.89ID:N3NYq5+A
Rustという世界最高の言語があるのに、なぜRubyを使うのが正しいのか。
リーン・スタートアップという本を読めばわかるよ。
2021/12/26(日) 10:42:00.41ID:bwDwv7pP
Ruby on Railsは、GitHub, Airbnb, Disney, Hulu, SoundCloud, Shopify といった世界的に有名な企業や、
日本国内でも、note、クックパッド、freee、マネーフォワード、Progate、Qiita などで使われている

2021年10月には、GitHubのコピーで、Railsを使い続ける宣言をしている、
GitLab が上場し、時価総額は約1.9兆円!

一方、GitHubはGo へ以降する

Railsを使う理由を端的に言えば、もうかるから

Ruby biz Grand prix 2020 大賞を受賞した、Ruby の女神・池澤あやかも言ってる。
他の言語では開発者を確保しにくいので、Railsに切り替えた
2021/12/26(日) 10:47:24.01ID:bwDwv7pP
Mediator は、空港の管制塔
2021/12/26(日) 15:09:49.43ID:h4Mdc0Ob
>>214
仲介手数料、信用創造、お前が同じ穴の狢、アホのRustオジサンです
2021/12/26(日) 16:15:26.85ID:Tvo9Wvhs
>>173
1億までの素数を全て生成するのに足し算2.5億回で済む理由がわかった
素数でなければ1万以下の素数が約数として必ずあるから順に最大素数9973まで調べるだけでよい
1億/2 + 1億/3 + 1億/5 + 1億/7 + 1億/11 + … + 1億/9973 = 約2.5億の足し算で原理的には済むはず
2021/12/26(日) 21:21:30.44ID:MtmTWc/M
>>224
ある数がある数で割れるかどうかのテストに足し算を使っているだけ。
例えば12を3で割れるかどうか調べる場合、0 3 6 9 12と足し算していって、12が見つかったので割れる。
2021/12/26(日) 21:25:21.15ID:XOSaINd5
エラトステネスの篩、のことなのでは?
でも1億分のバッファとか、勿体ない気がしますね…
2021/12/26(日) 22:30:41.92ID:RjefXsAR
そこで区間篩ですよ
2021/12/26(日) 22:31:44.15ID:kT157QEc
発見済みの素数を使ってループして数Xが素数かどうかを調べてるだけだろ?
足し算平均2.5回って意味不明なんだが?
2021/12/26(日) 22:57:15.49ID:Tvo9Wvhs
>>239
1億までの素数列挙の場合が足し算平均2.5回なだけじゃね?
>>173を見る限り
100万までの素数列挙なら足し算平均2.2回
1万までの素数列挙なら足し算平均1.9回
足し算の回数はO(N log log N)とあるから多少増えていくのだろう
2021/12/26(日) 23:11:50.20ID:Tvo9Wvhs
そう書いていたら謎が解けた

>>235
> 1億/2 + 1億/3 + 1億/5 + 1億/7 + 1億/11 + … + 1億/9973 = 約2.5億の足し算で原理的には済むはず

これは1億✕(1/2 + 1/3 + 1/5 + 1/7 + 1/11 + … )だから括弧内は素数の逆数の和でlog log N
1億がNだから足し算の回数はO(N log log N)なのか
2021/12/26(日) 23:46:34.73ID:L9HJqboW
>>239
素数かどうかを調べるのは>>236が書いているように足し算だけで可能です
必要となる足し算の数は>>241が書いているようにO(N log log N)です
足し算平均2.5回は1億まで素数を列挙した時の話であって>>240が書いているようにNに対してわずかですが増えていきます
2021/12/27(月) 00:18:24.10ID:OK/wNcge
>>242
C言語でいいから加算で素数を求めるアルゴリズム書いてくれない?
2021/12/27(月) 08:37:12.33ID:vZ39sN8j
このスレで出てきているテレーターがよくわからんのだけど、wikipediaの定義と違うんかいな?
ttps://ja.m.wikipedia.org/wiki/%E3%82%A4%E3%83%86%E3%83%AC%E3%83%BC%E3%82%BF
2021/12/27(月) 09:31:03.72ID:2XZCOhTP
>>244
その日本語wikiは怪しいので英語のwikiを見るといい
2021/12/27(月) 13:29:55.23ID:ZyPtB7dw
100回繰り返すのと1億回繰り返すのとどっちがマヌケに見えるか、億という言葉を使えば賢く見えるのか?
億回繰り返さないと理解できないのか、汚コードRust相談室と化したC vs C++ vs Rustスレに未来はあるのか
2021/12/27(月) 14:18:09.83ID:Btn3kp2t
隔離スレに未来などあるわけあるか
2021/12/27(月) 18:22:06.83ID:/o/Y1bP3
>>244
実際のコード例で体験していくと理解が早い

例えばこの計算をしたいとする
>>235
> 素数でなければ1万以下の素数が約数として必ずあるから順に最大素数9973まで調べるだけでよい
> 1億/2 + 1億/3 + 1億/5 + 1億/7 + 1億/11 + … + 1億/9973 = 約2.5億の足し算で原理的には済むはず

コードは>>176の素数生成イテレータも使って以下のイテレータ4つの連鎖で求まる

let result: i32 = 素数生成::<i32>()
 .take_while(|&p| p < 10000)
 .map(|p| 100000000 / p)
 .sum();

途中のtake_while()は条件を満たす間だけ取るイテレータでこの場合は「1万未満」が条件
map()は変換するイテレータで「素数pを1億/p」へ変換している
最後にsum()で流れてきた1億/pを「全て足して」目的を達成

このように個々の単機能イテレータを複数組み合わせて連鎖させることでプログラミングできる
2021/12/27(月) 21:02:50.96ID:/sRDJTH0
まーたイテレータの定義をよくわかってないやつがヘンテコな説明しちゃう
2021/12/27(月) 22:13:30.95ID:h+0xE8z4
ヘンテコなとこに気がつけなかったんだけど、どのへん?
251デフォルトの名無しさん
垢版 |
2021/12/27(月) 23:21:22.61ID:N7w3YVE+
今どきの言語のイテレータは>>248で合っている
しかしC++のイテレータは低レベルでポインタを抽象化したものと考えたほうがいいので注意
C++にもようやくmap()に相当するものが入ったが他言語とは異なりtransform()という名前など使いにくい
今どきのプログラミングしたいなら素直にRustを使ったほうが便利
2021/12/27(月) 23:38:31.34ID:0wmEJTQl
>>250
イテレータとは何かを分かってない
用語の使い方見れば一目瞭然でしょ

分かってない人が書いた説明を読むよりもある程度査読されてる英語のwikiや各言語のリファレンス見たほうがいい
2021/12/27(月) 23:39:05.80ID:pyO9ra+c
この文中に>>入れる自作自演の同一人物の基地外Rustのくせはほんと気持ち悪い。また引用で > 使う
2021/12/27(月) 23:41:50.94ID:OK/wNcge
伝統的には値を生成するものはジェネレータと呼ぶわな
2021/12/27(月) 23:46:27.40ID:Bqcwp6fR
>>253
はちみつ病だからスルーしてさしあげろ
256デフォルトの名無しさん
垢版 |
2021/12/27(月) 23:49:02.66ID:N7w3YVE+
>>254
それは観点が違うな
値を生成するものであってもイテレータとして機能するものと機能しないものがある
つまり重要な点はイテレータとして機能するか否かのみ
Rustの1..nやこのスレの素数生成はイテレータとして機能しているから明白にイテレータ
2021/12/28(火) 01:27:16.67ID:iF4hooVM
ジェネレータはみんなイテレータだから
2021/12/28(火) 10:31:13.05ID:wyc7do74
やっぱり頭がおかしいよ、1..nはRange { start: 1, end: n }と同じ。Rust公式でもイテレータじゃなく
単にRangeと言っているだけなのに、それが機能するかという観点ならfor inが無ければ機能しないから
イテレータじゃない。collect()がイテレータをコレクションに変換するように、for inで(暗黙)変換されるだけ。
こいつ、あちこちで暴れてる
2021/12/28(火) 11:06:40.72ID:We8KhoPF
RangeはIterator実装してるからrustの定義ではイテレータではあるのでは
2021/12/28(火) 11:57:32.05ID:c+MbZA8y
汚コード厨まだ居るのか
2021/12/28(火) 12:05:42.28ID:SY7gTV8u
>>258
君もイテレータがわかってないお仲間さんなので仲良く勉強しとけ
2021/12/28(火) 12:13:02.75ID:SY7gTV8u
プログラミング初心者でもないのにイテレータを理解してないやつがRustスレに多いのはなぜ?
2021/12/28(火) 12:16:44.18ID:F00FUyP7
ここ本スレではなく隔離スレ
スレ民の目的はただの冷やかし
2021/12/28(火) 14:55:22.51ID:uwqQYFJJ
"仲介イテレータ"
約 2 件 (0.26 秒)

すげー、全世界で、このスレにしかその言葉は存在しない
2021/12/28(火) 15:25:43.05ID:c+MbZA8y
厨怪イッテレータ
2021/12/28(火) 15:44:45.74ID:WXYqKfV2
>>262
一番レスの多い自演厨が理解してないから、そう見えるだけ
2021/12/28(火) 16:37:20.65ID:a2iPSFXu
イテレータには狭義のイテレータと広義のイテレータがある
広義のイテレータは狭義のイテレータとイテレータメソッドを合わせたものである

(A) イテレータ(狭義)
Rustで言えばtrait Iteratorを実装するもの
コード上で「impl Iterator for 各イテレータが返す型」となって現れる
各イテレータが返す型は通常structでありimpl Iterator<Item=T>を満たす
メソッドとしてnext()を持ちこれがOption<T>を返す

(B) イテレータメソッド
Rustで言えば上述イテレータ(狭義)のメソッドとなるもの
コード上では「impl 宣言用トレイト for Iterator」の中で現れる
各イテレータメソッドが返す型は任意でありfor_each()のように無しもある
対象となったイテレータ(狭義)のnext()を利用する側となる

>>195
| (1) 発信イテレータ … >>174で示しました素数生成、レンジ(0..n)、配列やVecに対するiter()などチェーンでは先頭に来るもの
| (2) 仲介イテレータ … map()、filter()、enumerate()などチェーンでは中間に来るもの
| (3) 受信イテレータ … find()、fold()、collect()などチェーンでは最後に来るもの

その分類で言えば
(1) = (A) かつ not (B) = イテレータ(狭義)だが イテレータメソッドではない
(2) = (A) かつ (B) = イテレータ(狭義)であり イテレータメソッドでもある
(3) = not (A) かつ (B) = イテレータメソッドだが イテレータ(狭義)ではない
2021/12/28(火) 17:20:35.84ID:UIm7WL46
>>267
>広義のイテレータは狭義のイテレータとイテレータメソッドを合わせたものである
この定義のソースはどこ?
2021/12/28(火) 18:00:29.58ID:p0MyQfYl
素数生成君と仲介イテレータ君は同一人物だったのか
どおりで
2021/12/28(火) 22:24:23.54ID:ndrZKvgW
>>267
> Rustで言えばtrait Iteratorを実装するもの
これは無理矢理名前をつけるとすれば Iteratee と呼ぶべきでイテレーターではないのでは
2021/12/28(火) 22:25:36.06ID:t/L66bQ2
こいつ何度間違っても全く反省しないなww
良い子は鵜呑みにしないで自分で調べようね
272デフォルトの名無しさん
垢版 |
2021/12/28(火) 22:28:28.38ID:t/L66bQ2
あ、>>270のことじゃないからね
2021/12/28(火) 22:35:42.94ID:t/L66bQ2
>>270
詫びがてら説明しておくがイテレータは数えあげる人のこと

「次くれ」→ 「はい、どうぞ」
「次くれ」→ 「はい、どうぞ」
「次くれ」→ 「もうありません」

数えあげる対象物を数えあげる人自身が持ってる場合もあれば持ってない場合もある
impl Iteratorしてるのがイテレータなのは間違いない
2021/12/28(火) 22:49:58.47ID:a2iPSFXu
>>270
君の中ではそうなのかもしれないが
世間では>>267の(A)をイテレータと呼んでいる
そしてイテレータパターンでもnext()を持つものをイテレータと呼んでいる
したがって>>267の説明で正しい
2021/12/28(火) 23:41:11.95ID:c9bIiubz
出典もなしに能書き垂れるのやめろ
2021/12/28(火) 23:52:38.14ID:a2iPSFXu
デザインパターンの一つであるイテレータパターンの説明図 (wikipediaより)
https://upload.wikimedia.org/wikipedia/commons/c/c5/W3sDesign_Iterator_Design_Pattern_UML.jpg
next()を持つものがイテレータ
つまり>>267の定義で合っている
2021/12/28(火) 23:56:51.47ID:OoEjLphs
視野が狭く思い込んだら多くの人が警告しているのに完全に無視し「定義」だの仲介だの創造だの自分勝手に講釈を垂れる
2021/12/28(火) 23:59:15.51ID:a2iPSFXu
Rust公式Bookでも同じ

https://doc.rust-jp.rs/book-ja/ch13-02-iterators.html
全てのイテレータは、標準ライブラリで定義されているIteratorというトレイトを実装しています。
Iteratorトレイトを実装するには、Item型も定義する必要があり、
そして、このItem型がnextメソッドの戻り値の型に使われています。
イテレータに対して直接nextメソッドを呼び出すこともできます。
2021/12/29(水) 01:29:32.54ID:R7H13gAM
じゃ>>248が間違ってたんだね

素数生成イテレータ
take_while()イテレータ
map()イテレータ
sum()イテレータ
4つの単機能イテレータの連鎖で求まるだっけ?
2021/12/29(水) 02:02:16.54ID:8RYkbehC
>>267に照らし合わせると
上3つが狭義のイテレータ
下3つがイテレータメソッド(広義のイテレータ)
って感じかね
間違ってるとまでは言えまい
2021/12/29(水) 03:47:51.11ID:L3UdfSEZ
イテレーターの定義はIteratorを実装してる型で良いと思うがそれがどう C vs C++ vs Rust に繋がるのか
2021/12/29(水) 09:34:00.36ID:/J/UmHDr
>>280
そりゃ間違ってた本人の言い訳定義だからな
御本人さんよ
2021/12/29(水) 12:27:51.74ID:EOkSZQC4
イテレータメソッドというのは多くの言語では一般的にはイテレータを返すメソッドのこと
Java, C#, C++, JavaScript, Python, Ruby, Scala等々

RustではIterator Trait’s Methodsの意味で
“iterator methods”という言葉が使われるがこれは訳すなら”イテレータのメソッド”

Rustに限った話でもIterator Traitの個別メソッドを
”イテレータ”と呼んでるのはnext()を除いて聞いたことがないので
広義のイテレータを定義してるソースがあるなら提示してもらいたい
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況