Rust part19

■ このスレッドは過去ログ倉庫に格納されています
2023/01/17(火) 12:41:32.25ID:nikBFIMQ
公式
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/
2023/02/05(日) 21:15:55.10ID:yQ5U4c14
cargo みたいに手元や CI で実行するツールのエラー処理なんてその程度で十分ってこった。

もちろん、網羅が必要な領域のコードじゃそんなエラーハンドリングのやりかたじゃあ駄目だろうよ。
2023/02/05(日) 21:31:31.79ID:kVul7/Hf
多数の下部ライブラリから色んなエラーが上がってくるreqwestはそれらをdyn std::error::Errorへ入れているね
そしてdowncast_refで必要な分岐をして処理しているね
エラー処理はこれで十分でしょ
網羅しなくても残りは最終的にちゃんとエラー表示されるのだから
2023/02/05(日) 22:59:47.83ID:cfofmdL5
エラー処理で必須な網羅性とはenumの網羅性とは異なる
いつどこでどんなエラーが発生しても必ず処理されることがエラー処理の網羅性
つまりエラー処理されないまま通常処理に進まないことでありRustではResultの利用によりそれが保証されている
したがってdyn Errorを使って一部をダウンキャストによりエラー処理し残りをエラー表示処理でも網羅性を満たしている
2023/02/05(日) 23:51:35.27ID:BjcIBdbF
opaqueなerror typeを使うメリットは何なのか?デメリットは何なのか?
少なくともreqwestの開発者はそのトレードオフを検討した上で判断を下している

メリットもデメリットも理解できてないやつが珍説唱えても虚しいだけだぞ
2023/02/05(日) 23:54:47.07ID:arvSMdBl
>>390
おまえはエクストリームな言い訳並べ立てる前にnon_exhaustiveの意味から調べろな
2023/02/05(日) 23:58:58.86ID:QsKcw+fO
>>390
やっぱりそれでいいのか
Rustの標準IOライブラリはenumを使っているけどnon_exhaustive指定がしてありenumの網羅性チェックをむしろ使えないようにしてる
2023/02/06(月) 00:09:01.18ID:ZXNgtENY
>>390
一般的なエラー処理の網羅性はその解釈だな
Rustでは型システムと返り型Result及びResult放置をコンパイラが警告してくれるため必ず網羅される仕組み
2023/02/06(月) 01:23:09.90ID:Kt6dB8yb
>>393
non_exhaustive指定があると
なぜenumの網羅性チェックが使えないの?
2023/02/06(月) 06:52:59.94ID:OJBoAdFu
逆だよ
網羅性の扱いを禁止するために意図的にnon_exhaustive指定されている
そのようなエラーの種類には網羅性は必要がないだけでなく
今後もしエラーの種類が増えた場合に全網羅列挙して使用している既存のコードがエラーとなってしまう
そのためこういう時は不要である網羅性の扱いを禁止して全列挙コードを書かせないことで
今後エラーの種類が増えても既存の利用コードに影響を与えずに済む仕組み
2023/02/06(月) 12:30:43.08ID:wr+6RDlb
>>396
自信満々に間違った情報を中身のない文章で膨らませてもっともらしく見せようとするところがChatGPTそっくりww
2023/02/06(月) 12:48:04.84ID:/nZ/7Knj
昔ながらの例外論争見てるみたいだ
全部取ればいいいや個別だ
2023/02/06(月) 14:14:21.50ID:C/yeK4bx
>>396で合っているけど補足すれば
全網羅列挙コードを書いてもコンパイラがそれを許さずエラーとなる
全網羅列挙しなくていいから必ず全マッチの _ => アームをコンパイラが要求してくる
つまりコンパイラによるエラーの網羅性チェックは不可能
2023/02/06(月) 21:51:09.46ID:MJNtWgHJ
そもそもRust以前に他のプログラミング言語でもそのようなエラーの種類の網羅が行なわれたことはない
IOエラーだけでも何十種類もあり列挙するだけでも大変で意味のない作業
エラー処理で必要とされる網羅性とはエラーの種類を全て列挙することではなく
>>390の説明が正しい
RustでResultを使えば保証される
2023/02/06(月) 21:59:33.19ID:T23InEdz
自分の書いたレスを正しい正しいと
一人で連呼してて虚しくならないのかな
2023/02/06(月) 22:26:04.02ID:7y0OcpN0
エラー処理の網羅性という話は元々
関数からエラー値が返って来る可能性があるのに見落として処理せずに続行しちゃったり
あるいは例外が返って来る可能性があるのに見落として処理しないままでいたり
そういう見落としがよく起きていたから
いつどこでどんなエラー(or例外)が起きても処理漏れがないようにプログラミングしましょうという話

