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/10(金) 19:05:14.63ID:53cyCMdn
>>508
唐突に発狂されても意味不明
反論があるなら技術的な話でお願いします
2023/02/10(金) 19:06:54.13ID:MJOsdNRe
>>520
関数みたいなブロックを作ればいいんじゃない?
あるいはブロックみたいな関数とか。
2023/02/10(金) 19:07:09.08ID:MJOsdNRe
>>520
関数みたいなブロックを作ればいいんじゃない?
あるいはブロックみたいな関数とか。
2023/02/10(金) 19:24:57.65ID:VelAUwkm
>>520
Rustには何年も前からラベル付breakがあります
今さら文句をつけている人はRustを知らずイチャモンを付けたいだけだとバレていますよ

メジャーなプログラミング言語の大半がラベル付breakを備えています
JavaでもSwiftにもGoもJavaScriptすらラベル付breakを持っています
プログラミングにおいて必須の機能だからです

逆にラベル付breakを持っていない代表的な言語がC/C++です
今回のRust叩きをしている犯人はいつもと同じ人だと分かります
2023/02/10(金) 19:52:12.29ID:ec863R6+
breakに対してジャンプだとかgotoだとかトンデモ発言が出ていたのはそういうことか
C/C++しか知らないと多重ループすらgotoで抜けるしかないもんな
そういう貧弱な世界しか知らない視野の狭い人だから必死にRustを叩いていたわけか
2023/02/10(金) 21:33:52.77ID:zr0HQZhu
前から常駐してるアンチRustのやつだろ
ばればれだがアンチとばれないように装いつつRustの色んな点を批判してきた
特にRustならではの機能とか新たな機能とかRustらしい書き方とかを嫌う
2023/02/10(金) 22:57:01.58ID:9GdW2Tn6
同じことしか言わないから自演丸分かりやんww
2023/02/10(金) 22:59:03.20ID:Y2H2O9Fe
>>524
大半の言語が備えてるラベル付breakはループから抜けるものでブロックから抜けるものじゃないぞ
2023/02/10(金) 23:14:34.63ID:z32i1LMi
swiftがdo statementでブロックスコープから抜ける機能を用意してるがtry/catchなしの形では誰も使ってない
2023/02/10(金) 23:16:17.28ID:TiW7YUw7
そんなことよりさっさとif let Some(c) = chars.next(); c.is_whitespace() {とかって書けるようになってほしい
2023/02/10(金) 23:22:50.62ID:KiCBMwJT
ブロックは「必ず1回で終了するループ」と解釈可能なのでループからのラベル指定breakがあるならブロックからもbreakで抜けられる方が自然
2023/02/10(金) 23:24:33.98ID:PcQ6rbEj
Javaも文法的にはループ以外でもラベル付きブレイク使えるけど絶対使わないな
2023/02/10(金) 23:32:27.37ID:Qit9LgYB
>>531
その理屈でいけばラベルなしブロックからもbreakで抜けられないとおかしくない?
2023/02/10(金) 23:37:03.68ID:q3LdPEQ+
RFCの例を4パターンで書いてみたけどラベル付きbreakは無いな
1か2のパターンに収まる形にリファクタリングする
大半の人がラベル付きbreakを選びたくなるようなサンプルはないのかな?

1. 関数化
2. Optionコンビネータ
3. クロージャ
4. ラベル付きbreak

https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=e365b15243be65f5fc2d09a94324317e
2023/02/10(金) 23:46:57.14ID:XHs/nBWT
流れと一切関係ないけど
rubyは一時期tapとbreakで値を返す文化?あったな
foo.tap {|x| bar} // selfつまりfooを返す
foo.tap {|x| break bar} // breakでbarを返す
foo.then {|x| bar} // ブロックの結果つまりbarを返す。今はthen使うのが素直。
2023/02/11(土) 00:18:21.11ID:VRz38Asr
>>530
セミコロンじゃなくて&&だよね
stableになるのは半年後くらいじゃない
2023/02/11(土) 00:22:48.96ID:LT0L6YWb
>>534
再利用しない前提ならクロージャを変数に束縛してしまえば3.も視野に入ると思うんだ
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=3159733485aa1a7ee3a1838637a3a097
2023/02/11(土) 00:29:21.70ID:N8U5Q6xc
異なる種類のエラーを返す関数が絡んできたとき、ラベル指定breakのみエラーの合成を?演算子で関数境界に押し込められる
関数やクロージャだと「ブロック内のエラーを合成した型」を明示的に取り扱うことになって二度手間
2023/02/11(土) 00:48:21.15ID:C7Sk8k8l
>>535
tapでbreakなんて初めて知ったわ
イテレータのメソッドチェーンの途中経過を出力する時にしか使ったことなかった
2023/02/11(土) 01:02:10.14ID:rZ1nyaTw
>>537
これは同意

>>538
サンプルコード書いてみてよ
541デフォルトの名無しさん
垢版 |
2023/02/11(土) 01:49:22.40ID:sVZS7q05
すまんがRustlingsでまたちょっと教えてほしいんだけどさ
これ↓のListing 8-8の&mutって、一体どういう意味があるの???
https://doc.rust-lang.org/book/ch08-01-vectors.html
Rustlingsをやっていて、似たような場面で&mutなしでも動いちゃうように見えるけど・・・・状況が似て非なるものなんだろか・・・・・
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=b4a253142ce1e394ba13bb0c2fc58f11
2023/02/11(土) 02:18:23.31ID:N8U5Q6xc
>>541
詳細はトレイトとか Deref とか IntoIterator とか関連型とかその章ではまだ出て来てない概念が色々絡むが

for item in v の v に対して
Vec<T> を渡したら item は T になって所有権ごと持ってく
&Vec<T> を渡したら item は &T になって不変参照のイテレーションになる
&mut Vec<T> を渡したら item は &mut T になって可変参照のイテレーションになる


Vec<T>は DerefMut<Target=[T]> を実装しているから &mut Vec<T> は暗黙のうちに deref_mut のメソッドを通して &mut [T] に変換されて
その &mut [T] が IntoIterator<Item=&mut T> を実装しているからfor文で &mut T のイテレーションができる
2023/02/11(土) 03:08:28.64ID:ClzSOMcn
>>534
その程度ならば型宣言で冗長になる関数化をするまでもないからブロック式でも十分かな
使い分けできるようにブロック式の不備を整備したRustの方針は正しいと思うよ

>>541
所有権を渡すのは消費尽くすときだけでその後も使いたい時は参照&か可変参照&mutを渡す
そのコードのv.iter_mut()の方に見かけ上&mutが見当たらないのはメソッド定義にそれがあるから
メソッドでは所有権を渡すか参照を渡すか可変参照を渡すかをその定義でselfか&selfか&mut selfか指定することでメソッド使用時に毎回指定しなくて済むようになっている
2023/02/11(土) 03:56:21.21ID:VRz38Asr
>>541
vがVec<T>の場合
for i in &mut v {…} と
for i in v.iter_mut() {…} は同じ

前者は&mut Vec<T>のIntoIteratorトレイトのinto_iter()が呼ばれる
その中身はself.iter_mut()なので後者と同じになる

for loopはiterable(IntoIteratorを実装してるもの)を受け取って
そのinto_iter()を呼び出してからイテレートする仕組み
https://doc.rust-lang.org/std/iter/index.html#for-loops-and-intoiterator
2023/02/11(土) 15:27:39.27ID:VRz38Asr
>>542
>&mut Vec<T> は暗黙のうちに deref_mut のメソッドを通して &mut [T] に変換されて

細かいけどここちょっと気になった
for loopに渡されたタイミングでDeref Coercionが発生するんじゃなくて
まず最初に渡された値の型でIntoIterator::into_iterが呼ばれて
その中のself.iter_mutのようなメソッド呼び出し時にVecに該当メソッドがないから
Deref Coercionが発生してslice::iter_mutが呼ばれるという処理順だと思う
2023/02/11(土) 17:02:31.35ID:51HA6IG3
>>537
処理に名前を与えることがいかに重要かよく分かるいい例だな
2023/02/11(土) 18:03:53.39ID:RzhQX/na
なるほど
処理名をラベル名として付与するとラベル付ブロックが非常にわかりやすくなった
関数化と異なり無駄な引数宣言と型宣言が不要となり可読性が増した
もちろん関数化した方が適してる場合もあるだろうから上手く使い分けると良さそう
2023/02/11(土) 18:29:02.74ID:vxEXQ/Iw
さすが汚コーダー!
可読性や保守性になんて目もくれない!
保守なんてやらないもの!
2023/02/11(土) 18:55:39.54ID:o3GDXEGy
>>516
それな!(Noneでこんな感じにしちゃったんだろう、コール側がこうである必然性があまりない);
2023/02/11(土) 19:00:32.48ID:feYXfeom
1回しか使わない小さな関数in関数は関数名付きブロックで十分やね
2023/02/11(土) 20:39:00.98ID:PvIfa6j8
外側の関数で既に変数定義してるのに、再び内側の関数の引数で宣言するのが二度手間だったから、ブロック化いいかも。
特に参照している変数が多いと連れ回しと、型宣言が大変だった。
2023/02/11(土) 20:42:54.48ID:XY/MjG6B
オジループw
2023/02/11(土) 20:44:08.48ID:gkb6d4TT
IIFEとかいう💩よりはラベル指定ブロックの方がいいのは間違いない
2023/02/11(土) 21:10:11.34ID:feYXfeom
色んな有名クレートのソース見てると
let result = (|| {

})();
の形も多いね
2023/02/11(土) 21:19:57.61ID:+3eLBKqi
>>552
承認欲求を満たしてあげないとbreakしない
嘘でいいから同意して差し上げろ
2023/02/11(土) 21:20:48.03ID:8c0BE6VG
try_blocksが安定化されればここまでの話全部吹っ飛ぶんだけど
それまでのつなぎでしかないコードでここまで議論を紛糾させる必要なんてないのよ
2023/02/11(土) 21:44:37.75ID:feYXfeom
>>556
もちろん代替として今は>>554の形で使ってるよ
2023/02/11(土) 21:50:35.09ID:VSenmeU+
こんどはそれでラベルbreakでええやんって議論が巻き起こるんでしょ
2023/02/11(土) 21:58:24.52ID:feYXfeom
>>558
一部だけ用途は重なるけど互いにできないことがあるからtry blockとlabeled blockは併用になる
2023/02/11(土) 22:18:32.89ID:N8U5Q6xc
>>556
try ブロックとラベル指定ブロックて用途違うんじゃね

let result = 'found: {
 for i in 0..100 {
  if f(i) {
   break 'found foo(i)?;
  }
 }
 bar()?;
};
2023/02/11(土) 22:18:47.54ID:N8U5Q6xc
途中送信
2023/02/11(土) 22:23:01.29ID:N8U5Q6xc
途中送信
>>560 のケースで
foo(i) が Result<i32, FooError>
bar() が Result<i32, BarError>
を返すとして、ここでFooErrorとBarErrorの合成を考えなくても関数境界にエラー合成を押し付けて、
result の型を i32 にできるのがラベル付きブロック

