Rust part15

■ このスレッドは過去ログ倉庫に格納されています
2022/05/12(木) 18:28:20.99ID:cuIcFT6k
公式
https://www.rust-lang.org/
https://blog.rust-lang.org/
https://github.com/rust-lang/rust

Web上の実行環境
https://play.rust-lang.org

日本語の情報
https://rust-jp.rs/

※Rustを学びたい人はまず最初に公式のThe Bookを読むこと
https://doc.rust-lang.org/book/

※Rustを学ぶ際に犯しがちな12の過ち
https://dystroy.org/blog/how-not-to-learn-rust

※Rustのasyncについて知りたければ「async-book」は必読
https://rust-lang.github.io/async-book/

※C++との比較は専用スレへ
C++ vs Rust
https://mevius.5ch.net/test/read.cgi/tech/1619219089/

※次スレは原則>>980が立てること

前スレ
Rust part14
https://mevius.5ch.net/test/read.cgi/tech/1644596656/
2022/05/22(日) 13:23:37.89ID:kzep88by
MozilaはFirefoxを丸ごとRustに書き換える予定はあるん?
今はまだ一部だけだよねRustになってるの
2022/05/22(日) 14:00:05.26ID:IGyJdnKj
>>270
そうなの?
2022/05/22(日) 14:06:50.95ID:1cbV2u9G
FirefoxはレンダリングエンジンをRustでゼロから作ってるんじゃないの?
2022/05/22(日) 14:11:38.83ID:s/f+VQic
自分で確かめて
https://github.com/mozilla/gecko-dev
2022/05/22(日) 14:14:17.72ID:pc68DccV
servoはまだ実験段階だったと思う
2022/05/22(日) 14:54:56.44ID:kzep88by
>>273
ありがとう~
2022/05/22(日) 15:29:45.38ID:srSb/t9O
>>270
特にそういう予定はないと思う
servo自体も別に次世代Firefoxを目指してるとかではなく、Rustでwebブラウザを書く実験プロジェクトという感じ
その実験でうまく行ったコンポーネントを徐々にFirefoxに移植していっている
2022/05/22(日) 15:57:34.13ID:pc68DccV
アプローチとしては正しい姿なんだろうな
2022/05/22(日) 17:29:35.11ID:1mUE50i3
暇を持て余した神々の遊び

servoと言うよりモンスターエンジンだね…
2022/05/22(日) 17:37:14.17ID:7nmc6Bff
>>270
C++で書かれてる部分は置き換えられるかも知れないけどJSで書かれてる部分までは置き換えしないんでないかな
2022/05/22(日) 19:19:39.37ID:9fWZc0TE
JSとか言ってるのは君だけだと思うよ
2022/05/22(日) 19:22:44.24ID:7nmc6Bff
>>280
FirefoxではC++と同じくらいJS使われてるよ
https://www.openhub.net/p/firefox/analyses/latest/languages_summary
2022/05/22(日) 19:25:56.61ID:nrxT1a+p
JSの部分を置き換えるなんてはなから誰も思ってないってことだと思うが
2022/05/22(日) 19:26:01.69ID:LKVhbTwj
意訳すると「JSで書かれてる部分まで置き換えるとか言ってるのは君だけだと思うよ」かな?
言ってないね
2022/05/22(日) 19:29:03.65ID:7TIjBb30
>>282
正解

>>283
アホ
JSで書かれてる部分まで置き換えるかどうかとか言ってるのは君だけだと思うよ
2022/05/22(日) 19:33:12.87ID:LKVhbTwj
>>284
じゃ>>280で「言ってる」とか書くな
ボケ
2022/05/22(日) 19:46:00.83ID:u+qheqhP
>>285
はあ?
JSって言ってるよね?
バカなの?

>>279 JSで書かれてる部分までは置き換えしないんでないかな
2022/05/22(日) 19:56:58.26ID:nleMAmaj
>>270 が「Firefox を "丸ごと" 書き換える」と言っていたので全部はRustにならないよと伝えたんだけどなんかお気に召さなかった?
288デフォルトの名無しさん
垢版 |
2022/05/22(日) 20:16:58.99ID:KMOjS2oh
>>270が言うのはservoのことでquantumの動機がcssパーサrustで書いたら
安全だったからC++で書かれたコンポーネント置換しよだからjs出る余地ないじゃん。
>>282で終わった話。
2022/05/22(日) 20:17:09.14ID:M3jNarf6
そうだね、そんなふうに言われたらシェルスクリプトやMakefileまでrustで置き換えるんじゃないかって思っちゃうよね。