もちろんRustではResultで返せばコンパイル時点でエラーや警告が出るためエラー処理の網羅性は満たされます
Resultを返していればdyn Errorやanyhowを使っていてももちろん大丈夫
そしてエラー処理の分岐にそれらのダウンキャストを使うのも何ら問題なし
403デフォルトの名無しさん
垢版 |
2023/02/07(火) 02:02:21.05ID:smEuFI89
anyhow使ってて困ったことないので、これからもanyhow使いますね
2023/02/07(火) 02:09:15.61ID:2blGAjQQ
enumで網羅派の完全敗北だな
anyhowやdyn Errorでdowncast_ref分岐して何ら困らない
2023/02/07(火) 02:13:05.33ID:fMWAnbF1
anyhowは邪道だろ
2023/02/07(火) 10:30:33.69ID:jDwZWgRX
下手に分かったふりせず疑問をぶつけるパニック君のようなレスはスレにとっては有益
逆に知ったかぶりして嘘を撒き散らす某オジのレスは害しかない

一緒に仕事してても伸びるのは断然前者のタイプ
後者は多少知識があってもチームの足を引っ張る老害タイプ
2023/02/07(火) 11:56:13.05ID:Yu/MJcLX
>>406
知ったかぶりもだけど
ご飯論法的に毎回論点を捻じ曲げてくるのが悪質
スルー推奨
2023/02/07(火) 12:39:13.84ID:GmLWJf7C
どの言語を使っていようがテスト設計とエラー処理設計は初心者と脱初心者を見分けるリトマス試験紙
チュートリアルやリファレンス読むだけでは身につかない
2023/02/07(火) 13:41:38.43ID:vPUoP0i3
そう、IT土方必修
2023/02/07(火) 20:09:18.77ID:RZZKb5qe
>>409
こういうバカが一人でも入ってくると現場は苦労するわな
2023/02/07(火) 22:03:06.31ID:u8XyY9YO
今回のケースはRustのエラー処理を他の言語(C#あたり)の例外処理に寄せようとしてる感じ
「特定の例外クラスをcatchしたい」→「dyn Errorで投げてダウンキャストで分岐すればいい」みたいな
anyhowはそういう人のためにあるのかもしれない

オブジェクト指向言語専攻の人はRustのtraitを基底クラスの代わりに使いがちだよね
is-a継承はRustだとenumで表現できる場合が多いんだけど切り替えが難しいのかも
2023/02/07(火) 22:27:27.04ID:23ICgzsB
単純にエラーの種類を列挙する意味がないときに使うだけやで
2023/02/07(火) 23:09:28.73ID:u8XyY9YO
それならいいんだけど型キャストしてまで分岐するとか言ってる人がいたから
自分で分岐する範囲くらいは自分で列挙しとけって話
2023/02/07(火) 23:53:31.04ID:23ICgzsB
下層から上がってくる99種類のエラーはログ吐かせるだけで、特別な処理したいエラーはひとつしかないのにいちいちenumに詰め直したりせんわな
2023/02/08(水) 00:04:28.76ID:mV68xos2

自分で分岐してエラー処理すんなら区別すべきエラーを決めるのは自分なので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
エロい人教えて!!!
2023/02/08(水) 01:51:02.48ID:U3de6tMw
>>416
else句が無いのでifの条件式がfalseの場合はif-expressionは()になるけど
ifの条件式がtrueの場合はif-expressionがi32になるのでミスマッチ
2023/02/08(水) 01:59:22.59ID:W8WwzKcT
>>414
ログを吐かせるだけでもエラーによってログの吐き方を変えたいこともよくある話なのでケースバイケース
99種類を2種類に詰め直して片方をerased typeにしたりする
2023/02/08(水) 07:28:48.49ID:2c2bFNHO
上位の関数でもかなり多数のケースに分けてエラー処理する必要な場合だと
個別にenumにエラー型を収容する方が有利なケースもある
もちろんその場合でもanyhowやdyn Errorに収容してダウンキャストしてもよい
enum matchとダウンキャストの実行時コストはほぼ同じで優劣はなく視認性も変わらない
enumを使うとコードが増える問題はあるがあとは好みの問題
2023/02/08(水) 10:45:01.05ID:ENpYrX9l
ダウンキャストは下位モジュールに不必要に依存することになるので選択の余地があるなら基本的には使うべきではない

自crateで定義したエラー型にダウンキャストするくらいならエラーを定義するついでにenum書いとけばいいだけ
他crateで定義したエラー型にダウンキャストしてるとバージョンアップ時にサイレントにキャストが失敗して動作が変わる

あくまで非常口であって使わざるをえないときはマイナス面を理解した上で注意深く使うもの
2023/02/08(水) 10:52:13.58ID:fJPPomwd
UnknownErrorにわざわざ詰め直したログ吐くしかできない99種類あったエラーと1種類の自クレートのMyErrorをenumで2つ列挙して分岐するのと
MyErrorも含めて100種全部dynで上げてMyErrorだけダウンキャストすることの間に大した違いはない
2023/02/08(水) 12:29:34.73ID:/lg+THEr
アプリケーション開発とライブラリ開発の2つの視点があって、それぞれで戦略が違うというのが大元にあるからそこは理解してもらわないとね。
2023/02/08(水) 12:40:19.14ID:TursxKDi
ライブラリでdyn Error使うと本体の型がpubじゃないときにめんどくさそう
2023/02/08(水) 12:45:18.46ID:QfEWSkwW
両者で大きく異なるよね
ただし既出のcargoやreqwestなど違いに関わらずダウンキャストを使っているコードも多いから
どっちだと良くてどっちだとダメというものでもない気がする
2023/02/08(水) 12:48:39.58ID:QfEWSkwW
424は422へのレスね

>>423
そこはenum作って収容しようがdyn Errorに収容しようが関係なくpubじゃない型はどうにもならないような
2023/02/08(水) 13:05:56.18ID:B9DUhvwN
>>421
どういう種類の変更に対してコードのどの部分に手を入れる必要が出てくるのかを考えてみるといいよ
2023/02/08(水) 13:15:25.12ID:Fgr/3fzw
求められてもない具体性のない中身のない全く役に立たないアドバイスは有害でしかない
2023/02/08(水) 13:35:42.99ID:DnIJ53A+
現実にdowncast_ref()が使われているアプリやライブラリが多数あり
それらが問題になったことはないのだから
downcast_ref()を嫌っている人は思い込みで好き嫌いに過ぎないことを理解しようぜ
enumを作っても下位のエラー型を突っ込むだけでは何も変わらない
2023/02/08(水) 14:12:14.99ID:SqObziFu
ここまで具体的なコード例なし
2023/02/08(水) 14:40:13.85ID:J3DHyZUt
前提条件付けて場合分けして考えろ
てかこんなことでスレの半分近くも消費すんな
431デフォルトの名無しさん
垢版 |
2023/02/08(水) 16:15:41.93ID:ydIblX/+
>>417
そうだったのか!returnを書いたら通るのも、そうするとどちらも戻り値が()同士で統一されるってことか!
ありがとう!全然わかんなかったぜ!
432デフォルトの名無しさん
垢版 |
2023/02/08(水) 16:16:54.39ID:VvFQM19K
>>417
>>416では無いが、そういう意味だったのか
単に厳し目にチェックしているからだと思っていた
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は不要
2023/02/08(水) 17:28:24.72ID:e6ub/0SO
ちょっと誤解があるから追加
最後をif-else式にすれば全体に式returnのreturnが不要になる
そしてif-else式の中はreturnは不要というか付けない
そこにreturnを付けるとif-else式ではなぬif-else文になる
2023/02/08(水) 18:12:57.92ID:uJD0QVJP
文章を難読化しすぎやろw
2023/02/08(水) 18:22:49.80ID:KYgqZ0R0
面倒だから戻るところはすべてreturn書いてる
2023/02/08(水) 20:39:29.96ID:EOwXjjdD
return式の型は厳密には!なんだけど……
まあ後で知ればいいか
2023/02/08(水) 20:50:18.79ID:e6ub/0SO
そのおかげでif式でreturnしつつelseで値を与えたりできるね
2023/02/09(木) 11:57:24.62ID:w55r8U1C
早期returnはバグにつながるから禁止が常識
2023/02/09(木) 12:14:59.38ID:bVNNfLSa
>>439
昔はそう言われたけど今はそんなカス風習廃れたしRustに持ち込まないでほしい。
2023/02/09(木) 12:15:50.03ID:UhaInviD
早期returnは(>>439みたいなアホが使うと)バグにつながるから禁止が常識
2023/02/09(木) 12:41:16.10ID:S7fEOBGh
わざわざ早期リターンのために?演算子なんて用意してるRustで早期リターン禁止とな?!
2023/02/09(木) 12:43:02.37ID:EmRyIpwb
スルースキル皆無か
2023/02/09(木) 13:10:12.86ID:wPt4Q+MY
なんで昔は早期returnがバグにつながると考えられてたの?
どう考えても早期returnしない方がバグにつながりやすいと思うんだが
2023/02/09(木) 14:20:08.85ID:QqGr+Vdk
もっと昔にgotoの使いすぎで制御構造がぐちゃぐちゃになったことへの反動で
複雑な制御構造は使わないようにしよう、という流れだったかと
2023/02/09(木) 14:55:47.47ID:UhaInviD
>>444
C言語時代の話な
例えばこういうパターンでメモリーリークしたりするバグがたくさんあった

f(...){
p = malloc(...);
...
if(...) return;
...
free(p);
}
2023/02/09(木) 15:21:57.59ID:9WtqRr2n
そのあたりも自動メモリ開放のRustなら大丈夫だね
if文で早期return/continue/breakしないと、どんどんifネストが深くなっていくのでそれを避けたい
2023/02/09(木) 15:37:28.09ID:Ktnp537B
>>446
リソース確保・解放するレイヤーとそれを使って処理を行うレイヤーを分ければよくない?

f(...){
p = malloc(...);
g(p, …);
free(p);
}

g(…) {
...
if(...) return;
...
}

ifのネストが浅くなっても逆に関数のネストが深くなりすぎて読みにくくなる側面があるということなのかな?
2023/02/09(木) 15:51:48.67ID:oQtbOpVY
>>448
分けましょうってルール化したくらいで完璧に守られるなら誰も苦労しないんだよな…
そのうち処理レイヤー側でmallocするやつが出てくるやつ
2023/02/09(木) 15:59:20.91ID:Ieoj7bJI
RAII無しでの話なんかRustに関係無いだろ。
451デフォルトの名無しさん
垢版 |
2023/02/09(木) 16:04:18.76ID:1694Wm1I
ifがネスとしていたりした場合に、returnみたいにif-expressionの方に結果を返したい時ってどうすればいいの?
2023/02/09(木) 16:22:54.26ID:eQhq+cyr
>>449
早期returnはやめましょうルールは完璧に守られる保証があると?
2023/02/09(木) 16:24:27.43ID:g7YoScpU
>>451
擬似コードでいいのでイメージを書いてくれ
でないと言いたいことが分からない
2023/02/09(木) 16:25:56.79ID:VnFQyKoO
>>451
最近入ったラベル付きブロックでbreak

https://rust-lang.github.io/rfcs/2046-label-break-value.html
2023/02/09(木) 16:36:32.32ID:8ktpZl0b
言語仕様的に可能でも規則で縛ることで安全を担保しようという方法は
いずれ失敗するからそういう要素は必ず言語側の仕様で保証すべき、というのがRustの思想なんだから
「あれは危険だから駄目、コーディング規則で縛る」という発想自体が間違ってる
2023/02/09(木) 16:43:33.27ID:UhaInviD
>>448
リソースが1つだけならいいかも知れないけど複数リソースが絡んでたりすると色々ややこしいコードになっちゃう
>>452
コードレビュー時に return 検索したら
2023/02/09(木) 16:44:45.59ID:UhaInviD
>>450
>>439 に言ってくれ
2023/02/09(木) 16:48:27.59ID:jx1YaHu3
>>456
なるほど
そういう方法だけに頼ってるなら早期returnのほうが見つけやすいわな
2023/02/09(木) 16:49:18.29ID:9WtqRr2n
こういうやつ?
let result = 'found: {
 for i in 0..100 {
  if f(i) {
   break 'found Some(i);
  }
 }
 None
};
460デフォルトの名無しさん
垢版 |
2023/02/09(木) 17:15:30.09ID:1694Wm1I
>>453-454
>>459
やりたかったのこれだ、せんきゅー!
2023/02/09(木) 17:27:44.71ID:vSSl5weC
最近はCでもcleanup属性というのが使えるんだな
2023/02/09(木) 17:43:07.29ID:zt0qN6wf
>>444
構造化が重要視された時代がある。
順次・反復・分岐によって処理の流れを構築するという点から見ると
早期リターンは流れをすっとばして大ジャンプしてることになるので
コードを追うのを難しくすると考えられていた。
「出入口はひとつずつ」は基本思想だったんだよ。
構造化が不十分だった時代にまず構造化することが大事だったという話。