クロージャとかは?演算子のスコープを作ってしまうので一旦Resultの型を明示しなきゃいけなくて、
FooErrorとBarErrorの合成をロジックの途中に挟むことになってうれしくない
2023/02/11(土) 22:24:54.60ID:N8U5Q6xc
bar()?
のセミコロンいらねえわ
2023/02/11(土) 23:15:54.51ID:PvIfa6j8
>>556
それはエラーの早期離脱のためだから、普通の値の早期離脱には使えない。
break可能なブロックは必要でしょう。
2023/02/11(土) 23:32:14.59ID:PvIfa6j8
>>562
従来のif式やmatch式と同様に、tryでないblock式では?を通過してくれるところが嬉しいポイントかな。
一方でtry block式はTry実装のResult型などになってしまい別物。
2023/02/12(日) 00:31:55.44ID:MRyWK0X4
>>560
書き直せばいい
let result = match (0..100).find(f) {
Some(i) => foo(i)?,
None => bar()?,
};
2023/02/12(日) 00:46:15.75ID:iluQvMBc
>>566
その人じゃないけど
tryとの違いを示してる簡素な例にその反論は意味ない
そして多重forの一般形となるだけでそのやり方は破綻
2023/02/12(日) 00:52:37.66ID:MRyWK0X4
>>567
なんで破綻するのかよくわからない
コードで示してくれ
2023/02/12(日) 00:56:29.87ID:MRyWK0X4
破綻するかどうかは別として
多重forの中で種類の異なるエラーを返すような処理を直接書くことにはすごく疑問を感じるから
本当にそういうやり方が必要な状況があるなら見てみたいね
2023/02/12(日) 01:41:36.70ID:tVXYYK1+
>>566
アスペ
2023/02/12(日) 01:45:15.49ID:iluQvMBc
単なる多重forショートカットの話だよ
とりあえずエラーや可変長や可変参照問題は抜きにシンプルで
let n = 'calc: {
 for i in 0..100 {
  if f(i) {
   break 'calc ff(i);
  }
  for j in 0..100 {
   if g(i, j) {
    break 'calc gg(i, j);
   }
  }
 }
 0
};
2023/02/12(日) 02:21:27.18ID:mvDk5H0/
ラベル付きブロック式は特に新しい挙動は導入していない
早期脱出と?のエスカレーションの併用が可能になっただけ