馬鹿なん?
2022/05/22(日) 20:36:16.46ID:7nmc6Bff
FirefoxはXULのイメージがあってJSも主要な構成要素だと思ってたから変なレスつけちゃったね
皆さんの機嫌害しちゃって申し訳ない
2022/05/22(日) 20:54:23.92ID:KMOjS2oh
よく見たらID変えて暴れてるやつまだ居座ってるのか。

>>290
XULはだいぶ前に死んだよ。
XULRunnerが単体で利用困難な問題が解決できなくて存在意義を失った。
2022/05/22(日) 22:32:56.13ID:7nmc6Bff
>>291
XUL完全になくなったの?
XBLは完全に消えたって聞いたけどXULは細々と生き残ってるものだと思っていた
293デフォルトの名無しさん
垢版 |
2022/05/23(月) 01:12:40.07ID:436cwmll
>>290
ほんと反省しろよ
2022/05/23(月) 02:27:31.54ID:n+tkR/ue
反省してま~す
2022/05/23(月) 19:27:40.26ID:qJLEBqNZ
>>189
おまえら全員そうだがフィボナッチ数列でusize固定はおかしいだろ
コード自体は問題ないが <T: Zero + One + CheckedAdd> を付けろ
あとは0と1をT::zero()とT::one()へ置き換えればi8型からBigUintまで何でも動作するようになる
https://play.rust-lang.org/?edition=2021&gist=929f3df48db39182558dfad6fe8d1cda

さらに今回はfrom_fn()利用をそのままsuccessors()利用へ変換できるので見やすくなる
fn fibonacci_iter<T: Zero + One + CheckedAdd>() -> impl Iterator<Item = T> {
let mut oq = Some(T::one());
iter::successors(Some(T::zero()), move |p| {
let q = oq.take()?;
oq = q.checked_add(p);
Some(q)
})
}
ちなみにCloneを要求しないためBigIntなどでも無駄なコスト増とならない

>>202
そのコードは暗黙のコピーが発生している
from_fn()使用版のコードはcurrがキャプチャ変数なので「let n = curr?;」でコピー発生
successors()使用版のコードはクロージャ引数「|&curr: &usize|」の「&」でコピー発生
usizeならば問題はないがBigIntなどでそのコードは動かないので劣る
2022/05/23(月) 19:52:54.51ID:aUQlcplw
暗黙のコピー発生って気にするべき?
!Copyならコンパイルエラーになるしこれまで気にしたことなかった

あとcurrはmoveでキャプチャされるからcurr?で発生するのはmove(とそれに伴うmemcpy)だけど、moveのコストも気にすべき?
2022/05/23(月) 20:00:24.28ID:pMTVA02Y
>>296
それは逆
そのキャプチャされた変数はクロージャが呼ばれるたびに何度も使われる
つまりムーブされてはいけない、つまりムーブ禁止となる
したがって n = curr? で currの中身は nへムーブされずコピーとなる
2022/05/23(月) 20:11:34.97ID:aUQlcplw
>>297
2022/05/23(月) 20:12:20.25ID:PbQSFqOo
>>296
必ずCopy前提の型しか扱わないときは気にしなくていい
しかし今回は!Copyの数値型でも動かないと話にならないからコピーが起きるコードを避けないと
2022/05/23(月) 20:19:20.85ID:aUQlcplw
>>299
!Copyの場合はコンパイルエラーになるからわざわざ人間が注意を払う必要はないと思うが、気にすべき?
usizeしか使わなくてもTに置き換えた場合を想定してコードを書くべきということ?
2022/05/23(月) 20:27:05.01ID:PbQSFqOo
>>300
u128を使ってもf(200)がオーバフローするような今回の案件でCopy型が前提のコードはよくない
案件次第だけど今回はコピーの有無を気にすべき案件
2022/05/23(月) 20:43:27.72ID:4RywOifH
>>295
自分のレスに他人のふりしてレスするキチガイ汚コーダーこと複オジさんちぃーすっ
2022/05/23(月) 20:49:26.67ID:iRCkPDCQ
>>296
それはmoveの意味を間違えているぞ
>>202のcurr?はコピーが発生する
FnOnceじゃないんだからcurrの値がmoveされたら次に使えなくなる
move禁止となりCopy型ならコピーが発生し!Copy型ならエラーとなるコード
2022/05/23(月) 21:10:50.44ID:aUQlcplw
>>301
copyを気にするのではなくusize or BigIntのどちらを使うべきか意識すべきと解釈した
usizeで良い場合はcopyは気にせずして良い