今では構造化が当たり前になったから次の段階として順次・反復・分岐という構造だけでは
上手く扱いづらい部分をどうやるのがいいのかという模索が続いてるわけ。
2023/02/09(木) 18:03:17.12ID:9WtqRr2n
戻るgotoは結局なんらかのループを表しているので
Rustならラベル付loopに指定continueで表せる
進むgotoは無制限ではなくラベル指定breakの大域脱出型に制限される
という認識で合ってる?
2023/02/09(木) 18:18:38.11ID:xZSrodqJ
>>454
なんか微妙な機能だな
関数化して早期returnさせる手間が嫌ということなんだろうけどそれなら||や&&オペレータをOptionやResult用に上書きできるようにした方がずっと使いやすい
tryブロックとの非対称性も気になる
2023/02/09(木) 18:30:28.03ID:9WtqRr2n
>>464
今までに既にあった機能のラベル付loop式のラベル指定breakという使われ方のうち
ループしない使われ方が多かったため事実上のシンタックスシュガーが導入されただけだよ
だから微妙な機能が追加されたという見方は正しくない
2023/02/09(木) 18:30:33.67ID:QonGkYb5
>>464
ほとんどの場合はこんなん使う前にその部分を関数に切り出すことを考えるべきというのはめちゃくちゃ言われてる
awaitとかResultとかライフタイムとかいろいろ絡んできたときに再利用もされない数行の処理のために長々と型を書かなくても済むのがユースケースのひとつと思われる
2023/02/09(木) 18:46:56.04ID:RAzSpXh0
>>465
シンタックスシュガーも機能やろがい
公式にもlanguage featureと書いてるぞい
2023/02/09(木) 18:50:34.43ID:hFEBZw9k
どうせなら仮変数みたいな変数割当機能も用意して、末尾最適化再帰風ループもできるようにならないかね。
2023/02/09(木) 18:53:10.62ID:9WtqRr2n
>>467
既に昔から存在していたloop式を
loopと書かなくてもよくなっただけだよ
今までは皆はloop式の最後をbreakすることでloopさせずにこの同じ機能を使っていた
今回でloopを省けるようになったため最後のbreakが不要とだけにすぎない
今さら文句をつけるのが不思議
2023/02/09(木) 19:02:26.27ID:o9a7e9s5
早期returnってファウラーのガード節の話じゃないん?
あの使い方する限り安全安心可読性改良にしかならないよな?
2023/02/09(木) 19:04:01.20ID:EmRyIpwb
>>470
ファウラーじゃなくてリーダブルコード?
2023/02/09(木) 19:05:50.10ID:o9a7e9s5
リーダブルコードは忘れたけど