関数:
〇変数、ライフタイムのスコープ
×環境のキャプチャ
〇早期脱出
×?演算子のエスカレーション

クロージャ
〇変数、ライフタイムのスコープ
〇環境のキャプチャ
〇早期脱出
×?演算子のエスカレーション

無名ブロック式:
〇変数、ライフタイムのスコープ
〇環境のキャプチャ
×早期脱出
〇?演算子のエスカレーション

ラベル付きブロック式:
〇変数、ライフタイムのスコープ
〇環境のキャプチャ
〇早期脱出
〇?演算子のエスカレーション
2023/02/12(日) 02:33:03.96ID:277pKKEQ
>>571
?使わないならクロージャでいいパターンでは?
あとそろそろfやggじゃ抽象的すぎてきついから実戦で使いそうなパターンの例を頼むわ
2023/02/12(日) 02:43:50.06ID:PxSEkt7R
むしろこの用途でクロージャでIIFEする方がラベル指定breakより糞だよ
2023/02/12(日) 02:50:28.15ID:mvDk5H0/
ラベル指定breakについては今更5chでギャオっても無駄
https://internals.rust-lang.org/t/use-iife-not-break-from-labeled-blocks/17684
2023/02/12(日) 03:00:29.86ID:iluQvMBc
>>573
クロージャ即時実行だとできないこともある