>>303
FnOnceかFnMutかFnかは関係なくて
moveなclosureでキャプチャしたらmove発生するよ
moveでキャプチャされた値をクロージャの中でさらにmoveできるか、refしかとれないかがFnOnceとFnの違い
2022/05/23(月) 21:18:12.89ID:gtDJ5U8B
https://www.reddit.com/r/rust/comments/3wubj0/comment/cxzlvt4/

num_traitsによるジェネリクスは絶対の正解ではないから適当なところで諦めようね
2022/05/23(月) 21:23:42.08ID:iRCkPDCQ
>>304
それは別の話でその違いを理解できていないようにみえる
クロージャへのmoveはクロージャが作られた時に終っていてクロージャ内のコードでの動作なは関係ない
間違っているのは後者の話でこの部分

>>296
> curr?で発生するのはmove(とそれに伴うmemcpy)

curr?でmoveは起きない
curr?で起きるのはコピーである(!Copy型ならエラー)
2022/05/23(月) 21:33:03.23ID:9psioJ1p
>>296
コピーもmoveも同じでそれがボトルネックかどうかが重要
数値プリミティブの場合はコピーを他の方法に変えたところでボトルネックが解消されることはまずないから気にする必要はない

BigUint前提ならVecと同じでmoveやクローンやのオーバーヘッドはそれなりに気にした方がいい
逆に現実的にはオーバーフロー考慮する必要がなくなるからCheckedAddが余計なオーバーヘッドになる