part of martinfowler.com
https://refactoring.com/catalog/replaceNestedConditionalWithGuardClauses.html
2023/02/09(木) 19:15:02.58ID:9WtqRr2n
if letでネストが深くならないように早期return等しようとすると無駄コードが膨らんでいた問題も
同時に導入されたlet elseによって解決されたね
2023/02/09(木) 19:24:14.80ID:EmRyIpwb
>>472
そうこれ、というか第1版からあるならファウラーが先なのね
失礼した
2023/02/09(木) 19:31:22.46ID:Kxe1JjXm
「ルールだからダメ(思考停止)」な人って結構いるよね
2023/02/09(木) 19:40:55.17ID:rpwFU8e5
ルールの背景を考えずに破ろうとするやつも多いけどな。

守破離は基本だろ。ブルースリーのパンチキックの逸話でもいいけど。
2023/02/09(木) 19:47:18.19ID:Kxe1JjXm
>>476
合理的なロジックがないという点で同類じゃね
「ルールだから問題ない(思考停止)」で他人に迷惑をかけるのも同じ
そして多くの場合無責任までセットだ
2023/02/09(木) 19:54:21.56ID:bVNNfLSa
そもそも失敗できなくするのがここ10年ぐらいのトレンドだろ。
だから静的型やRustが支持されるわけで。
2023/02/09(木) 20:07:33.02ID:rpwFU8e5
>>477
ルールについては「決定と実行の分離」という重要な側面があるよ。

