公式
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
591デフォルトの名無しさん
2023/02/12(日) 12:48:00.42ID:3RfSmBLj 他の書き方があるって主張は不要論になってないんだよな
ラベルbreakってシンタックスシュガーでしかないから
もともと実現方法があるのは当然
ある処理においてよりシンプルで学習コストが低い記法があれば
その処理では不要と言える
ラベルbreakってシンタックスシュガーでしかないから
もともと実現方法があるのは当然
ある処理においてよりシンプルで学習コストが低い記法があれば
その処理では不要と言える
592デフォルトの名無しさん
2023/02/12(日) 12:48:51.92ID:mvDk5H0/ f, g, ff, gg の要求する型がu8で上限値が128だったら
593デフォルトの名無しさん
2023/02/12(日) 12:52:28.45ID:mvDk5H0/594はちみつ餃子 ◆8X2XSCHEME
2023/02/12(日) 12:56:01.59ID:b/cm1PRG595デフォルトの名無しさん
2023/02/12(日) 13:07:40.20ID:g76UXZf8 適材適所を無視して何でもイテレータメソッドチェーンにしようとする人たちはたまにいるけど
多重ループで条件により早期で抜けたり何段かまとめて抜けたりする時は>>571のように素直に多重forまたはloopが分かりやすい
loop式だとそれ自体もbreakで値を返せるようになるがどの段のloopを抜けるかでラベル指定breakは今までも使われてきた
だからラベル付きブロック式にも違和感ないが拒否反応を示してる人は技術的ではなく感情的になっているだけではないかと思われる
多重ループで条件により早期で抜けたり何段かまとめて抜けたりする時は>>571のように素直に多重forまたはloopが分かりやすい
loop式だとそれ自体もbreakで値を返せるようになるがどの段のloopを抜けるかでラベル指定breakは今までも使われてきた
だからラベル付きブロック式にも違和感ないが拒否反応を示してる人は技術的ではなく感情的になっているだけではないかと思われる
596デフォルトの名無しさん
2023/02/12(日) 13:13:11.85ID:g76UXZf8 >>594
多重ループを早期で抜けるのがアンチパターンとは聞いたことがない
最近の多くの言語が持っているラベル付きbreakがC/C++は持っていないため多段抜けが出来なくてやむを得ずに状態変数管理することはあるが
それはC/C++言語の制約であり言語仕様が弱いだけなのでそこでの習慣に引っ張られてはいけない
多重ループを早期で抜けるのがアンチパターンとは聞いたことがない
最近の多くの言語が持っているラベル付きbreakがC/C++は持っていないため多段抜けが出来なくてやむを得ずに状態変数管理することはあるが
それはC/C++言語の制約であり言語仕様が弱いだけなのでそこでの習慣に引っ張られてはいけない
597デフォルトの名無しさん
2023/02/12(日) 13:46:03.52ID:9lLsDKa7598デフォルトの名無しさん
2023/02/12(日) 14:21:36.76ID:whQzGPWc そんなに拘るのにID変わりやすい環境ならコテつけて
599デフォルトの名無しさん
2023/02/12(日) 14:40:41.70ID:FQ3NjXFA600はちみつ餃子 ◆8X2XSCHEME
2023/02/12(日) 14:52:22.89ID:b/cm1PRG601デフォルトの名無しさん
2023/02/12(日) 15:03:13.37ID:g76UXZf8602はちみつ餃子 ◆8X2XSCHEME
2023/02/12(日) 15:09:50.74ID:b/cm1PRG >>601
「形式として」と念押ししてるんだから実態はそうではないというニュアンスを読み取ってくれ。
「形式として」と念押ししてるんだから実態はそうではないというニュアンスを読み取ってくれ。
603デフォルトの名無しさん
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の文書では単にネストした関数から一気に脱出することだけど?
このスレの文脈としては何か別の特別な定義を参照してるの?
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の文書では単にネストした関数から一気に脱出することだけど?
このスレの文脈としては何か別の特別な定義を参照してるの?
604はちみつ餃子 ◆8X2XSCHEME
2023/02/12(日) 15:14:46.65ID:b/cm1PRG 言い換えると、
形式としてアンチパターンであるが故にアンチパターンと同等の書き方を強いられていたことに
対する解決 (のひとつ) がラベル付きブレークだろうってこと。
形式としてアンチパターンであるが故にアンチパターンと同等の書き方を強いられていたことに
対する解決 (のひとつ) がラベル付きブレークだろうってこと。
605デフォルトの名無しさん
2023/02/12(日) 15:17:29.13ID:g76UXZf8606デフォルトの名無しさん
2023/02/12(日) 15:21:15.66ID:19IYgGC6 アンチパターンなのに解決方法とか自分で言ってて違和感感じないの?
それともアンチパターンだけど必要悪とでも言うのかな?
それともアンチパターンだけど必要悪とでも言うのかな?
607デフォルトの名無しさん
2023/02/12(日) 15:35:28.40ID:bSKw2z5T アンチパターンとなりうる大域脱出とは、関数呼び出しの奥深く、すなわちスタックレベルの異なる位置からの脱出を指す
一方で、ループやブロックのbreakは同じスタックレベルの出来事であり、当然ながらアンチパターンには該当しない
一方で、ループやブロックのbreakは同じスタックレベルの出来事であり、当然ながらアンチパターンには該当しない
608デフォルトの名無しさん
2023/02/12(日) 16:02:50.83ID:CU5K+MKe アンチパターンの定義も大域脱出の定義もどうでもいいけど
-1を特別なダミー値として-1だったら条件変えてfindとかいうゴミカスクソコードよりは多重ループとbreakの方が遥かにマシなのは間違いない
-1を特別なダミー値として-1だったら条件変えてfindとかいうゴミカスクソコードよりは多重ループとbreakの方が遥かにマシなのは間違いない
609デフォルトの名無しさん
2023/02/12(日) 16:27:13.73ID:haDD5+eS610デフォルトの名無しさん
2023/02/12(日) 16:30:50.77ID:3RfSmBLj そういうやりとりしなきゃいかん時点でもうラベルブレークのほうがマシやん
611はちみつ餃子 ◆8X2XSCHEME
2023/02/12(日) 16:39:36.79ID:b/cm1PRG612デフォルトの名無しさん
2023/02/12(日) 16:40:20.30ID:U4JchgwQ >>609
どんどんコードがガチャガチャ読みにくくなっていくので素直に多重ループとbreakしますね
どんどんコードがガチャガチャ読みにくくなっていくので素直に多重ループとbreakしますね
613デフォルトの名無しさん
2023/02/12(日) 16:58:29.66ID:19IYgGC6614デフォルトの名無しさん
2023/02/12(日) 17:20:45.22ID:sgmbYDnN デバッガにかけることを考えたらたかが十数行に収まる二重ループを直積という抽象化で隠蔽するより二重ループのまま見せた方がいいよね
直積として宣言的に書こうが結局プログラムは手続きとして実行されるので、過度な抽象化は手続きに展開する思考コストがかかるだけ
直積として宣言的に書こうが結局プログラムは手続きとして実行されるので、過度な抽象化は手続きに展開する思考コストがかかるだけ
615デフォルトの名無しさん
2023/02/12(日) 17:28:15.80ID:9lLsDKa7 > 大域脱出自体がアンチパターン
制御フローの代わりに例外使っちゃなんね!
ばっちゃが言ってた!
しかし彼女は大域脱出すべてについてではなく
その用法について言及したにすぎないのであった
制御フローの代わりに例外使っちゃなんね!
ばっちゃが言ってた!
しかし彼女は大域脱出すべてについてではなく
その用法について言及したにすぎないのであった
616デフォルトの名無しさん
2023/02/12(日) 18:31:37.86ID:3PkLEVOp 「アンチパターン」に反応して急にレス増えすぎ
>>571がアンチパターンなのは多重ループから大域脱出してるからじゃない
多重ループを使った探索と探索で見つからなかった場合の処理を分離できてないからアンチパターンなんだよ
ブロックのラベル付きbreakを無理矢理使おうとした創作コードだからそうなる
>>571がアンチパターンなのは多重ループから大域脱出してるからじゃない
多重ループを使った探索と探索で見つからなかった場合の処理を分離できてないからアンチパターンなんだよ
ブロックのラベル付きbreakを無理矢理使おうとした創作コードだからそうなる
617デフォルトの名無しさん
2023/02/12(日) 18:44:46.39ID:mi2a8+WT618デフォルトの名無しさん
2023/02/12(日) 19:14:49.93ID:mvDk5H0/619デフォルトの名無しさん
2023/02/12(日) 19:29:12.94ID:9lLsDKa7620デフォルトの名無しさん
2023/02/12(日) 20:39:11.84ID:g76UXZf8621デフォルトの名無しさん
2023/02/12(日) 22:47:32.75ID:GPArZ08q let result = collection.find_foo().unwrap_or(bar);
find_fooの中で多重ループ使おうがイテレータ使おうがそれは状況に合わせて使い分ければいい
大事なのは適切な単位で処理に意味ある名前をつけて”意図”を伝えるコードを書くこと
特に多重ループで大域脱出させるような処理に名前も付けずダラダラ書くスタイルはRustのような言語では基本的にやっちゃダメ
find_fooの中で多重ループ使おうがイテレータ使おうがそれは状況に合わせて使い分ければいい
大事なのは適切な単位で処理に意味ある名前をつけて”意図”を伝えるコードを書くこと
特に多重ループで大域脱出させるような処理に名前も付けずダラダラ書くスタイルはRustのような言語では基本的にやっちゃダメ
622デフォルトの名無しさん
2023/02/12(日) 22:50:21.83ID:GPArZ08q623デフォルトの名無しさん
2023/02/12(日) 23:10:06.96ID:bSKw2z5T >>616
機能分離の粒度や方法は決まった正確が一つあるものではなく、状況に応じて基準も変わるし、複数の解があり選べることも多い
したがって、処理を分離したコードの方が明らかに望ましいと誰もが思う場合でないと、アンチパターンと言い切るのは過度だと言える
今回の>>571を、探索(=インデックスを得る)機能部分のみに分離できるのはご指摘の通りだが、コードはこうなる
let (i, j) = 'i_j: {
for i in 0..100 {
if f(i) {
break 'i_j (Some(i), None)
}
for j in 0.100 {
if g(i, j) {
break 'i_j (Some(i), Some(j))
}
}
}
(None, None)
};
元のコードと比べると、構造も行数も変わっておらず、さらに加えてこの後にmatch (i, j)の処理コードが必要となる
したがって、今回のケースで機能分離するかどうかは好みの範囲であり、元のコードに問題はないと言える
機能分離の粒度や方法は決まった正確が一つあるものではなく、状況に応じて基準も変わるし、複数の解があり選べることも多い
したがって、処理を分離したコードの方が明らかに望ましいと誰もが思う場合でないと、アンチパターンと言い切るのは過度だと言える
今回の>>571を、探索(=インデックスを得る)機能部分のみに分離できるのはご指摘の通りだが、コードはこうなる
let (i, j) = 'i_j: {
for i in 0..100 {
if f(i) {
break 'i_j (Some(i), None)
}
for j in 0.100 {
if g(i, j) {
break 'i_j (Some(i), Some(j))
}
}
}
(None, None)
};
元のコードと比べると、構造も行数も変わっておらず、さらに加えてこの後にmatch (i, j)の処理コードが必要となる
したがって、今回のケースで機能分離するかどうかは好みの範囲であり、元のコードに問題はないと言える
624デフォルトの名無しさん
2023/02/13(月) 10:01:54.27ID:tHaQAGDN >>621
>処理に意味ある名前をつけて”意図”を伝えるコードを書くこと
つまりラベル付きブロックでいいよね
現代的なエディタならブロックは折り畳めばいいし、ラベルで名前もつけられるし
何より型推論と?演算子に任せれば済むような非本質的なエラー型の合成というノイズをメインロジックから分離できて"意図"が伝わりやすくなるので
>処理に意味ある名前をつけて”意図”を伝えるコードを書くこと
つまりラベル付きブロックでいいよね
現代的なエディタならブロックは折り畳めばいいし、ラベルで名前もつけられるし
何より型推論と?演算子に任せれば済むような非本質的なエラー型の合成というノイズをメインロジックから分離できて"意図"が伝わりやすくなるので
625デフォルトの名無しさん
2023/02/13(月) 12:37:14.05ID:+RNuQxOU >>572の比較表に付け加えるとこんな感じか
関数化:
〇機能名の明示 (関数名)
×利用する変数(値)と結果の型推論
〇変数、ライフタイムのスコープ
×環境(変数)のキャプチャ
〇早期脱出
×?演算子のエスカレーション・合成
ラベル付きブロック式:
〇機能名の明示 (ラベル名)
〇利用する変数(値)と結果の型推論
〇変数、ライフタイムのスコープ
〇環境(変数)のキャプチャ
〇早期脱出
〇?演算子のエスカレーション・合成
関数化:
〇機能名の明示 (関数名)
×利用する変数(値)と結果の型推論
〇変数、ライフタイムのスコープ
×環境(変数)のキャプチャ
〇早期脱出
×?演算子のエスカレーション・合成
ラベル付きブロック式:
〇機能名の明示 (ラベル名)
〇利用する変数(値)と結果の型推論
〇変数、ライフタイムのスコープ
〇環境(変数)のキャプチャ
〇早期脱出
〇?演算子のエスカレーション・合成
626デフォルトの名無しさん
2023/02/13(月) 13:43:55.80ID:rVD9qCig 関数の特徴としては、
○コード記述箇所と実行箇所の分離
○再入可能性
というのがあるな。
まぁ、ブロックは記述箇所と密接に関係しているから当然の話だけど。
○コード記述箇所と実行箇所の分離
○再入可能性
というのがあるな。
まぁ、ブロックは記述箇所と密接に関係しているから当然の話だけど。
627デフォルトの名無しさん
2023/02/13(月) 13:50:02.53ID:7ltGU2tW ブロック式はその場でしか呼ばれないから再入可能性はそもそも必要ないね
そしてブロック式がある関数として再入可能性を保証でいいわけだから
そしてブロック式がある関数として再入可能性を保証でいいわけだから
628デフォルトの名無しさん
2023/02/13(月) 16:19:13.75ID:nVAb+0uo >>623
そういうループを使う現実的なユースケースは
通常の多次元データではなくフォルダとファイルのようなCompositeデータを扱うときだけなので
インナーループから返す値にはiを必要とせずSome(j)で十分になるように作る
もしそれができない場合でも(Some(i), None)はSome(i)に(Some(i), Some(j)はSome(f(i,j))に変換できるようにする
そういうループを使う現実的なユースケースは
通常の多次元データではなくフォルダとファイルのようなCompositeデータを扱うときだけなので
インナーループから返す値にはiを必要とせずSome(j)で十分になるように作る
もしそれができない場合でも(Some(i), None)はSome(i)に(Some(i), Some(j)はSome(f(i,j))に変換できるようにする
629デフォルトの名無しさん
2023/02/13(月) 16:27:32.48ID:7ltGU2tW >>628
勝手に様々な特殊なケースのみに限定して話をしても全く意味がない
さらに二次元インデックスi,jをjだけに折り畳めるという特殊な仮定を持ち出すのも意味がない
そしてインデックスを返す機能の話をしているのにf(i,j)を持ち出すのも意味不明すぎる
勝手に様々な特殊なケースのみに限定して話をしても全く意味がない
さらに二次元インデックスi,jをjだけに折り畳めるという特殊な仮定を持ち出すのも意味がない
そしてインデックスを返す機能の話をしているのにf(i,j)を持ち出すのも意味不明すぎる
630デフォルトの名無しさん
2023/02/13(月) 16:46:00.57ID:2YgC8DLe >>624
let message = 'get_latest_unread_message {
…
break 'get_latest_unread_message Some(Foo::foo_bar(result)
…
};
とか書くわけ?
let message = 'get_latest_unread_message {
…
break 'get_latest_unread_message Some(Foo::foo_bar(result)
…
};
とか書くわけ?
631デフォルトの名無しさん
2023/02/13(月) 16:47:27.73ID:CaM3JzLc >>629
具体的なユースケース出せないなら話にならないよ
具体的なユースケース出せないなら話にならないよ
632デフォルトの名無しさん
2023/02/13(月) 16:53:40.18ID:7ltGU2tW633デフォルトの名無しさん
2023/02/13(月) 17:52:42.13ID:KPSnAIKi そもそもラベルいらんよね?(構文上必要なんだろうけど?)
ブロックに区別が必要ない場合は
>>630を例に取ると
let latest_unread_message = 'b { // 変数名がブロックが返す値を表現
break 'b Some(Foo::foo_bar(result)) // 具体例はbreak以降に表現
};
ブロックが二重三重になってるときだけそれを区別したいだけであって?
ブロックに区別が必要ない場合は
>>630を例に取ると
let latest_unread_message = 'b { // 変数名がブロックが返す値を表現
break 'b Some(Foo::foo_bar(result)) // 具体例はbreak以降に表現
};
ブロックが二重三重になってるときだけそれを区別したいだけであって?
634デフォルトの名無しさん
2023/02/13(月) 17:53:01.42ID:Qnq91utV635デフォルトの名無しさん
2023/02/13(月) 18:03:44.02ID:JcsLcJKH >>634
ブロックは関数と異なりリエントラントの必要性も概念もない
ブロックは関数内のその場所で呼ばれるだけだから他から不意打ちで呼ばれる対策も必要ない
ブロックが所属する関数がリエントラントを保証しているから大丈夫
そしてブロックのメリットは環境変数をそのままキャプチャできて型宣言は必要なくブロック式の結果も型推論されること
さらに?オペレータがifやmatchやループの時と同様にブロックを飛び越えてくれるからResultを気にせずに値だけの型に専念できる
ブロックは関数と異なりリエントラントの必要性も概念もない
ブロックは関数内のその場所で呼ばれるだけだから他から不意打ちで呼ばれる対策も必要ない
ブロックが所属する関数がリエントラントを保証しているから大丈夫
そしてブロックのメリットは環境変数をそのままキャプチャできて型宣言は必要なくブロック式の結果も型推論されること
さらに?オペレータがifやmatchやループの時と同様にブロックを飛び越えてくれるからResultを気にせずに値だけの型に専念できる
636デフォルトの名無しさん
2023/02/13(月) 18:08:53.41ID:Qnq91utV >>633
なるほどね
いっそラベルをretとかにしてしまえばクロージャっぽく見えるのか
let latest_unread_message = 'ret {
break 'ret Some(Foo::foo_bar(result))
};
なるほどね
いっそラベルをretとかにしてしまえばクロージャっぽく見えるのか
let latest_unread_message = 'ret {
break 'ret Some(Foo::foo_bar(result))
};
637デフォルトの名無しさん
2023/02/13(月) 22:41:07.13ID:JXuTOJyN うーん、それは....ちょっと
638デフォルトの名無しさん
2023/02/14(火) 06:32:02.86ID:ltJvnJsS >>633
ラベルは必要
ラベルが付いてるブロック内でのみラベル指定breakができる
例えばforの中でmatchでアーム右辺が無名ブロックで無名breakしている既存のコードはそのブロックをbreakせずforをbreakする
しかしそれら全体がラベル付ブロックに覆われていてラベル付breakしていればラベル付ブロックをbreakできる
既存コードと互換性があり曖昧さもなく良い構文となっている
既存のloop構文からloopキーワードを抜いただけの構文である点からも自然な受け入れやすい構文拡張となっている
ラベルは必要
ラベルが付いてるブロック内でのみラベル指定breakができる
例えばforの中でmatchでアーム右辺が無名ブロックで無名breakしている既存のコードはそのブロックをbreakせずforをbreakする
しかしそれら全体がラベル付ブロックに覆われていてラベル付breakしていればラベル付ブロックをbreakできる
既存コードと互換性があり曖昧さもなく良い構文となっている
既存のloop構文からloopキーワードを抜いただけの構文である点からも自然な受け入れやすい構文拡張となっている
639デフォルトの名無しさん
2023/02/15(水) 22:09:51.65ID:dlA09Lvs 同時に導入されたlet elseも便利やな
それまではif letするたびにネストがどんどん深くなっていって困るかそれを回避するために
let xxx = if let Some(xxx) = foo() { xxx } else ...と三度も変数名を書かされて悲惨だった
それまではif letするたびにネストがどんどん深くなっていって困るかそれを回避するために
let xxx = if let Some(xxx) = foo() { xxx } else ...と三度も変数名を書かされて悲惨だった
640デフォルトの名無しさん
2023/02/15(水) 23:56:03.48ID:9hF8ZQFZ どちらも長年Rustで構文的に残っていた不便な点だったから解決してうれしい
641デフォルトの名無しさん
2023/02/16(木) 09:41:25.47ID:0fEnHwU4 >>639
早速テストコードに使ったら、ifを除去出来て大変満足
早速テストコードに使ったら、ifを除去出来て大変満足
642デフォルトの名無しさん
2023/02/16(木) 10:43:33.51ID:BxoXWlO9 >>639
unwrap_orじゃダメなのか?
unwrap_orじゃダメなのか?
643デフォルトの名無しさん
2023/02/16(木) 11:19:26.94ID:2GpzUFcD644デフォルトの名無しさん
2023/02/16(木) 12:55:00.75ID:ioeTYM1H >>642
例えばこれは深さ3段だからギリだけど
どんどん深くなるのを早期continueしたい時にどうする?って話
環境問題などで別関数化も無しでね
for x in iter {
if let Some(boo) = get_boo(x) {
if let Some(foo) = get_foo(x) {
if let Some(woo) =get_woo(x) {
let pigs = three(boo, foo, woo);
...
}
}
}
}
例えばこれは深さ3段だからギリだけど
どんどん深くなるのを早期continueしたい時にどうする?って話
環境問題などで別関数化も無しでね
for x in iter {
if let Some(boo) = get_boo(x) {
if let Some(foo) = get_foo(x) {
if let Some(woo) =get_woo(x) {
let pigs = three(boo, foo, woo);
...
}
}
}
}
645デフォルトの名無しさん
2023/02/16(木) 14:44:50.54ID:IZbDt32x646デフォルトの名無しさん
2023/02/16(木) 14:59:14.48ID:ioeTYM1H >>645
それは無理
実際のコードだと全部揃ってから処理ではなく途中で処理しつつになる
さらにbreakによるfor抜けも入ったりする
さらに使う環境が多くてその別関数へ参照渡しまくりになる
さらに途中でエラーも返るから別関数はOptionではなくResult返しになる
つまり?はOptionに対して直接使えない
それは無理
実際のコードだと全部揃ってから処理ではなく途中で処理しつつになる
さらにbreakによるfor抜けも入ったりする
さらに使う環境が多くてその別関数へ参照渡しまくりになる
さらに途中でエラーも返るから別関数はOptionではなくResult返しになる
つまり?はOptionに対して直接使えない
647デフォルトの名無しさん
2023/02/16(木) 15:15:34.23ID:PGUS078z goto >>459;
648デフォルトの名無しさん
2023/02/16(木) 16:37:34.02ID:IOzJHldp 関数を分けると?を逃がすことが出来なくなる点など含めて
ラベル付ブロック式の時と同じ話だな
いずれにせよ関数化は愚策でありlet elseによりcontinueするのが正解
ラベル付ブロック式の時と同じ話だな
いずれにせよ関数化は愚策でありlet elseによりcontinueするのが正解
649デフォルトの名無しさん
2023/02/16(木) 17:21:40.49ID:PicohMyE 無限ループってこわくね?
650デフォルトの名無しさん
2023/02/16(木) 17:31:08.98ID:IOzJHldp continueはforでnext()に進んで無限ループじゃないぞ
651デフォルトの名無しさん
2023/02/16(木) 18:48:57.26ID:ipVwq1cH ちゃんとしたプログラマーは無限ループになりそうなところはブレークMAXカウンターやシグナルブレイク出来るように書いてるから大丈夫ですYO!
652デフォルトの名無しさん
2023/02/16(木) 21:14:40.29ID:ioeTYM1H サーバーやデーモンなどは同じことを繰り返せるように敢えて無限ループにプログラミングする
653デフォルトの名無しさん
2023/02/16(木) 22:57:51.48ID:Pjf9kdf2 >>646
なるほどResult<Option<T>>でOptionだけハンドリングしたいパターンならif let使えばネストしていくわな
普通にmatch使えばいい場面だと思うんだが何かlet else使うメリットがあるの?
なるほどResult<Option<T>>でOptionだけハンドリングしたいパターンならif let使えばネストしていくわな
普通にmatch使えばいい場面だと思うんだが何かlet else使うメリットがあるの?
654デフォルトの名無しさん
2023/02/16(木) 23:01:01.44ID:ioeTYM1H655デフォルトの名無しさん
2023/02/16(木) 23:07:53.84ID:Pjf9kdf2 ああif letの結果を受けるように書くからってことね
それ普通は使わないよね
それ普通は使わないよね
656デフォルトの名無しさん
2023/02/16(木) 23:15:48.94ID:Pjf9kdf2 let foo = match get_foo(x)? { Some(x) => x, None => continue} が
let Some(foo) = get_foo(x)? else { continue };になると行数が短くなってうれしいということ?
let Some(foo) = get_foo(x)? else { continue };になると行数が短くなってうれしいということ?
657デフォルトの名無しさん
2023/02/16(木) 23:15:53.10ID:IOzJHldp matchを使おうが元の問題これ何も解決しなくね?
>> let xxx = if let Some(xxx) = foo() { xxx } else ...と三度も変数名を書かされて悲惨だった
>> let xxx = if let Some(xxx) = foo() { xxx } else ...と三度も変数名を書かされて悲惨だった
658デフォルトの名無しさん
2023/02/16(木) 23:17:38.28ID:Pjf9kdf2 Someの中の文字は何でもいいんだから短いスコープなら同じ名前を律儀に書く必要ない
659デフォルトの名無しさん
2023/02/16(木) 23:29:57.12ID:IOzJHldp 変数名短くしても結局3度も書かされるのは異常で改善の余地あり
それが1度で済むようになってようやく正常化した
それが1度で済むようになってようやく正常化した
660デフォルトの名無しさん
2023/02/17(金) 00:34:38.77ID:g5yjih40 swiftのようにguard let ~ elseとしてくれれば
行頭見るだけでguardだとわかって良かったのにな
少し複雑なパターンマッチだとelseが埋もれてしまう
行頭見るだけでguardだとわかって良かったのにな
少し複雑なパターンマッチだとelseが埋もれてしまう
661デフォルトの名無しさん
2023/02/17(金) 07:21:19.98ID:pJPZoXSu 冒頭だけで分かるよ
let x = ... ←通常
let Some(x) = ... ←elseあり
let x = ... ←通常
let Some(x) = ... ←elseあり
662デフォルトの名無しさん
2023/02/17(金) 08:35:50.31ID:oqEBt+Sx if let って可読性悪くない?
663デフォルトの名無しさん
2023/02/17(金) 08:45:48.10ID:pJPZoXSu664デフォルトの名無しさん
2023/02/17(金) 10:34:35.45ID:narJLpuR >>661
let Foo { bar, baz, … } = get_woo?.map_or_else(Bar::default(), |x| …
let Foo { bar, baz, … } = get_woo?.map_or_else(Bar::default(), |x| …
665デフォルトの名無しさん
2023/02/17(金) 10:59:52.09ID:pJPZoXSu >>664
その観点からはRustではrefutableなのかirrefutableなのかが一番重要な概念になる
噛み砕いて言うと条件付マッチングとなるのがrefutableで無条件マッチングとなるのがirrefutable
Foo { bar, baz, … }はirrefutableパターンだから普通のlet
Some(foo)はrefutableパターンだからif letかlet else
その観点からはRustではrefutableなのかirrefutableなのかが一番重要な概念になる
噛み砕いて言うと条件付マッチングとなるのがrefutableで無条件マッチングとなるのがirrefutable
Foo { bar, baz, … }はirrefutableパターンだから普通のlet
Some(foo)はrefutableパターンだからif letかlet else
666デフォルトの名無しさん
2023/02/17(金) 11:46:57.46ID:AiGqT1ly667デフォルトの名無しさん
2023/02/17(金) 12:26:34.10ID:pJPZoXSu >>666
letについては既に説明した通り
それはFooとBarは型が異なりエラー
型の一致は必須
struct内の略は...と3つでなく..と2つ
Bar::default()の()は付けてはいけない
型の明示が必要ないならDefault::defaultでもよい
map_or_else(Default::default, |x| …)は
map(|x| …).unwrap_or_default()と書ける
letについては既に説明した通り
それはFooとBarは型が異なりエラー
型の一致は必須
struct内の略は...と3つでなく..と2つ
Bar::default()の()は付けてはいけない
型の明示が必要ないならDefault::defaultでもよい
map_or_else(Default::default, |x| …)は
map(|x| …).unwrap_or_default()と書ける
668デフォルトの名無しさん
2023/02/17(金) 14:50:20.18ID:wLSY0vNu >>667
はい残念
はい残念
669デフォルトの名無しさん
2023/02/17(金) 21:38:02.32ID:qS+nEFWX670デフォルトの名無しさん
2023/02/17(金) 21:58:40.37ID:pGfl58kH let elseが需要の隙間を埋めてくれた
671デフォルトの名無しさん
2023/02/17(金) 22:52:21.88ID:v1GT8Jf5 letするたびにインデントが深くなる言語もあるぞ
そういう失敗を記憶しているおかげで、比較的成功した例を認識できる
そういう失敗を記憶しているおかげで、比較的成功した例を認識できる
672デフォルトの名無しさん
2023/02/17(金) 23:13:25.95ID:bvL2FhCi let elseはシンプルなケースじゃないと通常のletと見分けがつきにくい
でもシンプルなケースならlet chainでまとめた方が圧倒的に可読性高まるのでいらない子になりそう
でもシンプルなケースならlet chainでまとめた方が圧倒的に可読性高まるのでいらない子になりそう
673デフォルトの名無しさん
2023/02/18(土) 00:32:34.89ID:y3OKvOKg 最初見たとき便利そうだな思ったけど意外と使わない let else
? とか unwrap_or_elseとかで事足りることが多い
あって困るような機能でもないけど
? とか unwrap_or_elseとかで事足りることが多い
あって困るような機能でもないけど
674デフォルトの名無しさん
2023/02/18(土) 08:01:02.47ID:9aGkHdVC 論駁可能性の有無で区別つくし、elseによる処理文があるのだから、let elseが見分け付かないなんてことはない
if letと同様にlet elseはエラー値を捕獲する構文ではないため、エラー処理に用いないのは当たり前で、?を持ち出す人はその基本を理解できていない
マッチングしない時にcontinueやbreakする時などは、特にlet elseが最も適している
if letと同様にlet elseはエラー値を捕獲する構文ではないため、エラー処理に用いないのは当たり前で、?を持ち出す人はその基本を理解できていない
マッチングしない時にcontinueやbreakする時などは、特にlet elseが最も適している
675デフォルトの名無しさん
2023/02/18(土) 11:02:32.63ID:eA39OBZC たしかに
でもコンテニューやブレーク書くことが稀
でもコンテニューやブレーク書くことが稀
676デフォルトの名無しさん
2023/02/18(土) 18:28:41.55ID:rgzpiqjp やってることは同じ早期離脱なのに
新しいバインディングを伴う場合は
breakやcontinueならlet else
returnなら主に?かlet~match
新しいバインディングを伴わない場合はifかmatch
書くのは多少楽になってもこれだけ種類があると読みにくくなる
新しいバインディングを伴う場合は
breakやcontinueならlet else
returnなら主に?かlet~match
新しいバインディングを伴わない場合はifかmatch
書くのは多少楽になってもこれだけ種類があると読みにくくなる
677デフォルトの名無しさん
2023/02/18(土) 18:44:10.63ID:57MjTJJD if letを廃止してmatchだけに統合すればすっきりする
match boolでifも廃止できる
breakとcontinueもmatch boolで括れば済むから廃止できる
match boolでifも廃止できる
breakとcontinueもmatch boolで括れば済むから廃止できる
678デフォルトの名無しさん
2023/02/18(土) 20:05:29.88ID:OvD/kb5O >>677
それだと'outer指定ができなくないか?
それだと'outer指定ができなくないか?
679デフォルトの名無しさん
2023/02/18(土) 20:16:45.16ID:57MjTJJD C/C++は多重forの多重breakを持たないが状態変数などで工夫して対応できている
680デフォルトの名無しさん
2023/02/18(土) 20:28:10.99ID:c4QxGie2 状態変数とか使うぐらいならgotoの方がマシだろ
681デフォルトの名無しさん
2023/02/18(土) 20:45:44.21ID:OvD/kb5O682デフォルトの名無しさん
2023/02/18(土) 20:59:41.48ID:1haq86HP いや、工夫する方が正解という信念とかは持ってなさそう
正解なんてあるわけないという結論から逆算されたムーブじゃないか
正解なんてあるわけないという結論から逆算されたムーブじゃないか
683デフォルトの名無しさん
2023/02/18(土) 21:04:06.66ID:8K7QiAfd684デフォルトの名無しさん
2023/02/18(土) 21:04:58.48ID:G2eRfhPC685デフォルトの名無しさん
2023/02/18(土) 21:28:03.45ID:1haq86HP デストラクタがあればgotoの少なくとも一部は許されないことが確定する
なければ雰囲気で決める
なければ雰囲気で決める
686デフォルトの名無しさん
2023/02/18(土) 23:00:33.44ID:6a86mZYj >>675
たまたま自分で使うことが稀だからといってcontinueやbreakを要らない子扱い?
たまたま自分で使うことが稀だからといってcontinueやbreakを要らない子扱い?
687デフォルトの名無しさん
2023/02/18(土) 23:56:17.68ID:95PypcL7 そりゃアルゴリズムは出来合いのものしか使いませんっていうならcontinueもbreakも使わんだろうな。
688デフォルトの名無しさん
2023/02/19(日) 00:00:34.67ID:LO/ZCfk/ なにさ!ループの中へジャンプしたっていいじゃない!
689デフォルトの名無しさん
2023/02/19(日) 00:36:19.05ID:PxbWEijT 昔みたいに関数を長々と書く時代じゃないから
breakやcontinueは関数抽出で不要になることが多くて出番がすごく少ないんだよ
breakやcontinueは関数抽出で不要になることが多くて出番がすごく少ないんだよ
690デフォルトの名無しさん
2023/02/19(日) 00:45:12.81ID:iJY+vHtr 100行関数の時代の反動で5行の処理でも関数切り出しする時代からのさらに揺り戻しで
最近はむしろ型推論に任せて明示的に型を書かないために全体が一望できる程度の30行ぐらいの関数は増えているので
breakもcontinueも普通によく見かける
最近はむしろ型推論に任せて明示的に型を書かないために全体が一望できる程度の30行ぐらいの関数は増えているので
breakもcontinueも普通によく見かける
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【🐼🇨🇳】「高市総理VS中国」で日本からパンダはゼロに? 上野動物園「パンダ返還期限」まであと3カ月… [BFU★]
- 「“なり得る”って言っただけだから…」高市早苗“存立危機”答弁後に漏らした本音 ★3 [Hitzeschleier★]
- 【速報】 米大使声明 「日本を支えていく」「中国が威圧的手段に訴えるのは断ち難い悪癖」 [お断り★]
- 歩道で93歳男性が女子大学生の自転車にはねられ意識不明 坂を下った先「気付いたときには目の前に」 [七波羅探題★]
- ネット殺到「高市総理の責任」「完全に高市リスク」「負けるな」中国が水産物輸入停止→流石に総理批判の声も「どう責任取る?」 ★5 [樽悶★]
- 中国が水産物の輸入停止、首相答弁撤回を要求…中国共産党機関紙「輸入停止は一つのシグナルにすぎない」 [ぐれ★]
- 高市コインまもなく158円 [931948549]
- 世界が中国と関係改善に向かう中、ただ一国で中国に立ち向かう勇猛果敢な日本人…これもうラストサムライだろ [452836546]
- 日本「中国のレアアースに71%依存してます。2024年のデータです」 ネトウヨ「え?youtube解説と違うんだけど」 [633746646]
- テレビ局各社が高市首相を一切批判せず中国批判を展開 安倍時代の報道完全復活 [633746646]
- 🍣にゃっはろ🌸~スシろ~🏡
- 高市ジャップやけど、正直、沖縄って日本ではないよな? [888298477]