特性の違う物をジェネリック等でまとめたほうがいい場面なのかそれぞれ別の実装を用意したほうがいい場面なのか判断できることが大事
2022/05/23(月) 21:43:43.53ID:Ayvhc9bp
>>307
それは間違ってるぜ
BigUintのchecked_add()は常にSomeを返すためにチェックとSomeは消えてオーバーヘッドとならない
さらにRustのジェネリックは各型にmonomorphizationされるためジェネリックで書いてもプリミティブ型やBigUint型のコードはそれぞれに最適化される
2022/05/23(月) 22:04:52.01ID:gtDJ5U8B
ヒント:
Ratio<T> where T: Integer + Clone + CheckedAdd + CheckedMulは>>295の条件を満たす
2022/05/23(月) 22:25:54.83ID:xQdLaNrd
fibonacci_iter::<Ratio<u8>>()すると
ちゃんと最後233で止まるのね
ジェネリック凄い
2022/05/23(月) 22:34:47.31ID:gtDJ5U8B
ククク……RatioのCheckedAddの実装を見ても果たして同じことが言えるかな
2022/05/23(月) 22:37:22.49ID:HY9DKb05
汚染が始まった!
2022/05/23(月) 22:55:06.68ID:GQTw0VDg
>>311
たしかにRatioの実装が悪いな
まずAddと同様に
if self.denom == rhs.denom {の分岐をし
そして1の場合は
self.numberとrhs.numberでchecke_addするくらいはしないとな
314デフォルトの名無しさん
垢版 |
2022/05/23(月) 23:14:26.50ID:bbzZFnmN
ジェネリックに書いてもRatio専用コードを書いても
どちらもRatioの実装を使わざるをえないのだから同じ結果となる

そしてRatio専用コードを書こうとしても外部からは工夫のしようがないため
ジェネリックからコンパイル時にモノモーフィゼーションされるコードと全く同じになる
2022/05/23(月) 23:46:45.42ID:lhQpV8J5
このスレごちゃごちゃした書き込み多すぎ
2022/05/24(火) 00:53:51.91ID:PPYrRT7r
各型を個別に確認しないと良いか悪いか判断できないならジェネリックにしちゃだめでしょ
2022/05/24(火) 01:46:13.03ID:Y7WsYtba
>>316
そんな個別に確認しなきゃいけないことは起きないから大丈夫
Rustの標準ライブラリも大半はジェネリックに書かれている
2022/05/24(火) 07:59:54.71ID:fUfb5k5z
>>307
>特性の違う物をジェネリック等でまとめたほうがいい場面なのかそれぞれ別の実装を用意したほうがいい場面なのか判断できることが大事
禿同だわ
コードパズルやってるやつにいつも感じる違和感の原因はこれだな
こういう能力って何て言うんだろ?
2022/05/24(火) 08:06:11.71ID:eTAydD0N
>>318
でも今回の件の数列ならばジェネリックが正解やろな
わざわざ各数値型に個別に実装しなくて済む
分けるほうが不自然で手間
2022/05/24(火) 08:45:23.72ID:ie6AbIfB
男の人って気持ち悪い…
どうして少女をそんなに汚したがるの?
お母さんに悪いとわおもわないの?
2022/05/24(火) 08:52:13.15ID:anVhILE8
>>318
広く言えば設計能力
狭く言えば実装パターンの選択能力

総合的な能力だから一朝一夕には身に付かない
実装パターンの整理が進んでないRustだと特に
2022/05/24(火) 11:37:27.58ID:0VHIsXBI
KISS原則だろ
2022/05/24(火) 19:12:35.28ID:VR6742Ui
>>202のlet n = curr?;の部分を
>>189はlet n = curr.take()?;としてコピーになるのを回避しているだけかと思ったら
両者が全く異なるアルゴリズムを採用していることに気付いた
>>202のアルゴリズムだとどうやってもコピーを避けられないから詰んでるね
2022/05/24(火) 22:16:43.51ID:oAG0OLUi
prev, currの状態管理だとcurrの値をprevに代入するのと戻り値として使うのと2箇所に必要になるからね
curr, nextで管理すればいい
2022/05/24(火) 22:24:27.19ID:LZzc/1GO
アルゴリズムというほど大げさな話ではないだろ
f(n)を求めるnext()が呼ばれた時に

>>189は内部にf(n)とf(n+1)を持っていて、足し算してf(n+2)を作る
そして内部にf(n+1)とf(n+2)を残して、f(n)を返す

>>202は内部にf(n-1)とf(n)を持っていて、足し算してf(n+1)を作る
そして内部にf(n)とf(n+1)を残して、f(n-1)は捨てて、f(n)をコピーして返す
つまりムダ

>>324
同意
2022/05/24(火) 23:52:58.32ID:m/W944BH
フィボナッチ数のような単純な問題でもプログラミングセンスに差が出るものなんだな
327デフォルトの名無しさん
垢版 |
2022/05/25(水) 09:34:10.65ID:veJPShsI
>>218
まずはCから始めるのは間違ってない
Cは仕様が小さいからひと通り学ぶのにそんなに時間は掛からないからね
2022/05/25(水) 13:26:51.10ID:4b57184O
Webシステム中心ならRustとRails どっちを中心に勉強すればいい?

どうせ仕事で使うのPHPとjsだけど
2022/05/25(水) 13:32:36.84ID:pqSOGvoX
RustでETみたいなのって書けるん?
てかテンプレートはC++みたいに汎用性高いの?
それともC#みたいに適用範囲絞ってる?
2022/05/25(水) 13:40:48.57ID:9QZiEKx+
>>329
C++ で言うところのテンプレートは Rust には無いよ。 ジェネリクスは ML 風の型システムでやってる。
マクロは Lisp 風と言えると思うけどトークンが型付けされてるから Template Haskell とかのほうが近いかもしれない。
331デフォルトの名無しさん
垢版 |
2022/05/25(水) 20:05:45.57ID:G6RbJxKu
なんだじゃあRustだめじゃん。
2022/05/25(水) 20:20:43.79ID:2d7iZvnp
>>331
むしろC++のテンプレートよりもRustのの方がほとんどの利用方法で便利かつプログラミングしやすく快適になった
2022/05/25(水) 20:47:56.26ID:L8VrP5Wq
>>331
そうだよ。ダメだから君もRustは使わないほうがいい
2022/05/25(水) 21:47:24.60ID:pqSOGvoX
行列クラスを作って

X += A*(B+C)/D

みたいな演算子の多重定義して、すっきり1式で書くことできますか?
2022/05/25(水) 22:02:04.30ID:pqSOGvoX
Matrix<Complex> X(2,2 );
Matrix<double> Y(2,2 );

Y << 1., 2.,
3., 5.;

X = (double)(Y^3);

みたいなことrustで書きたい
2022/05/25(水) 22:12:09.13ID:L8VrP5Wq
>>335
もちろんできる
こういうのがほしいんでしょ
https://docs.rs/simple-matrix/latest/simple_matrix/

初心者の題材としては適切そうだから、自分で実装してみてはいかがか
2022/05/25(水) 22:17:54.75ID:pqSOGvoX
スマソ
X=(Complex)Y^3
だた
2022/05/25(水) 22:26:34.33ID:pqSOGvoX
>>332
そこんとこ詳しく
解説サイトでもいいけど
2022/05/25(水) 22:36:32.50ID:9QZiEKx+
とりあえず一度は the book を読め。
根本的な言語デザインが違うからそこだけ抜き出して詳しい説明なんてできないよ
2022/05/26(木) 00:08:48.87ID:U/g7+l0+
rustてこんなコードも許すんだな

fn main() {
println!("Hello, world!");
main();
}

https://play.rust-lang.org/
でやってみるとスタック溢れて死んだけど一応実行できるのねww
2022/05/26(木) 07:58:26.46ID:a0cw3gsx
そんなことで草生やすのはおそらくキミひとり
他の人らは真顔でキミの発言を見守ってるよ
2022/05/26(木) 08:48:32.43ID:8L/oafM1
>>341
いや、そんなふうに思ってるのはキミひとりだから
2022/05/26(木) 09:21:13.14ID:U/g7+l0+
エントリポイントであるmainの停止条件のない再帰が
何のerrorもwarningもなくコンパイルできてしまい、
当然スタックオバフロで停止してしまうなんて間抜けすぎると思ったんだけどね
これが先進言語なのか?ww
2022/05/26(木) 09:45:45.88ID:wRvm8KMl
>>343
最適化したら、ループに変換されて死ななくなるとか?
2022/05/26(木) 10:23:40.75ID:m4beE+3q
Go でやってみたら gopls(Language Server)で infinite recursive call って warning が出た
実行できるけど、

runtime: goroutine stack exceeds 1000000000-byte limit

と表示されて強制終了
2022/05/26(木) 10:39:49.31ID:EVCXwRA4
>>343
警告出るよ

https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=2c7c027a6cf5a2e1c065faaad3a63680

warning: function cannot return without recursing
347デフォルトの名無しさん
垢版 |
2022/05/26(木) 18:28:21.56ID:MJ/jCOeZ
じゃあGoのほうが良いんじゃん。
2022/05/26(木) 19:07:49.07ID:wwtlTazs
そこに気づくとはやはり天才か
2022/05/26(木) 19:23:40.54ID:0K7pUhl0
>>347
RustもGoもどちらもwarningが出る
そして実行するとスタックが溢れて止まる
完全に同じ
2022/05/26(木) 21:03:33.74ID:TOBg/lde
2022/05/26(木) 21:33:44.65ID:F8bskD+f
イキッてスタックを増し続ける再帰を書くのは愚か、まともなら限界値でブレイクする、天才と努力家は末尾再帰でスタックを増やさない
2022/05/26(木) 21:43:27.13ID:BmMYHIjm
リリースビルドだと最適化されてスタックオーバーフローにならない
loopと同じになる
fn main() {
loop{ println!("Hello, world!"); }
}
2022/05/26(木) 21:45:32.94ID:p077Q+tt
あれ?
前にRustは末尾呼び出し最適化はしないって聞いたけど
2022/05/26(木) 21:53:44.25ID:BmMYHIjm
言語仕様的に最適化を保証してるわけではないというだけでは?
LLVMがある程度やってくれる
https://godbolt.org/z/os9YMfozf
2022/05/26(木) 22:19:48.49ID:LHrMwKV/
わかりやすい例
確実にスタックが溢れるusize::MAX回の再帰

fn main() {
assert_eq!(usize::MAX, count(usize::MAX));
}

fn count(n: usize) -> usize {
// println!("{:p}", &n);
match n {
0 => 0,
n => 1 + count(n - 1),
}
}

①デバッグモードだとスタックオーバフロー
②リリースモードだと溢れずアサートも通る
③リリースモードでもコメントになっているprintlnの//を外すと最適化されなくなるようでスタックオーバフロー
2022/05/26(木) 22:41:19.49ID:chFOJ7KS
>>355
わかりやすい?
println入れるとなぜ最適化されなくなるの?
2022/05/26(木) 23:01:45.92ID:LHrMwKV/
>>356
再帰だと&nは毎回異なる
つまり再帰をループ化する阻害要因
2022/05/26(木) 23:18:51.46ID:LHrMwKV/
ごめん
n表示だけでもあかんわ
ループ化されず溢れる
調査のために、printよりもっと軽くて最適化で消えない操作、何かないかな
359デフォルトの名無しさん
垢版 |
2022/05/27(金) 10:47:17.91ID:KGTH7nqA
>>358
ターミナルが標準出力に出てきたのを表示するのがボトルネックになってるだろうな
./a.out > /dev/null するか、printlnの代わりにファイル書き込みするのが手っ取り早い
2022/05/27(金) 23:42:23.72ID:QNNDwom0
traitでasync fnなメソッドを宣言してはいけない理由を教えてください
2022/05/28(土) 00:48:37.27ID:1czNjiXi
https://github.com/rust-lang/rfcs/issues/2739
2022/05/28(土) 18:21:29.07ID:DPDd3/od
async fnはsyntax sugarだから例えば以下は同じ

async fn delayed_add(a: i32, b: i32) -> i32 {
sleep(Duration::from_secs(5)).await;
a + b
}

fn delayed_add(a: i32, b: i32) -> impl Future<Output = i32> {
async move {
sleep(Duration::from_secs(5)).await;
a + b
}
}

つまり現在のRustコンパイラではまだimpl Traitを使える場所が限定されているというもっと大きな問題のために今は使えない
GATsなど現在進行中の諸問題が解決すればいずれ使えるようになるはず
2022/05/28(土) 18:34:44.90ID:DPDd3/od
現状の対策方法としてはimpl FutureをdynにしてBox::pinして返す

trait Foo {
fn delayed_add(a: i32, b: i32) -> Pin<Box<dyn Future<Output = i32>>>;
}

impl Foo for () {
fn delayed_add(a: i32, b: i32) -> Pin<Box<dyn Future<Output = i32>>> {
Box::pin(async move {
sleep(Duration::from_secs(5)).await;
a + b
})
}
}

fn main() {
block_on(async {
let x = <() as Foo>::delayed_add(1, 2).await;
println!("x = {x}");
});
}

これでtraitにて非同期関数を使える
2022/05/28(土) 18:41:39.92ID:DPDd3/od
それを手動で変換するのは面倒かつコードも見にくいので自動変換してくれる#[async_trait]を使えばasync fnと書ける

use async_trait::async_trait;

#[async_trait]
trait Foo {
async fn delayed_add(a: i32, b: i32) -> i32;
}

#[async_trait]
impl Foo for () {
async fn delayed_add(a: i32, b: i32) -> i32 {
sleep(Duration::from_secs(5)).await;
a + b
}
}
2022/05/28(土) 19:10:23.06ID:Hw+E7BcY
おじさん調査お疲れ様でした。
366デフォルトの名無しさん
垢版 |
2022/05/28(土) 19:23:54.07ID:6Sv+ENTH
・塩野義製薬が週休3日制導入へ 来年4月、副業も解禁
・塩野義製薬が「週休3日」選択可能に 給与は『週休2日の8割』副業や学び直しを支援
・【フォーカス】サタケ/週休3日制 通年導入めざし夏季のみ試行中 交代制で水曜を休日に
・旅館なのに週休3日!?陣屋・若女将の常識を覆した組織改革
・“時代錯誤”から残業ゼロ、週休3日に! 鳥取の不動産会社が
 レガシー企業からDX先進企業になれたワケ
・ネクスウェイ、週休4日制・1日3時間勤務選択できる勤務体系を導入
・日本初「週休4日制度」で、優秀な人材を採用するしくみとは? ?
 ナレッジソサエティ久田社長に聞いてみた
367デフォルトの名無しさん
垢版 |
2022/05/28(土) 20:19:11.57ID:NcTZ/5Yj
もう借りまっか
2022/05/28(土) 21:23:09.11ID:sd5VBl3q
ジェネレーターはいつstableになりますか
2022/05/28(土) 23:09:24.03ID:Gdd1cvMp
stableを期待しているということは現状の仕様で納得なんだろうけど
resumeの仕方とか値の受け取り方とか軽快じゃなくね?

let mut generator = || {
yield 1;
yield 2;
yield 3;
return "end"
};
assert_eq!(GeneratorState::Yielded(1), Pin::new(&mut generator).resume(()));
assert_eq!(GeneratorState::Yielded(2), Pin::new(&mut generator).resume(()));
assert_eq!(GeneratorState::Yielded(3), Pin::new(&mut generator).resume(()));
assert_eq!(GeneratorState::Complete("end"), Pin::new(&mut generator).resume(()));

例えばresume構文を用意して記述を見やすくするとか
return値は廃止してOption<T>で返しreturn;でNoneにするとか
2022/05/28(土) 23:30:01.77ID:sd5VBl3q
個人的にはIteratorがyield使って実装できるようになれば満足なのでGeneratorそのものの型とかはそんなに気にしてなかった
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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