>>575
なるほど
引用

>ラベル付きブレークはループ構造にすでに存在していたため、これは独自の新機能ではなく、既存の機能の一般化でした。
>さらに、クロージャは、ネストして外側のクロージャからブレークしたり、包含関数から戻ったりすることができないため、ラベル付きブレークほど強力ではありません。
>いずれにせよ、この機能は安定しており、削除されることはありません。
2023/02/12(日) 06:51:31.07ID:GdrUqMCg
>>572
ラベル付ブロック式が優秀すぎだな
2023/02/12(日) 11:32:22.52ID:wiu+k2M9
>>571
これ書いててアンチパターンだと感じないの?
2023/02/12(日) 11:36:01.27ID:mvDk5H0/
機能的な差異(できることの違い)を示すためのサンプルコードにアンチパターンがどうのとか一生言ってる奴はこの世のすべてのコードから大域脱出を排除してきて
2023/02/12(日) 11:42:58.24ID:GdrUqMCg
>>578
正しいアルゴリズムをぜひ知りたい
コードを出して
2023/02/12(日) 11:47:23.89ID:b/cm1PRG
大域脱出自体がアンチパターンではあるが
それでも必要になったときのために比較的マシな方法があったほうがよいというのは両立する話なんだよな。
2023/02/12(日) 11:51:17.64ID:VpAOtCID
短絡評価の&&と||がResultやOptionで使えるようになればtryブロックはともかくlabeled breakは使われなくなるよ
2023/02/12(日) 12:02:26.70ID:UeaSFBcM
短絡でブロック式がすべて死滅するとは思えないからラベル指定breakも死滅しないだろうな
ブロック式が途中で抜けられるようになっただけなんだし、ブロック式書いてて途中で式の値を確定したくなったらラベル指定breakの出番
2023/02/12(日) 12:03:19.48ID:FD3ztQVR
>>582
それらを使えると>>571の例はどんな風に書き換えられるの?
2023/02/12(日) 12:09:09.65ID:KAxOFwBs
50行や100行を超えるような関数を書いても何も感じない流派の人と
10行以下でもリファクタリングの要否を検討するような流派の人とでは
審美眼というか根本的な価値観が違うから
お互いスタンスの違いを認識しないと話が噛み合わないよ
2023/02/12(日) 12:17:07.80ID:mvDk5H0/
数ヵ月前にstabledに入ってる機能とRFCすらマージされてないプロポーザルを比較するのって
捕らぬ狸の皮算用って奴じゃないですかね
2023/02/12(日) 12:18:39.30ID:wxFdc7Z6
>>581
例えば>>571って大域脱出なのか?
無駄なループを回らないために早期離脱しているだけに見える
それがアンチパターンだと主張するならばどうやって無駄なループを回避するんだ?
2023/02/12(日) 12:25:29.24ID:haDD5+eS
>>580
let ij = (0..100)
.cartesian_product(-1..100)
.find(|&(i, j)| if j == -1 { f(i) } else { g(i, j) });
match ij {
Some((i, -1)) => ff(i),
Some((i, j)) => gg(i, j),
_ => 0,
}