頭のいい奴がルールを作れば、アホがルール通りに実行しても被害は少ない。アホがルールを破るよりよほどマシ。
2023/02/09(木) 20:20:31.75ID:9WtqRr2n
Rustの制御構文としては
昨年末の2つの追加で
従来は不便で需要が多かった形が無事に解決したから一段落かな
2023/02/09(木) 22:05:48.35ID:nhsBAAgr
>>464
わかる
旧世代言語のニオイがする
2023/02/09(木) 22:51:32.40ID:YnVskMRN
こういうの書くやつが出るから
基本は使わないほうがよさそうだな
https://github.com/rust-lang/rust/issues/48594/partials/load_more#issuecomment-1184213006
2023/02/09(木) 23:06:57.24ID:QonGkYb5

何らかの目的で大域脱出を用意すると必ず妙ちくりんな悪用を考える奴が出てくるんだよな
2023/02/09(木) 23:22:20.06ID:zt0qN6wf
そういえばコンテナのイテレーションの順序が未規定なときに
順序に依存したコードを書かないように乱数でわざとデタラメな順序にしたら
乱数生成器として使うやつが出てきたって話があったな。

どんな機能も下手に使ったら無茶苦茶にしうるってのはもうどうしようもなくない?
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の目指すべき方向に合ってると思う
2023/02/10(金) 01:49:50.47ID:JoKDyp+E
メソッド抽出は嫌
クロージャの即時実行も嫌
ラベル付きbreakならOK!
って感覚が俺には理解できんが
ニーズがあるならいいんじゃね
2023/02/10(金) 02:22:12.82ID:KiCBMwJT
>>486
関数切り出しやIIFEだと式の値はResult型になるようなところで、
ラベル付きブロックだとエラーまわりは親の関数に完全に任せて該当の式の値を生で返せる
2023/02/10(金) 02:35:52.13ID:8y57Q10t
ラベルでジャンプより、関数の入れ子の方が分かりやすくない?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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