公式
https://www.rust-lang.org/
https://blog.rust-lang.org/
https://github.com/rust-lang/rust
公式ドキュメント
https://www.rust-lang.org/learn
Web上の実行環境
https://play.rust-lang.org
※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/
※次スレは原則>>980が立てること
前スレ
Rust part18
https://mevius.5ch.net/test/read.cgi/tech/1670663822/
探検
Rust part19
■ このスレッドは過去ログ倉庫に格納されています
2023/01/17(火) 12:41:32.25ID:nikBFIMQ
389デフォルトの名無しさん
2023/02/05(日) 21:31:31.79ID:kVul7/Hf 多数の下部ライブラリから色んなエラーが上がってくるreqwestはそれらをdyn std::error::Errorへ入れているね
そしてdowncast_refで必要な分岐をして処理しているね
エラー処理はこれで十分でしょ
網羅しなくても残りは最終的にちゃんとエラー表示されるのだから
そしてdowncast_refで必要な分岐をして処理しているね
エラー処理はこれで十分でしょ
網羅しなくても残りは最終的にちゃんとエラー表示されるのだから
390デフォルトの名無しさん
2023/02/05(日) 22:59:47.83ID:cfofmdL5 エラー処理で必須な網羅性とはenumの網羅性とは異なる
いつどこでどんなエラーが発生しても必ず処理されることがエラー処理の網羅性
つまりエラー処理されないまま通常処理に進まないことでありRustではResultの利用によりそれが保証されている
したがってdyn Errorを使って一部をダウンキャストによりエラー処理し残りをエラー表示処理でも網羅性を満たしている
いつどこでどんなエラーが発生しても必ず処理されることがエラー処理の網羅性
つまりエラー処理されないまま通常処理に進まないことでありRustではResultの利用によりそれが保証されている
したがってdyn Errorを使って一部をダウンキャストによりエラー処理し残りをエラー表示処理でも網羅性を満たしている
391デフォルトの名無しさん
2023/02/05(日) 23:51:35.27ID:BjcIBdbF opaqueなerror typeを使うメリットは何なのか?デメリットは何なのか?
少なくともreqwestの開発者はそのトレードオフを検討した上で判断を下している
メリットもデメリットも理解できてないやつが珍説唱えても虚しいだけだぞ
少なくともreqwestの開発者はそのトレードオフを検討した上で判断を下している
メリットもデメリットも理解できてないやつが珍説唱えても虚しいだけだぞ
392デフォルトの名無しさん
2023/02/05(日) 23:54:47.07ID:arvSMdBl >>390
おまえはエクストリームな言い訳並べ立てる前にnon_exhaustiveの意味から調べろな
おまえはエクストリームな言い訳並べ立てる前にnon_exhaustiveの意味から調べろな
393デフォルトの名無しさん
2023/02/05(日) 23:58:58.86ID:QsKcw+fO394デフォルトの名無しさん
2023/02/06(月) 00:09:01.18ID:ZXNgtENY395デフォルトの名無しさん
2023/02/06(月) 01:23:09.90ID:Kt6dB8yb396デフォルトの名無しさん
2023/02/06(月) 06:52:59.94ID:OJBoAdFu 逆だよ
網羅性の扱いを禁止するために意図的にnon_exhaustive指定されている
そのようなエラーの種類には網羅性は必要がないだけでなく
今後もしエラーの種類が増えた場合に全網羅列挙して使用している既存のコードがエラーとなってしまう
そのためこういう時は不要である網羅性の扱いを禁止して全列挙コードを書かせないことで
今後エラーの種類が増えても既存の利用コードに影響を与えずに済む仕組み
網羅性の扱いを禁止するために意図的にnon_exhaustive指定されている
そのようなエラーの種類には網羅性は必要がないだけでなく
今後もしエラーの種類が増えた場合に全網羅列挙して使用している既存のコードがエラーとなってしまう
そのためこういう時は不要である網羅性の扱いを禁止して全列挙コードを書かせないことで
今後エラーの種類が増えても既存の利用コードに影響を与えずに済む仕組み
397デフォルトの名無しさん
2023/02/06(月) 12:30:43.08ID:wr+6RDlb >>396
自信満々に間違った情報を中身のない文章で膨らませてもっともらしく見せようとするところがChatGPTそっくりww
自信満々に間違った情報を中身のない文章で膨らませてもっともらしく見せようとするところがChatGPTそっくりww
398デフォルトの名無しさん
2023/02/06(月) 12:48:04.84ID:/nZ/7Knj 昔ながらの例外論争見てるみたいだ
全部取ればいいいや個別だ
全部取ればいいいや個別だ
399デフォルトの名無しさん
2023/02/06(月) 14:14:21.50ID:C/yeK4bx >>396で合っているけど補足すれば
全網羅列挙コードを書いてもコンパイラがそれを許さずエラーとなる
全網羅列挙しなくていいから必ず全マッチの _ => アームをコンパイラが要求してくる
つまりコンパイラによるエラーの網羅性チェックは不可能
全網羅列挙コードを書いてもコンパイラがそれを許さずエラーとなる
全網羅列挙しなくていいから必ず全マッチの _ => アームをコンパイラが要求してくる
つまりコンパイラによるエラーの網羅性チェックは不可能
400デフォルトの名無しさん
2023/02/06(月) 21:51:09.46ID:MJNtWgHJ そもそもRust以前に他のプログラミング言語でもそのようなエラーの種類の網羅が行なわれたことはない
IOエラーだけでも何十種類もあり列挙するだけでも大変で意味のない作業
エラー処理で必要とされる網羅性とはエラーの種類を全て列挙することではなく
>>390の説明が正しい
RustでResultを使えば保証される
IOエラーだけでも何十種類もあり列挙するだけでも大変で意味のない作業
エラー処理で必要とされる網羅性とはエラーの種類を全て列挙することではなく
>>390の説明が正しい
RustでResultを使えば保証される
401デフォルトの名無しさん
2023/02/06(月) 21:59:33.19ID:T23InEdz 自分の書いたレスを正しい正しいと
一人で連呼してて虚しくならないのかな
一人で連呼してて虚しくならないのかな
402デフォルトの名無しさん
2023/02/06(月) 22:26:04.02ID:7y0OcpN0 エラー処理の網羅性という話は元々
関数からエラー値が返って来る可能性があるのに見落として処理せずに続行しちゃったり
あるいは例外が返って来る可能性があるのに見落として処理しないままでいたり
そういう見落としがよく起きていたから
いつどこでどんなエラー(or例外)が起きても処理漏れがないようにプログラミングしましょうという話
もちろんRustではResultで返せばコンパイル時点でエラーや警告が出るためエラー処理の網羅性は満たされます
Resultを返していればdyn Errorやanyhowを使っていてももちろん大丈夫
そしてエラー処理の分岐にそれらのダウンキャストを使うのも何ら問題なし
関数からエラー値が返って来る可能性があるのに見落として処理せずに続行しちゃったり
あるいは例外が返って来る可能性があるのに見落として処理しないままでいたり
そういう見落としがよく起きていたから
いつどこでどんなエラー(or例外)が起きても処理漏れがないようにプログラミングしましょうという話
もちろんRustではResultで返せばコンパイル時点でエラーや警告が出るためエラー処理の網羅性は満たされます
Resultを返していればdyn Errorやanyhowを使っていてももちろん大丈夫
そしてエラー処理の分岐にそれらのダウンキャストを使うのも何ら問題なし
403デフォルトの名無しさん
2023/02/07(火) 02:02:21.05ID:smEuFI89 anyhow使ってて困ったことないので、これからもanyhow使いますね
404デフォルトの名無しさん
2023/02/07(火) 02:09:15.61ID:2blGAjQQ enumで網羅派の完全敗北だな
anyhowやdyn Errorでdowncast_ref分岐して何ら困らない
anyhowやdyn Errorでdowncast_ref分岐して何ら困らない
405デフォルトの名無しさん
2023/02/07(火) 02:13:05.33ID:fMWAnbF1 anyhowは邪道だろ
406デフォルトの名無しさん
2023/02/07(火) 10:30:33.69ID:jDwZWgRX 下手に分かったふりせず疑問をぶつけるパニック君のようなレスはスレにとっては有益
逆に知ったかぶりして嘘を撒き散らす某オジのレスは害しかない
一緒に仕事してても伸びるのは断然前者のタイプ
後者は多少知識があってもチームの足を引っ張る老害タイプ
逆に知ったかぶりして嘘を撒き散らす某オジのレスは害しかない
一緒に仕事してても伸びるのは断然前者のタイプ
後者は多少知識があってもチームの足を引っ張る老害タイプ
407デフォルトの名無しさん
2023/02/07(火) 11:56:13.05ID:Yu/MJcLX408デフォルトの名無しさん
2023/02/07(火) 12:39:13.84ID:GmLWJf7C どの言語を使っていようがテスト設計とエラー処理設計は初心者と脱初心者を見分けるリトマス試験紙
チュートリアルやリファレンス読むだけでは身につかない
チュートリアルやリファレンス読むだけでは身につかない
409デフォルトの名無しさん
2023/02/07(火) 13:41:38.43ID:vPUoP0i3 そう、IT土方必修
410デフォルトの名無しさん
2023/02/07(火) 20:09:18.77ID:RZZKb5qe >>409
こういうバカが一人でも入ってくると現場は苦労するわな
こういうバカが一人でも入ってくると現場は苦労するわな
411デフォルトの名無しさん
2023/02/07(火) 22:03:06.31ID:u8XyY9YO 今回のケースはRustのエラー処理を他の言語(C#あたり)の例外処理に寄せようとしてる感じ
「特定の例外クラスをcatchしたい」→「dyn Errorで投げてダウンキャストで分岐すればいい」みたいな
anyhowはそういう人のためにあるのかもしれない
オブジェクト指向言語専攻の人はRustのtraitを基底クラスの代わりに使いがちだよね
is-a継承はRustだとenumで表現できる場合が多いんだけど切り替えが難しいのかも
「特定の例外クラスをcatchしたい」→「dyn Errorで投げてダウンキャストで分岐すればいい」みたいな
anyhowはそういう人のためにあるのかもしれない
オブジェクト指向言語専攻の人はRustのtraitを基底クラスの代わりに使いがちだよね
is-a継承はRustだとenumで表現できる場合が多いんだけど切り替えが難しいのかも
412デフォルトの名無しさん
2023/02/07(火) 22:27:27.04ID:23ICgzsB 単純にエラーの種類を列挙する意味がないときに使うだけやで
413デフォルトの名無しさん
2023/02/07(火) 23:09:28.73ID:u8XyY9YO それならいいんだけど型キャストしてまで分岐するとか言ってる人がいたから
自分で分岐する範囲くらいは自分で列挙しとけって話
自分で分岐する範囲くらいは自分で列挙しとけって話
414デフォルトの名無しさん
2023/02/07(火) 23:53:31.04ID:23ICgzsB 下層から上がってくる99種類のエラーはログ吐かせるだけで、特別な処理したいエラーはひとつしかないのにいちいちenumに詰め直したりせんわな
415デフォルトの名無しさん
2023/02/08(水) 00:04:28.76ID:mV68xos2 逆
自分で分岐してエラー処理すんなら区別すべきエラーを決めるのは自分なのでanyhowやdyn Errorでダウンキャストしても問題ない
外から呼び出されるコードなら区別して処理するエラーを決めるのは呼び出し側なので区別できるようにenumで書く
自分で分岐してエラー処理すんなら区別すべきエラーを決めるのは自分なのでanyhowやdyn Errorでダウンキャストしても問題ない
外から呼び出されるコードなら区別して処理するエラーを決めるのは呼び出し側なので区別できるようにenumで書く
416デフォルトの名無しさん
2023/02/08(水) 00:35:28.79ID:ydIblX/+ すまんが、これってなんでダメなの?
ブロックの最後に式を書いてるのに、なんでreturnって書かないとリターンしないの???
そもそもエラーの内容に書いてあるmismatched typesって、一体何と何のタイプがミスマッチなんなんだ・・・・
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=d1833710038ed821593015e5382de11f
エロい人教えて!!!
ブロックの最後に式を書いてるのに、なんでreturnって書かないとリターンしないの???
そもそもエラーの内容に書いてあるmismatched typesって、一体何と何のタイプがミスマッチなんなんだ・・・・
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=d1833710038ed821593015e5382de11f
エロい人教えて!!!
417デフォルトの名無しさん
2023/02/08(水) 01:51:02.48ID:U3de6tMw418デフォルトの名無しさん
2023/02/08(水) 01:59:22.59ID:W8WwzKcT419デフォルトの名無しさん
2023/02/08(水) 07:28:48.49ID:2c2bFNHO 上位の関数でもかなり多数のケースに分けてエラー処理する必要な場合だと
個別にenumにエラー型を収容する方が有利なケースもある
もちろんその場合でもanyhowやdyn Errorに収容してダウンキャストしてもよい
enum matchとダウンキャストの実行時コストはほぼ同じで優劣はなく視認性も変わらない
enumを使うとコードが増える問題はあるがあとは好みの問題
個別にenumにエラー型を収容する方が有利なケースもある
もちろんその場合でもanyhowやdyn Errorに収容してダウンキャストしてもよい
enum matchとダウンキャストの実行時コストはほぼ同じで優劣はなく視認性も変わらない
enumを使うとコードが増える問題はあるがあとは好みの問題
420デフォルトの名無しさん
2023/02/08(水) 10:45:01.05ID:ENpYrX9l ダウンキャストは下位モジュールに不必要に依存することになるので選択の余地があるなら基本的には使うべきではない
自crateで定義したエラー型にダウンキャストするくらいならエラーを定義するついでにenum書いとけばいいだけ
他crateで定義したエラー型にダウンキャストしてるとバージョンアップ時にサイレントにキャストが失敗して動作が変わる
あくまで非常口であって使わざるをえないときはマイナス面を理解した上で注意深く使うもの
自crateで定義したエラー型にダウンキャストするくらいならエラーを定義するついでにenum書いとけばいいだけ
他crateで定義したエラー型にダウンキャストしてるとバージョンアップ時にサイレントにキャストが失敗して動作が変わる
あくまで非常口であって使わざるをえないときはマイナス面を理解した上で注意深く使うもの
421デフォルトの名無しさん
2023/02/08(水) 10:52:13.58ID:fJPPomwd UnknownErrorにわざわざ詰め直したログ吐くしかできない99種類あったエラーと1種類の自クレートのMyErrorをenumで2つ列挙して分岐するのと
MyErrorも含めて100種全部dynで上げてMyErrorだけダウンキャストすることの間に大した違いはない
MyErrorも含めて100種全部dynで上げてMyErrorだけダウンキャストすることの間に大した違いはない
422デフォルトの名無しさん
2023/02/08(水) 12:29:34.73ID:/lg+THEr アプリケーション開発とライブラリ開発の2つの視点があって、それぞれで戦略が違うというのが大元にあるからそこは理解してもらわないとね。
423デフォルトの名無しさん
2023/02/08(水) 12:40:19.14ID:TursxKDi ライブラリでdyn Error使うと本体の型がpubじゃないときにめんどくさそう
424デフォルトの名無しさん
2023/02/08(水) 12:45:18.46ID:QfEWSkwW 両者で大きく異なるよね
ただし既出のcargoやreqwestなど違いに関わらずダウンキャストを使っているコードも多いから
どっちだと良くてどっちだとダメというものでもない気がする
ただし既出のcargoやreqwestなど違いに関わらずダウンキャストを使っているコードも多いから
どっちだと良くてどっちだとダメというものでもない気がする
425デフォルトの名無しさん
2023/02/08(水) 12:48:39.58ID:QfEWSkwW426デフォルトの名無しさん
2023/02/08(水) 13:05:56.18ID:B9DUhvwN >>421
どういう種類の変更に対してコードのどの部分に手を入れる必要が出てくるのかを考えてみるといいよ
どういう種類の変更に対してコードのどの部分に手を入れる必要が出てくるのかを考えてみるといいよ
427デフォルトの名無しさん
2023/02/08(水) 13:15:25.12ID:Fgr/3fzw 求められてもない具体性のない中身のない全く役に立たないアドバイスは有害でしかない
428デフォルトの名無しさん
2023/02/08(水) 13:35:42.99ID:DnIJ53A+ 現実にdowncast_ref()が使われているアプリやライブラリが多数あり
それらが問題になったことはないのだから
downcast_ref()を嫌っている人は思い込みで好き嫌いに過ぎないことを理解しようぜ
enumを作っても下位のエラー型を突っ込むだけでは何も変わらない
それらが問題になったことはないのだから
downcast_ref()を嫌っている人は思い込みで好き嫌いに過ぎないことを理解しようぜ
enumを作っても下位のエラー型を突っ込むだけでは何も変わらない
429デフォルトの名無しさん
2023/02/08(水) 14:12:14.99ID:SqObziFu ここまで具体的なコード例なし
430デフォルトの名無しさん
2023/02/08(水) 14:40:13.85ID:J3DHyZUt 前提条件付けて場合分けして考えろ
てかこんなことでスレの半分近くも消費すんな
てかこんなことでスレの半分近くも消費すんな
431デフォルトの名無しさん
2023/02/08(水) 16:15:41.93ID:ydIblX/+432デフォルトの名無しさん
2023/02/08(水) 16:16:54.39ID:VvFQM19K433デフォルトの名無しさん
2023/02/08(水) 17:13:58.11ID:e6ub/0SO たぶんだけど「Rustでは値を返すのにreturnを省略できる」と誤解してるんじゃないかな
その誤解のためreturn bのreturnを省略してしまったと思われる
正しくは「Rustでは最後の値が返り値となる(のでreturnが不要)(だが使ってもよい)」
と「途中で返したい時はreturnを使う」
だから今回の例だと
if文の中では『途中だから』return bとbにreturnが必須
あるいは関数の最後をif-else式にしてしまえば『最後となるから』bにreturnは不要
その誤解のためreturn bのreturnを省略してしまったと思われる
正しくは「Rustでは最後の値が返り値となる(のでreturnが不要)(だが使ってもよい)」
と「途中で返したい時はreturnを使う」
だから今回の例だと
if文の中では『途中だから』return bとbにreturnが必須
あるいは関数の最後をif-else式にしてしまえば『最後となるから』bにreturnは不要
434デフォルトの名無しさん
2023/02/08(水) 17:28:24.72ID:e6ub/0SO ちょっと誤解があるから追加
最後をif-else式にすれば全体に式returnのreturnが不要になる
そしてif-else式の中はreturnは不要というか付けない
そこにreturnを付けるとif-else式ではなぬif-else文になる
最後をif-else式にすれば全体に式returnのreturnが不要になる
そしてif-else式の中はreturnは不要というか付けない
そこにreturnを付けるとif-else式ではなぬif-else文になる
435デフォルトの名無しさん
2023/02/08(水) 18:12:57.92ID:uJD0QVJP 文章を難読化しすぎやろw
436デフォルトの名無しさん
2023/02/08(水) 18:22:49.80ID:KYgqZ0R0 面倒だから戻るところはすべてreturn書いてる
437デフォルトの名無しさん
2023/02/08(水) 20:39:29.96ID:EOwXjjdD return式の型は厳密には!なんだけど……
まあ後で知ればいいか
まあ後で知ればいいか
438デフォルトの名無しさん
2023/02/08(水) 20:50:18.79ID:e6ub/0SO そのおかげでif式でreturnしつつelseで値を与えたりできるね
439デフォルトの名無しさん
2023/02/09(木) 11:57:24.62ID:w55r8U1C 早期returnはバグにつながるから禁止が常識
440デフォルトの名無しさん
2023/02/09(木) 12:14:59.38ID:bVNNfLSa >>439
昔はそう言われたけど今はそんなカス風習廃れたしRustに持ち込まないでほしい。
昔はそう言われたけど今はそんなカス風習廃れたしRustに持ち込まないでほしい。
441デフォルトの名無しさん
2023/02/09(木) 12:15:50.03ID:UhaInviD 早期returnは(>>439みたいなアホが使うと)バグにつながるから禁止が常識
442デフォルトの名無しさん
2023/02/09(木) 12:41:16.10ID:S7fEOBGh わざわざ早期リターンのために?演算子なんて用意してるRustで早期リターン禁止とな?!
443デフォルトの名無しさん
2023/02/09(木) 12:43:02.37ID:EmRyIpwb スルースキル皆無か
444デフォルトの名無しさん
2023/02/09(木) 13:10:12.86ID:wPt4Q+MY なんで昔は早期returnがバグにつながると考えられてたの?
どう考えても早期returnしない方がバグにつながりやすいと思うんだが
どう考えても早期returnしない方がバグにつながりやすいと思うんだが
445デフォルトの名無しさん
2023/02/09(木) 14:20:08.85ID:QqGr+Vdk もっと昔にgotoの使いすぎで制御構造がぐちゃぐちゃになったことへの反動で
複雑な制御構造は使わないようにしよう、という流れだったかと
複雑な制御構造は使わないようにしよう、という流れだったかと
446デフォルトの名無しさん
2023/02/09(木) 14:55:47.47ID:UhaInviD >>444
C言語時代の話な
例えばこういうパターンでメモリーリークしたりするバグがたくさんあった
f(...){
p = malloc(...);
...
if(...) return;
...
free(p);
}
C言語時代の話な
例えばこういうパターンでメモリーリークしたりするバグがたくさんあった
f(...){
p = malloc(...);
...
if(...) return;
...
free(p);
}
447デフォルトの名無しさん
2023/02/09(木) 15:21:57.59ID:9WtqRr2n そのあたりも自動メモリ開放のRustなら大丈夫だね
if文で早期return/continue/breakしないと、どんどんifネストが深くなっていくのでそれを避けたい
if文で早期return/continue/breakしないと、どんどんifネストが深くなっていくのでそれを避けたい
448デフォルトの名無しさん
2023/02/09(木) 15:37:28.09ID:Ktnp537B >>446
リソース確保・解放するレイヤーとそれを使って処理を行うレイヤーを分ければよくない?
f(...){
p = malloc(...);
g(p, …);
free(p);
}
g(…) {
...
if(...) return;
...
}
ifのネストが浅くなっても逆に関数のネストが深くなりすぎて読みにくくなる側面があるということなのかな?
リソース確保・解放するレイヤーとそれを使って処理を行うレイヤーを分ければよくない?
f(...){
p = malloc(...);
g(p, …);
free(p);
}
g(…) {
...
if(...) return;
...
}
ifのネストが浅くなっても逆に関数のネストが深くなりすぎて読みにくくなる側面があるということなのかな?
449デフォルトの名無しさん
2023/02/09(木) 15:51:48.67ID:oQtbOpVY450デフォルトの名無しさん
2023/02/09(木) 15:59:20.91ID:Ieoj7bJI RAII無しでの話なんかRustに関係無いだろ。
451デフォルトの名無しさん
2023/02/09(木) 16:04:18.76ID:1694Wm1I ifがネスとしていたりした場合に、returnみたいにif-expressionの方に結果を返したい時ってどうすればいいの?
452デフォルトの名無しさん
2023/02/09(木) 16:22:54.26ID:eQhq+cyr >>449
早期returnはやめましょうルールは完璧に守られる保証があると?
早期returnはやめましょうルールは完璧に守られる保証があると?
453デフォルトの名無しさん
2023/02/09(木) 16:24:27.43ID:g7YoScpU454デフォルトの名無しさん
2023/02/09(木) 16:25:56.79ID:VnFQyKoO455デフォルトの名無しさん
2023/02/09(木) 16:36:32.32ID:8ktpZl0b 言語仕様的に可能でも規則で縛ることで安全を担保しようという方法は
いずれ失敗するからそういう要素は必ず言語側の仕様で保証すべき、というのがRustの思想なんだから
「あれは危険だから駄目、コーディング規則で縛る」という発想自体が間違ってる
いずれ失敗するからそういう要素は必ず言語側の仕様で保証すべき、というのがRustの思想なんだから
「あれは危険だから駄目、コーディング規則で縛る」という発想自体が間違ってる
456デフォルトの名無しさん
2023/02/09(木) 16:43:33.27ID:UhaInviD457デフォルトの名無しさん
2023/02/09(木) 16:44:45.59ID:UhaInviD458デフォルトの名無しさん
2023/02/09(木) 16:48:27.59ID:jx1YaHu3459デフォルトの名無しさん
2023/02/09(木) 16:49:18.29ID:9WtqRr2n こういうやつ?
let result = 'found: {
for i in 0..100 {
if f(i) {
break 'found Some(i);
}
}
None
};
let result = 'found: {
for i in 0..100 {
if f(i) {
break 'found Some(i);
}
}
None
};
461デフォルトの名無しさん
2023/02/09(木) 17:27:44.71ID:vSSl5weC 最近はCでもcleanup属性というのが使えるんだな
462はちみつ餃子 ◆8X2XSCHEME
2023/02/09(木) 17:43:07.29ID:zt0qN6wf >>444
構造化が重要視された時代がある。
順次・反復・分岐によって処理の流れを構築するという点から見ると
早期リターンは流れをすっとばして大ジャンプしてることになるので
コードを追うのを難しくすると考えられていた。
「出入口はひとつずつ」は基本思想だったんだよ。
構造化が不十分だった時代にまず構造化することが大事だったという話。
今では構造化が当たり前になったから次の段階として順次・反復・分岐という構造だけでは
上手く扱いづらい部分をどうやるのがいいのかという模索が続いてるわけ。
構造化が重要視された時代がある。
順次・反復・分岐によって処理の流れを構築するという点から見ると
早期リターンは流れをすっとばして大ジャンプしてることになるので
コードを追うのを難しくすると考えられていた。
「出入口はひとつずつ」は基本思想だったんだよ。
構造化が不十分だった時代にまず構造化することが大事だったという話。
今では構造化が当たり前になったから次の段階として順次・反復・分岐という構造だけでは
上手く扱いづらい部分をどうやるのがいいのかという模索が続いてるわけ。
463デフォルトの名無しさん
2023/02/09(木) 18:03:17.12ID:9WtqRr2n 戻るgotoは結局なんらかのループを表しているので
Rustならラベル付loopに指定continueで表せる
進むgotoは無制限ではなくラベル指定breakの大域脱出型に制限される
という認識で合ってる?
Rustならラベル付loopに指定continueで表せる
進むgotoは無制限ではなくラベル指定breakの大域脱出型に制限される
という認識で合ってる?
464デフォルトの名無しさん
2023/02/09(木) 18:18:38.11ID:xZSrodqJ >>454
なんか微妙な機能だな
関数化して早期returnさせる手間が嫌ということなんだろうけどそれなら||や&&オペレータをOptionやResult用に上書きできるようにした方がずっと使いやすい
tryブロックとの非対称性も気になる
なんか微妙な機能だな
関数化して早期returnさせる手間が嫌ということなんだろうけどそれなら||や&&オペレータをOptionやResult用に上書きできるようにした方がずっと使いやすい
tryブロックとの非対称性も気になる
465デフォルトの名無しさん
2023/02/09(木) 18:30:28.03ID:9WtqRr2n >>464
今までに既にあった機能のラベル付loop式のラベル指定breakという使われ方のうち
ループしない使われ方が多かったため事実上のシンタックスシュガーが導入されただけだよ
だから微妙な機能が追加されたという見方は正しくない
今までに既にあった機能のラベル付loop式のラベル指定breakという使われ方のうち
ループしない使われ方が多かったため事実上のシンタックスシュガーが導入されただけだよ
だから微妙な機能が追加されたという見方は正しくない
466デフォルトの名無しさん
2023/02/09(木) 18:30:33.67ID:QonGkYb5 >>464
ほとんどの場合はこんなん使う前にその部分を関数に切り出すことを考えるべきというのはめちゃくちゃ言われてる
awaitとかResultとかライフタイムとかいろいろ絡んできたときに再利用もされない数行の処理のために長々と型を書かなくても済むのがユースケースのひとつと思われる
ほとんどの場合はこんなん使う前にその部分を関数に切り出すことを考えるべきというのはめちゃくちゃ言われてる
awaitとかResultとかライフタイムとかいろいろ絡んできたときに再利用もされない数行の処理のために長々と型を書かなくても済むのがユースケースのひとつと思われる
467デフォルトの名無しさん
2023/02/09(木) 18:46:56.04ID:RAzSpXh0468デフォルトの名無しさん
2023/02/09(木) 18:50:34.43ID:hFEBZw9k どうせなら仮変数みたいな変数割当機能も用意して、末尾最適化再帰風ループもできるようにならないかね。
469デフォルトの名無しさん
2023/02/09(木) 18:53:10.62ID:9WtqRr2n >>467
既に昔から存在していたloop式を
loopと書かなくてもよくなっただけだよ
今までは皆はloop式の最後をbreakすることでloopさせずにこの同じ機能を使っていた
今回でloopを省けるようになったため最後のbreakが不要とだけにすぎない
今さら文句をつけるのが不思議
既に昔から存在していたloop式を
loopと書かなくてもよくなっただけだよ
今までは皆はloop式の最後をbreakすることでloopさせずにこの同じ機能を使っていた
今回でloopを省けるようになったため最後のbreakが不要とだけにすぎない
今さら文句をつけるのが不思議
470デフォルトの名無しさん
2023/02/09(木) 19:02:26.27ID:o9a7e9s5 早期returnってファウラーのガード節の話じゃないん?
あの使い方する限り安全安心可読性改良にしかならないよな?
あの使い方する限り安全安心可読性改良にしかならないよな?
471デフォルトの名無しさん
2023/02/09(木) 19:04:01.20ID:EmRyIpwb >>470
ファウラーじゃなくてリーダブルコード?
ファウラーじゃなくてリーダブルコード?
472デフォルトの名無しさん
2023/02/09(木) 19:05:50.10ID:o9a7e9s5 リーダブルコードは忘れたけど
part of martinfowler.com
https://refactoring.com/catalog/replaceNestedConditionalWithGuardClauses.html
part of martinfowler.com
https://refactoring.com/catalog/replaceNestedConditionalWithGuardClauses.html
473デフォルトの名無しさん
2023/02/09(木) 19:15:02.58ID:9WtqRr2n if letでネストが深くならないように早期return等しようとすると無駄コードが膨らんでいた問題も
同時に導入されたlet elseによって解決されたね
同時に導入されたlet elseによって解決されたね
474デフォルトの名無しさん
2023/02/09(木) 19:24:14.80ID:EmRyIpwb475デフォルトの名無しさん
2023/02/09(木) 19:31:22.46ID:Kxe1JjXm 「ルールだからダメ(思考停止)」な人って結構いるよね
476デフォルトの名無しさん
2023/02/09(木) 19:40:55.17ID:rpwFU8e5 ルールの背景を考えずに破ろうとするやつも多いけどな。
守破離は基本だろ。ブルースリーのパンチキックの逸話でもいいけど。
守破離は基本だろ。ブルースリーのパンチキックの逸話でもいいけど。
477デフォルトの名無しさん
2023/02/09(木) 19:47:18.19ID:Kxe1JjXm478デフォルトの名無しさん
2023/02/09(木) 19:54:21.56ID:bVNNfLSa そもそも失敗できなくするのがここ10年ぐらいのトレンドだろ。
だから静的型やRustが支持されるわけで。
だから静的型やRustが支持されるわけで。
479デフォルトの名無しさん
2023/02/09(木) 20:07:33.02ID:rpwFU8e5480デフォルトの名無しさん
2023/02/09(木) 20:20:31.75ID:9WtqRr2n Rustの制御構文としては
昨年末の2つの追加で
従来は不便で需要が多かった形が無事に解決したから一段落かな
昨年末の2つの追加で
従来は不便で需要が多かった形が無事に解決したから一段落かな
481デフォルトの名無しさん
2023/02/09(木) 22:05:48.35ID:nhsBAAgr482デフォルトの名無しさん
2023/02/09(木) 22:51:32.40ID:YnVskMRN こういうの書くやつが出るから
基本は使わないほうがよさそうだな
https://github.com/rust-lang/rust/issues/48594/partials/load_more#issuecomment-1184213006
基本は使わないほうがよさそうだな
https://github.com/rust-lang/rust/issues/48594/partials/load_more#issuecomment-1184213006
483デフォルトの名無しさん
2023/02/09(木) 23:06:57.24ID:QonGkYb5 草
何らかの目的で大域脱出を用意すると必ず妙ちくりんな悪用を考える奴が出てくるんだよな
何らかの目的で大域脱出を用意すると必ず妙ちくりんな悪用を考える奴が出てくるんだよな
484はちみつ餃子 ◆8X2XSCHEME
2023/02/09(木) 23:22:20.06ID:zt0qN6wf そういえばコンテナのイテレーションの順序が未規定なときに
順序に依存したコードを書かないように乱数でわざとデタラメな順序にしたら
乱数生成器として使うやつが出てきたって話があったな。
どんな機能も下手に使ったら無茶苦茶にしうるってのはもうどうしようもなくない?
順序に依存したコードを書かないように乱数でわざとデタラメな順序にしたら
乱数生成器として使うやつが出てきたって話があったな。
どんな機能も下手に使ったら無茶苦茶にしうるってのはもうどうしようもなくない?
485デフォルトの名無しさん
2023/02/09(木) 23:42:25.26ID:iUuqvbE0 >>56のが実現したらRFCの例は||で代替可
let result = (first_container.iter().find(|&&v| v > 0)
|| second_container.iter().find(|&&v| v < 0))
.unwrap_or(&0);
labelやbreakの手続き的なやり方よりこっちの方が汎用性も高いしrustの目指すべき方向に合ってると思う
let result = (first_container.iter().find(|&&v| v > 0)
|| second_container.iter().find(|&&v| v < 0))
.unwrap_or(&0);
labelやbreakの手続き的なやり方よりこっちの方が汎用性も高いしrustの目指すべき方向に合ってると思う
486デフォルトの名無しさん
2023/02/10(金) 01:49:50.47ID:JoKDyp+E メソッド抽出は嫌
クロージャの即時実行も嫌
ラベル付きbreakならOK!
って感覚が俺には理解できんが
ニーズがあるならいいんじゃね
クロージャの即時実行も嫌
ラベル付きbreakならOK!
って感覚が俺には理解できんが
ニーズがあるならいいんじゃね
487デフォルトの名無しさん
2023/02/10(金) 02:22:12.82ID:KiCBMwJT488デフォルトの名無しさん
2023/02/10(金) 02:35:52.13ID:8y57Q10t ラベルでジャンプより、関数の入れ子の方が分かりやすくない?
489デフォルトの名無しさん
2023/02/10(金) 03:36:08.11ID:eoPLVAGF■ このスレッドは過去ログ倉庫に格納されています
ニュース
- ネット殺到「高市総理の責任」「完全に高市リスク」「負けるな」中国が水産物輸入停止→流石に総理批判の声も「どう責任取る?」 ★6 [樽悶★]
- 【🐼🇨🇳】「高市総理VS中国」で日本からパンダはゼロに? 上野動物園「パンダ返還期限」まであと4カ月…★2 [BFU★]
- 小野田紀美 経済安保相「悪いことをする外国人、日本にいない状況つくる」 [Hitzeschleier★]
- 【速報】 米大使声明 「日本を支えていく」「中国が威圧的手段に訴えるのは断ち難い悪癖」 [お断り★]
- 群馬知事、前橋市長から2度メールも「気づかなかった」 面会せず [どどん★]
- 【千葉市】ロッテ本拠地マリン ドーム型再検討 市の試算ではドーム化で400億円以上の追加投資が生じる可能性 [尺アジ★]
- 【実況】博衣こよりのえちえち声遊楽プロジェクト 共同研究第三弾🧪
- 【悲報】立憲岡田「間違った答弁をした高市総理に問題がある」→愛国者ブチギレ炎上 [834922174]
- 【速報】アメリカ「高市総理を支持する。中国の威圧は許せない」 [931948549]
- 小野田紀美大臣「悪いことをする外国人は日本にいない状況をつくる」 [856698234]
- 珍🏡珍
- 【安倍悲報】山上徹也「押し入れに大量のつぼ」 [115996789]