結局やってることはfindして結果に関数適用してるだけだよね
2023/02/12(日) 12:36:57.63ID:UeaSFBcM
>>588
>>571 の方が遥かにマシで草
2023/02/12(日) 12:46:08.97ID:Im2qSh0/
>>588
それ動くけど
イテレータをi依存にされたり
判定方法を変えられたらすぐに破綻しちゃうな
さらに可読性がない上に保守性もない
そのコードは失格
2023/02/12(日) 12:48:00.42ID:3RfSmBLj
他の書き方があるって主張は不要論になってないんだよな
ラベルbreakってシンタックスシュガーでしかないから
もともと実現方法があるのは当然

ある処理においてよりシンプルで学習コストが低い記法があれば
その処理では不要と言える
2023/02/12(日) 12:48:51.92ID:mvDk5H0/
f, g, ff, gg の要求する型がu8で上限値が128だったら
2023/02/12(日) 12:52:28.45ID:mvDk5H0/
>>590
判定方法変わらなくても>>592で終了

自然数しか出てこないコードに突然勝手に負数を導入し出すあたりJS畑から来たのかな
2023/02/12(日) 12:56:01.59ID:b/cm1PRG
>>587
・ パターンとして分類するとアンチパターンの範疇に入る
・ しかし必要な場面もある (からマシな方法としてラベル付きブレークが導入された)
2023/02/12(日) 13:07:40.20ID:g76UXZf8
適材適所を無視して何でもイテレータメソッドチェーンにしようとする人たちはたまにいるけど
多重ループで条件により早期で抜けたり何段かまとめて抜けたりする時は>>571のように素直に多重forまたはloopが分かりやすい
loop式だとそれ自体もbreakで値を返せるようになるがどの段のloopを抜けるかでラベル指定breakは今までも使われてきた
だからラベル付きブロック式にも違和感ないが拒否反応を示してる人は技術的ではなく感情的になっているだけではないかと思われる
2023/02/12(日) 13:13:11.85ID:g76UXZf8
>>594
多重ループを早期で抜けるのがアンチパターンとは聞いたことがない
最近の多くの言語が持っているラベル付きbreakがC/C++は持っていないため多段抜けが出来なくてやむを得ずに状態変数管理することはあるが
それはC/C++言語の制約であり言語仕様が弱いだけなのでそこでの習慣に引っ張られてはいけない
2023/02/12(日) 13:46:03.52ID:9lLsDKa7
論点1(578):>>571はアンチパターンなのか?
論点2(587):>>571って大域脱出なのか?
論点3(589):>>588 vs >>571 どっちがマシか?
2023/02/12(日) 14:21:36.76ID:whQzGPWc
そんなに拘るのにID変わりやすい環境ならコテつけて
2023/02/12(日) 14:40:41.70ID:FQ3NjXFA
>>585
どちらかというと
What中心でコードを構成する人と
How中心でコードを構成する人の考え方の違いじゃないか?
2023/02/12(日) 14:52:22.89ID:b/cm1PRG
>>596
私が >>581 で述べている「両立する」ってところを無視しないでくれ。
(形式としては) 多重ループからの脱出が大域脱出でありアンチパターンであることと
ラベル付きブレークが (回りくどいフラグ管理や goto より) マシな解決方法であるというのは両立すると言ってるんだ。
2023/02/12(日) 15:03:13.37ID:g76UXZf8
>>600
代替策を示さずにアンチパターンだと唱えるのをそろそろ辞めにしよう
多重ループから脱出しないコードを示してくれ
2023/02/12(日) 15:09:50.74ID:b/cm1PRG
>>601
「形式として」と念押ししてるんだから実態はそうではないというニュアンスを読み取ってくれ。
2023/02/12(日) 15:11:42.38ID:9lLsDKa7
そもそも大域脱出とやらの定義はどこに示されてるの?

https://www.gnu.org/software/libc/manual/html_node/Non_002dLocal-Exits.html
> 23 Non-Local Exits
> Sometimes when your program detects an unusual situation inside a deeply nested set of function calls,
> you would like to be able to immediately return to an outer level of control.
> This section describes how you can do such non-local exits using the setjmp and longjmp functions.

GNUの文書では単にネストした関数から一気に脱出することだけど?
このスレの文脈としては何か別の特別な定義を参照してるの?
2023/02/12(日) 15:14:46.65ID:b/cm1PRG
言い換えると、
形式としてアンチパターンであるが故にアンチパターンと同等の書き方を強いられていたことに
対する解決 (のひとつ) がラベル付きブレークだろうってこと。
2023/02/12(日) 15:17:29.13ID:g76UXZf8
>>602
多重ループからの脱出を形式として優れていると主張するならばわかるが
良き代替策もないのにアンチパターンだと主張するのは意味不明でありそんな主張はほかでも聞いたことがない
2023/02/12(日) 15:21:15.66ID:19IYgGC6
アンチパターンなのに解決方法とか自分で言ってて違和感感じないの?
それともアンチパターンだけど必要悪とでも言うのかな?
2023/02/12(日) 15:35:28.40ID:bSKw2z5T
アンチパターンとなりうる大域脱出とは、関数呼び出しの奥深く、すなわちスタックレベルの異なる位置からの脱出を指す
一方で、ループやブロックのbreakは同じスタックレベルの出来事であり、当然ながらアンチパターンには該当しない
2023/02/12(日) 16:02:50.83ID:CU5K+MKe
アンチパターンの定義も大域脱出の定義もどうでもいいけど
-1を特別なダミー値として-1だったら条件変えてfindとかいうゴミカスクソコードよりは多重ループとbreakの方が遥かにマシなのは間違いない
2023/02/12(日) 16:27:13.73ID:haDD5+eS
>>592
>>608
気になるならOption<u8>に変えればいいし、それで大した差なんてないよ
ちょっとRangeで楽できなくなるだけ
それくらいすぐ分かってくれ
2023/02/12(日) 16:30:50.77ID:3RfSmBLj
そういうやりとりしなきゃいかん時点でもうラベルブレークのほうがマシやん
2023/02/12(日) 16:39:36.79ID:b/cm1PRG
>>606
「パターンとして分類すると」「形式としては」アンチパターンに当てはまるだろう (実態はそうではない) と言ってる。
要するにアンチパターンではないと言ってるつもりなんだけど。
2023/02/12(日) 16:40:20.30ID:U4JchgwQ
>>609
どんどんコードがガチャガチャ読みにくくなっていくので素直に多重ループとbreakしますね
2023/02/12(日) 16:58:29.66ID:19IYgGC6
>>611
自分が
>>581 > 大域脱出自体がアンチパターンではあるが
と書いたことも忘れたのか?
そもそも形式的とかオレオレ定義の用語で語られても困るし
2023/02/12(日) 17:20:45.22ID:sgmbYDnN
デバッガにかけることを考えたらたかが十数行に収まる二重ループを直積という抽象化で隠蔽するより二重ループのまま見せた方がいいよね
直積として宣言的に書こうが結局プログラムは手続きとして実行されるので、過度な抽象化は手続きに展開する思考コストがかかるだけ
2023/02/12(日) 17:28:15.80ID:9lLsDKa7
> 大域脱出自体がアンチパターン

制御フローの代わりに例外使っちゃなんね!
ばっちゃが言ってた!
しかし彼女は大域脱出すべてについてではなく
その用法について言及したにすぎないのであった
2023/02/12(日) 18:31:37.86ID:3PkLEVOp
「アンチパターン」に反応して急にレス増えすぎ

>>571がアンチパターンなのは多重ループから大域脱出してるからじゃない
多重ループを使った探索と探索で見つからなかった場合の処理を分離できてないからアンチパターンなんだよ

ブロックのラベル付きbreakを無理矢理使おうとした創作コードだからそうなる
2023/02/12(日) 18:44:46.39ID:mi2a8+WT
>>616
forの中から帰るときは見つかった場合の処理で、
見つからずにfor文抜けたらデフォルト値を返すなんて処理プロダクトレベルで1億万回使われてるけど
2023/02/12(日) 19:14:49.93ID:mvDk5H0/
>>571 の分岐構造
f(i) がtrueならff(i)
g(i, j)がtrueならgg(i)
それ以外は0

>>588 の分岐構造
jが-1ならf(i)がtrueなら Some(i, -1)
jが-1以外でg(i, j)がtrueなら Some(i, j) ただし j != -1
jが-1以外でg(i, j)がfalseなら None

Some で j が-1 なら ff(i)
Some で j が -1 以外なら gg(i)
None なら 0

(^^;;
2023/02/12(日) 19:29:12.94ID:9lLsDKa7
論点578:>>571はアンチパターンなのか?
論点587:571って大域脱出なのか?
論点589:>>588 vs 571 どっちがマシか?
論点607:ループやブロックのbreakは大域脱出ではないし当然アンチパターンでもない
論点614:588 は過度な抽象化は手続きに展開する思考コストがかかるだけ
論点618:588 の分岐構造の煩雑さ(^^;;
2023/02/12(日) 20:39:11.84ID:g76UXZf8
>>616
代替策を示さずにアンチパターンだと主張するのをそろそろ辞めにしようぜ
まずは代わりのコードを示すべきだ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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