公式
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
490デフォルトの名無しさん
2023/02/10(金) 06:59:25.26ID:Fpp4vOr0491デフォルトの名無しさん
2023/02/10(金) 07:32:00.75ID:Fpp4vOr0 そしてRustがなぜ今回の構文の形を採用したか
・returnでもbreakでも多重になった時にどれを終えるのか曖昧になるため何らかの指定は必要
・ラベルによる指定はRustの他の構文でも共通に既に使われており親和性がある
・returnの使用は混乱を防ぐために関数とクロージャーから返る位置付けのみに保ちたい
・既存のloop式と今回の構文はloopキーワードを除けば全く同じであり導入前はloop式で代替されていた
・returnでもbreakでも多重になった時にどれを終えるのか曖昧になるため何らかの指定は必要
・ラベルによる指定はRustの他の構文でも共通に既に使われており親和性がある
・returnの使用は混乱を防ぐために関数とクロージャーから返る位置付けのみに保ちたい
・既存のloop式と今回の構文はloopキーワードを除けば全く同じであり導入前はloop式で代替されていた
492デフォルトの名無しさん
2023/02/10(金) 07:54:41.21ID:Fpp4vOr0 >>488
必要性に応じて関数として切り出すのも構わない
そして関数として分離した方が好ましい場合もあるだろう
しかし常に関数切り出しを強いられる言語だったとしたら煩雑すぎて機能不足と言えるから使い分けできることが必要
必要性に応じて関数として切り出すのも構わない
そして関数として分離した方が好ましい場合もあるだろう
しかし常に関数切り出しを強いられる言語だったとしたら煩雑すぎて機能不足と言えるから使い分けできることが必要
493デフォルトの名無しさん
2023/02/10(金) 08:05:40.53ID:nOIBi0US >>490
文脈読めなさ過ぎw
文脈読めなさ過ぎw
494デフォルトの名無しさん
2023/02/10(金) 08:18:49.59ID:Fpp4vOr0 >>493
従来からforやloop式で使われてきた早期return(離脱)つまりRustでのラベル指定break
そして今回Rust導入されたブロック式での早期return(離脱)つまり同様に構文としてはラベル指定break
それらに対して「ラベルでジャンプ」とは何を言いたいのか?
従来からforやloop式で使われてきた早期return(離脱)つまりRustでのラベル指定break
そして今回Rust導入されたブロック式での早期return(離脱)つまり同様に構文としてはラベル指定break
それらに対して「ラベルでジャンプ」とは何を言いたいのか?
495デフォルトの名無しさん
2023/02/10(金) 08:34:37.12ID:wb0Nj+xg >>485
短絡orに論理orを使うのは混乱の元だから、別の専用の記号を用意して欲しいわ。
短絡orに論理orを使うのは混乱の元だから、別の専用の記号を用意して欲しいわ。
496デフォルトの名無しさん
2023/02/10(金) 08:39:40.06ID:Fpp4vOr0497デフォルトの名無しさん
2023/02/10(金) 08:41:20.86ID:KiCBMwJT498デフォルトの名無しさん
2023/02/10(金) 08:50:58.78ID:Fpp4vOr0 関数切り出しすると
その中でも継続して使う変数(値)を参照として全て渡してそれらの型宣言も改めて行なってと煩雑さとコードの重複が大きい
もちろん返り値型も型推論で済まなくなり明確に宣言しなければならなくなる
したがって関数切り出しの方が明確にメリットが上回るケースを除いて
適材適所でブロック式で済ませられるようになった今回の導入は大きな意義があると思う
その中でも継続して使う変数(値)を参照として全て渡してそれらの型宣言も改めて行なってと煩雑さとコードの重複が大きい
もちろん返り値型も型推論で済まなくなり明確に宣言しなければならなくなる
したがって関数切り出しの方が明確にメリットが上回るケースを除いて
適材適所でブロック式で済ませられるようになった今回の導入は大きな意義があると思う
499デフォルトの名無しさん
2023/02/10(金) 09:14:00.68ID:8y57Q10t 関数切り出しじゃなくて、関数のネスト
500デフォルトの名無しさん
2023/02/10(金) 09:39:52.23ID:FTCkglUc501デフォルトの名無しさん
2023/02/10(金) 09:47:31.36ID:XC30Ey72502デフォルトの名無しさん
2023/02/10(金) 09:58:49.88ID:zTpuYOFQ 5年もの歳月を費やしてstabilizeするほど意味ある機能じゃないよな
超ニッチなnice to haveなんだからこんな機能実装するくらいなら他の作業してくれよ
超ニッチなnice to haveなんだからこんな機能実装するくらいなら他の作業してくれよ
503デフォルトの名無しさん
2023/02/10(金) 09:58:58.37ID:f/xkkyji504デフォルトの名無しさん
2023/02/10(金) 10:00:29.07ID:76BGvvFm505デフォルトの名無しさん
2023/02/10(金) 10:06:08.19ID:f/xkkyji >>500
forやloopを使ったときにどのbreakか区別できるようにラベルが付いてるだけでラベル付ブロック式のネストまでは元々求められていないんじゃないかな
たまたまラベル付となったからネストさせて指定して抜けることも可能なのかも知れないけどさ
forやloopを使ったときにどのbreakか区別できるようにラベルが付いてるだけでラベル付ブロック式のネストまでは元々求められていないんじゃないかな
たまたまラベル付となったからネストさせて指定して抜けることも可能なのかも知れないけどさ
506デフォルトの名無しさん
2023/02/10(金) 11:35:14.97ID:D7CjmUqS >>505
指定したラベル位置に制御を移すような動きのことを一般的にはジャンプと呼ぶ
ラベルで指定したブロックを”抜ける”と呼ぶ感覚ももちろん理解できるが同じようにジャンプと呼ぶ感覚くらいは理解してやれって話
指定したラベル位置に制御を移すような動きのことを一般的にはジャンプと呼ぶ
ラベルで指定したブロックを”抜ける”と呼ぶ感覚ももちろん理解できるが同じようにジャンプと呼ぶ感覚くらいは理解してやれって話
507デフォルトの名無しさん
2023/02/10(金) 12:14:15.40ID:53cyCMdn >>502
ブロック式の早期離脱機能は同時に導入されたlet elseと並んでRustにとって必須の機能
これまではブロック式で早期離脱が出来なかったため代替処置として
・ブロックの代わりにわざわざクロージャを用意して即時実行する
・ループさせないのにloop式を目的外でブロック式として用いる
・関数として切り出して引数型や戻り型などコードが無駄に膨らむ
以上3通りの方法が苦しい回避処置として取られてきた
この問題が一気に解決した
ブロック式の早期離脱機能は同時に導入されたlet elseと並んでRustにとって必須の機能
これまではブロック式で早期離脱が出来なかったため代替処置として
・ブロックの代わりにわざわざクロージャを用意して即時実行する
・ループさせないのにloop式を目的外でブロック式として用いる
・関数として切り出して引数型や戻り型などコードが無駄に膨らむ
以上3通りの方法が苦しい回避処置として取られてきた
この問題が一気に解決した
508デフォルトの名無しさん
2023/02/10(金) 13:14:46.92ID:OY+cHUF0509デフォルトの名無しさん
2023/02/10(金) 13:40:49.41ID:icbsua9B オジさんは即時実行マンセー派だったのに宗旨替えしたのかw
と言っても忌み嫌われてた即時実行から半歩前進して半歩後退してるみたいなので実質進歩してないな
と言っても忌み嫌われてた即時実行から半歩前進して半歩後退してるみたいなので実質進歩してないな
510デフォルトの名無しさん
2023/02/10(金) 14:05:25.21ID:aIK+hWQq いわゆる Rewrite it in Rust といわれる
https://zenn.dev/tako8ki/articles/2021-06-awesome-alternatives-in-rust
ものだが、CoreUtil代替もでてきたようだ。
https://www.phoronix.com/news/Rust-Coreutils-uutils-2023
そのうち、ls や cp , mv みたいなものも実はRust実装でしたという時代がくるのか?
https://zenn.dev/tako8ki/articles/2021-06-awesome-alternatives-in-rust
ものだが、CoreUtil代替もでてきたようだ。
https://www.phoronix.com/news/Rust-Coreutils-uutils-2023
そのうち、ls や cp , mv みたいなものも実はRust実装でしたという時代がくるのか?
511デフォルトの名無しさん
2023/02/10(金) 15:10:52.96ID:p1oXUla5 誰もが必ず使うエラーまわりには散々ボイラープレートを要求するくせに
ブロックからの早期returnが必要なくらいの処理を関数に切り出したくないという理由だけで
プチgoto入れちゃうのはバランス感覚おかしいわな
ブロックからの早期returnが必要なくらいの処理を関数に切り出したくないという理由だけで
プチgoto入れちゃうのはバランス感覚おかしいわな
512デフォルトの名無しさん
2023/02/10(金) 15:25:57.81ID:EzUIw58a ブロック式も関数も複数の文をひとつの式にするものだから関数から早期returnできるならブロック式から早期breakできてもええやん😁
513デフォルトの名無しさん
2023/02/10(金) 16:46:17.45ID:ec863R6+ returnやbreakのことをgoto扱いしてる人は頭おかしい
むしろgotoを排除するために現在の言語ほとんどに備えられている
ラベル付breakをサポートする言語も多い
むしろgotoを排除するために現在の言語ほとんどに備えられている
ラベル付breakをサポートする言語も多い
514デフォルトの名無しさん
2023/02/10(金) 17:26:28.28ID:TiW7YUw7 レスバしかしてねーなお前ら
515デフォルトの名無しさん
2023/02/10(金) 17:37:10.71ID:gd5eXGUi Rustの機能はすべて素晴らしいということにしないと気が済まない人がいるのはよく分かった
516デフォルトの名無しさん
2023/02/10(金) 17:57:37.26ID:8u6orso3 マクロは強力なのはいいけど出来は悪いと思う
517デフォルトの名無しさん
2023/02/10(金) 18:07:23.86ID:VmkjxzjW Rust の機能が全て優れてるとは思わないけど ラベル付き break なんて揉めるような機能じゃないだろ...
518デフォルトの名無しさん
2023/02/10(金) 18:07:48.18ID:ec863R6+ Rustに限らず早期return、早期breakはどの言語でも要
519デフォルトの名無しさん
2023/02/10(金) 19:02:21.11ID:MJOsdNRe ブロックからの脱出とジャンプを同列に考えるやつは勉強不足だと思うがね。
Rustのスタックフレーム志向とかを考えれば、ブロック出入り操作を重視するのは自然。逆にスタックフレームの局所性を破壊する例外フローとかジャンプは嫌われて当然だわ。
例外フローにおけるエスケープ解析て確立しているんだっけ?
Rustのスタックフレーム志向とかを考えれば、ブロック出入り操作を重視するのは自然。逆にスタックフレームの局所性を破壊する例外フローとかジャンプは嫌われて当然だわ。
例外フローにおけるエスケープ解析て確立しているんだっけ?
520デフォルトの名無しさん
2023/02/10(金) 19:02:40.14ID:MoSIyINf 規約で禁止していいレベルの機能
Avoid labelled break. Use functions instead.
Avoid labelled break. Use functions instead.
521デフォルトの名無しさん
2023/02/10(金) 19:05:14.63ID:53cyCMdn522デフォルトの名無しさん
2023/02/10(金) 19:06:54.13ID:MJOsdNRe523デフォルトの名無しさん
2023/02/10(金) 19:07:09.08ID:MJOsdNRe524デフォルトの名無しさん
2023/02/10(金) 19:24:57.65ID:VelAUwkm >>520
Rustには何年も前からラベル付breakがあります
今さら文句をつけている人はRustを知らずイチャモンを付けたいだけだとバレていますよ
メジャーなプログラミング言語の大半がラベル付breakを備えています
JavaでもSwiftにもGoもJavaScriptすらラベル付breakを持っています
プログラミングにおいて必須の機能だからです
逆にラベル付breakを持っていない代表的な言語がC/C++です
今回のRust叩きをしている犯人はいつもと同じ人だと分かります
Rustには何年も前からラベル付breakがあります
今さら文句をつけている人はRustを知らずイチャモンを付けたいだけだとバレていますよ
メジャーなプログラミング言語の大半がラベル付breakを備えています
JavaでもSwiftにもGoもJavaScriptすらラベル付breakを持っています
プログラミングにおいて必須の機能だからです
逆にラベル付breakを持っていない代表的な言語がC/C++です
今回のRust叩きをしている犯人はいつもと同じ人だと分かります
525デフォルトの名無しさん
2023/02/10(金) 19:52:12.29ID:ec863R6+ breakに対してジャンプだとかgotoだとかトンデモ発言が出ていたのはそういうことか
C/C++しか知らないと多重ループすらgotoで抜けるしかないもんな
そういう貧弱な世界しか知らない視野の狭い人だから必死にRustを叩いていたわけか
C/C++しか知らないと多重ループすらgotoで抜けるしかないもんな
そういう貧弱な世界しか知らない視野の狭い人だから必死にRustを叩いていたわけか
526デフォルトの名無しさん
2023/02/10(金) 21:33:52.77ID:zr0HQZhu 前から常駐してるアンチRustのやつだろ
ばればれだがアンチとばれないように装いつつRustの色んな点を批判してきた
特にRustならではの機能とか新たな機能とかRustらしい書き方とかを嫌う
ばればれだがアンチとばれないように装いつつRustの色んな点を批判してきた
特にRustならではの機能とか新たな機能とかRustらしい書き方とかを嫌う
527デフォルトの名無しさん
2023/02/10(金) 22:57:01.58ID:9GdW2Tn6 同じことしか言わないから自演丸分かりやんww
528デフォルトの名無しさん
2023/02/10(金) 22:59:03.20ID:Y2H2O9Fe >>524
大半の言語が備えてるラベル付breakはループから抜けるものでブロックから抜けるものじゃないぞ
大半の言語が備えてるラベル付breakはループから抜けるものでブロックから抜けるものじゃないぞ
529デフォルトの名無しさん
2023/02/10(金) 23:14:34.63ID:z32i1LMi swiftがdo statementでブロックスコープから抜ける機能を用意してるがtry/catchなしの形では誰も使ってない
530デフォルトの名無しさん
2023/02/10(金) 23:16:17.28ID:TiW7YUw7 そんなことよりさっさとif let Some(c) = chars.next(); c.is_whitespace() {とかって書けるようになってほしい
531デフォルトの名無しさん
2023/02/10(金) 23:22:50.62ID:KiCBMwJT ブロックは「必ず1回で終了するループ」と解釈可能なのでループからのラベル指定breakがあるならブロックからもbreakで抜けられる方が自然
532デフォルトの名無しさん
2023/02/10(金) 23:24:33.98ID:PcQ6rbEj Javaも文法的にはループ以外でもラベル付きブレイク使えるけど絶対使わないな
533デフォルトの名無しさん
2023/02/10(金) 23:32:27.37ID:Qit9LgYB >>531
その理屈でいけばラベルなしブロックからもbreakで抜けられないとおかしくない?
その理屈でいけばラベルなしブロックからもbreakで抜けられないとおかしくない?
534デフォルトの名無しさん
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
1か2のパターンに収まる形にリファクタリングする
大半の人がラベル付きbreakを選びたくなるようなサンプルはないのかな?
1. 関数化
2. Optionコンビネータ
3. クロージャ
4. ラベル付きbreak
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=e365b15243be65f5fc2d09a94324317e
535デフォルトの名無しさん
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使うのが素直。
rubyは一時期tapとbreakで値を返す文化?あったな
foo.tap {|x| bar} // selfつまりfooを返す
foo.tap {|x| break bar} // breakでbarを返す
foo.then {|x| bar} // ブロックの結果つまりbarを返す。今はthen使うのが素直。
536デフォルトの名無しさん
2023/02/11(土) 00:18:21.11ID:VRz38Asr537デフォルトの名無しさん
2023/02/11(土) 00:22:48.96ID:LT0L6YWb >>534
再利用しない前提ならクロージャを変数に束縛してしまえば3.も視野に入ると思うんだ
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=3159733485aa1a7ee3a1838637a3a097
再利用しない前提ならクロージャを変数に束縛してしまえば3.も視野に入ると思うんだ
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=3159733485aa1a7ee3a1838637a3a097
538デフォルトの名無しさん
2023/02/11(土) 00:29:21.70ID:N8U5Q6xc 異なる種類のエラーを返す関数が絡んできたとき、ラベル指定breakのみエラーの合成を?演算子で関数境界に押し込められる
関数やクロージャだと「ブロック内のエラーを合成した型」を明示的に取り扱うことになって二度手間
関数やクロージャだと「ブロック内のエラーを合成した型」を明示的に取り扱うことになって二度手間
539デフォルトの名無しさん
2023/02/11(土) 00:48:21.15ID:C7Sk8k8l540デフォルトの名無しさん
2023/02/11(土) 01:02:10.14ID:rZ1nyaTw541デフォルトの名無しさん
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
これ↓の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
542デフォルトの名無しさん
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 のイテレーションができる
詳細はトレイトとか 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 のイテレーションができる
543デフォルトの名無しさん
2023/02/11(土) 03:08:28.64ID:ClzSOMcn544デフォルトの名無しさん
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
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
545デフォルトの名無しさん
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が呼ばれるという処理順だと思う
>&mut Vec<T> は暗黙のうちに deref_mut のメソッドを通して &mut [T] に変換されて
細かいけどここちょっと気になった
for loopに渡されたタイミングでDeref Coercionが発生するんじゃなくて
まず最初に渡された値の型でIntoIterator::into_iterが呼ばれて
その中のself.iter_mutのようなメソッド呼び出し時にVecに該当メソッドがないから
Deref Coercionが発生してslice::iter_mutが呼ばれるという処理順だと思う
546デフォルトの名無しさん
2023/02/11(土) 17:02:31.35ID:51HA6IG3 >>537
処理に名前を与えることがいかに重要かよく分かるいい例だな
処理に名前を与えることがいかに重要かよく分かるいい例だな
547デフォルトの名無しさん
2023/02/11(土) 18:03:53.39ID:RzhQX/na なるほど
処理名をラベル名として付与するとラベル付ブロックが非常にわかりやすくなった
関数化と異なり無駄な引数宣言と型宣言が不要となり可読性が増した
もちろん関数化した方が適してる場合もあるだろうから上手く使い分けると良さそう
処理名をラベル名として付与するとラベル付ブロックが非常にわかりやすくなった
関数化と異なり無駄な引数宣言と型宣言が不要となり可読性が増した
もちろん関数化した方が適してる場合もあるだろうから上手く使い分けると良さそう
548デフォルトの名無しさん
2023/02/11(土) 18:29:02.74ID:vxEXQ/Iw さすが汚コーダー!
可読性や保守性になんて目もくれない!
保守なんてやらないもの!
可読性や保守性になんて目もくれない!
保守なんてやらないもの!
549デフォルトの名無しさん
2023/02/11(土) 18:55:39.54ID:o3GDXEGy >>516
それな!(Noneでこんな感じにしちゃったんだろう、コール側がこうである必然性があまりない);
それな!(Noneでこんな感じにしちゃったんだろう、コール側がこうである必然性があまりない);
550デフォルトの名無しさん
2023/02/11(土) 19:00:32.48ID:feYXfeom 1回しか使わない小さな関数in関数は関数名付きブロックで十分やね
551デフォルトの名無しさん
2023/02/11(土) 20:39:00.98ID:PvIfa6j8 外側の関数で既に変数定義してるのに、再び内側の関数の引数で宣言するのが二度手間だったから、ブロック化いいかも。
特に参照している変数が多いと連れ回しと、型宣言が大変だった。
特に参照している変数が多いと連れ回しと、型宣言が大変だった。
552デフォルトの名無しさん
2023/02/11(土) 20:42:54.48ID:XY/MjG6B オジループw
553デフォルトの名無しさん
2023/02/11(土) 20:44:08.48ID:gkb6d4TT IIFEとかいう💩よりはラベル指定ブロックの方がいいのは間違いない
554デフォルトの名無しさん
2023/02/11(土) 21:10:11.34ID:feYXfeom 色んな有名クレートのソース見てると
let result = (|| {
…
})();
の形も多いね
let result = (|| {
…
})();
の形も多いね
555デフォルトの名無しさん
2023/02/11(土) 21:19:57.61ID:+3eLBKqi556デフォルトの名無しさん
2023/02/11(土) 21:20:48.03ID:8c0BE6VG try_blocksが安定化されればここまでの話全部吹っ飛ぶんだけど
それまでのつなぎでしかないコードでここまで議論を紛糾させる必要なんてないのよ
それまでのつなぎでしかないコードでここまで議論を紛糾させる必要なんてないのよ
557デフォルトの名無しさん
2023/02/11(土) 21:44:37.75ID:feYXfeom558デフォルトの名無しさん
2023/02/11(土) 21:50:35.09ID:VSenmeU+ こんどはそれでラベルbreakでええやんって議論が巻き起こるんでしょ
559デフォルトの名無しさん
2023/02/11(土) 21:58:24.52ID:feYXfeom >>558
一部だけ用途は重なるけど互いにできないことがあるからtry blockとlabeled blockは併用になる
一部だけ用途は重なるけど互いにできないことがあるからtry blockとlabeled blockは併用になる
560デフォルトの名無しさん
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()?;
};
try ブロックとラベル指定ブロックて用途違うんじゃね
let result = 'found: {
for i in 0..100 {
if f(i) {
break 'found foo(i)?;
}
}
bar()?;
};
561デフォルトの名無しさん
2023/02/11(土) 22:18:47.54ID:N8U5Q6xc 途中送信
562デフォルトの名無しさん
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の合成をロジックの途中に挟むことになってうれしくない
>>560 のケースで
foo(i) が Result<i32, FooError>
bar() が Result<i32, BarError>
を返すとして、ここでFooErrorとBarErrorの合成を考えなくても関数境界にエラー合成を押し付けて、
result の型を i32 にできるのがラベル付きブロック
クロージャとかは?演算子のスコープを作ってしまうので一旦Resultの型を明示しなきゃいけなくて、
FooErrorとBarErrorの合成をロジックの途中に挟むことになってうれしくない
563デフォルトの名無しさん
2023/02/11(土) 22:24:54.60ID:N8U5Q6xc bar()?
のセミコロンいらねえわ
のセミコロンいらねえわ
564デフォルトの名無しさん
2023/02/11(土) 23:15:54.51ID:PvIfa6j8565デフォルトの名無しさん
2023/02/11(土) 23:32:14.59ID:PvIfa6j8 >>562
従来のif式やmatch式と同様に、tryでないblock式では?を通過してくれるところが嬉しいポイントかな。
一方でtry block式はTry実装のResult型などになってしまい別物。
従来のif式やmatch式と同様に、tryでないblock式では?を通過してくれるところが嬉しいポイントかな。
一方でtry block式はTry実装のResult型などになってしまい別物。
566デフォルトの名無しさん
2023/02/12(日) 00:31:55.44ID:MRyWK0X4567デフォルトの名無しさん
2023/02/12(日) 00:46:15.75ID:iluQvMBc568デフォルトの名無しさん
2023/02/12(日) 00:52:37.66ID:MRyWK0X4569デフォルトの名無しさん
2023/02/12(日) 00:56:29.87ID:MRyWK0X4 破綻するかどうかは別として
多重forの中で種類の異なるエラーを返すような処理を直接書くことにはすごく疑問を感じるから
本当にそういうやり方が必要な状況があるなら見てみたいね
多重forの中で種類の異なるエラーを返すような処理を直接書くことにはすごく疑問を感じるから
本当にそういうやり方が必要な状況があるなら見てみたいね
570デフォルトの名無しさん
2023/02/12(日) 01:41:36.70ID:tVXYYK1+ >>566
アスペ
アスペ
571デフォルトの名無しさん
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
};
とりあえずエラーや可変長や可変参照問題は抜きにシンプルで
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
};
572デフォルトの名無しさん
2023/02/12(日) 02:21:27.18ID:mvDk5H0/ ラベル付きブロック式は特に新しい挙動は導入していない
早期脱出と?のエスカレーションの併用が可能になっただけ
関数:
〇変数、ライフタイムのスコープ
×環境のキャプチャ
〇早期脱出
×?演算子のエスカレーション
クロージャ
〇変数、ライフタイムのスコープ
〇環境のキャプチャ
〇早期脱出
×?演算子のエスカレーション
無名ブロック式:
〇変数、ライフタイムのスコープ
〇環境のキャプチャ
×早期脱出
〇?演算子のエスカレーション
ラベル付きブロック式:
〇変数、ライフタイムのスコープ
〇環境のキャプチャ
〇早期脱出
〇?演算子のエスカレーション
早期脱出と?のエスカレーションの併用が可能になっただけ
関数:
〇変数、ライフタイムのスコープ
×環境のキャプチャ
〇早期脱出
×?演算子のエスカレーション
クロージャ
〇変数、ライフタイムのスコープ
〇環境のキャプチャ
〇早期脱出
×?演算子のエスカレーション
無名ブロック式:
〇変数、ライフタイムのスコープ
〇環境のキャプチャ
×早期脱出
〇?演算子のエスカレーション
ラベル付きブロック式:
〇変数、ライフタイムのスコープ
〇環境のキャプチャ
〇早期脱出
〇?演算子のエスカレーション
573デフォルトの名無しさん
2023/02/12(日) 02:33:03.96ID:277pKKEQ574デフォルトの名無しさん
2023/02/12(日) 02:43:50.06ID:PxSEkt7R むしろこの用途でクロージャでIIFEする方がラベル指定breakより糞だよ
575デフォルトの名無しさん
2023/02/12(日) 02:50:28.15ID:mvDk5H0/ ラベル指定breakについては今更5chでギャオっても無駄
https://internals.rust-lang.org/t/use-iife-not-break-from-labeled-blocks/17684
https://internals.rust-lang.org/t/use-iife-not-break-from-labeled-blocks/17684
576デフォルトの名無しさん
2023/02/12(日) 03:00:29.86ID:iluQvMBc577デフォルトの名無しさん
2023/02/12(日) 06:51:31.07ID:GdrUqMCg >>572
ラベル付ブロック式が優秀すぎだな
ラベル付ブロック式が優秀すぎだな
578デフォルトの名無しさん
2023/02/12(日) 11:32:22.52ID:wiu+k2M9 >>571
これ書いててアンチパターンだと感じないの?
これ書いててアンチパターンだと感じないの?
579デフォルトの名無しさん
2023/02/12(日) 11:36:01.27ID:mvDk5H0/ 機能的な差異(できることの違い)を示すためのサンプルコードにアンチパターンがどうのとか一生言ってる奴はこの世のすべてのコードから大域脱出を排除してきて
580デフォルトの名無しさん
2023/02/12(日) 11:42:58.24ID:GdrUqMCg581はちみつ餃子 ◆8X2XSCHEME
2023/02/12(日) 11:47:23.89ID:b/cm1PRG 大域脱出自体がアンチパターンではあるが
それでも必要になったときのために比較的マシな方法があったほうがよいというのは両立する話なんだよな。
それでも必要になったときのために比較的マシな方法があったほうがよいというのは両立する話なんだよな。
582デフォルトの名無しさん
2023/02/12(日) 11:51:17.64ID:VpAOtCID 短絡評価の&&と||がResultやOptionで使えるようになればtryブロックはともかくlabeled breakは使われなくなるよ
583デフォルトの名無しさん
2023/02/12(日) 12:02:26.70ID:UeaSFBcM 短絡でブロック式がすべて死滅するとは思えないからラベル指定breakも死滅しないだろうな
ブロック式が途中で抜けられるようになっただけなんだし、ブロック式書いてて途中で式の値を確定したくなったらラベル指定breakの出番
ブロック式が途中で抜けられるようになっただけなんだし、ブロック式書いてて途中で式の値を確定したくなったらラベル指定breakの出番
584デフォルトの名無しさん
2023/02/12(日) 12:03:19.48ID:FD3ztQVR585デフォルトの名無しさん
2023/02/12(日) 12:09:09.65ID:KAxOFwBs 50行や100行を超えるような関数を書いても何も感じない流派の人と
10行以下でもリファクタリングの要否を検討するような流派の人とでは
審美眼というか根本的な価値観が違うから
お互いスタンスの違いを認識しないと話が噛み合わないよ
10行以下でもリファクタリングの要否を検討するような流派の人とでは
審美眼というか根本的な価値観が違うから
お互いスタンスの違いを認識しないと話が噛み合わないよ
586デフォルトの名無しさん
2023/02/12(日) 12:17:07.80ID:mvDk5H0/ 数ヵ月前にstabledに入ってる機能とRFCすらマージされてないプロポーザルを比較するのって
捕らぬ狸の皮算用って奴じゃないですかね
捕らぬ狸の皮算用って奴じゃないですかね
587デフォルトの名無しさん
2023/02/12(日) 12:18:39.30ID:wxFdc7Z6588デフォルトの名無しさん
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して結果に関数適用してるだけだよね
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して結果に関数適用してるだけだよね
589デフォルトの名無しさん
2023/02/12(日) 12:36:57.63ID:UeaSFBcM■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【速報】 アメリカ議会 「中国が台湾武力侵攻する準備を急速進展中」 [お断り★]
- アメリカ議会 「中国が台湾武力侵攻する準備を急速進展中」 ★2 [お断り★]
- 【高市自民】中国軍SNS 高市首相に怖すぎる地獄絵で警告、火の海の靖国神社「自ら墓穴を掘り、戻れない道へ進む」 [夜のけいちゃん★]
- 「二枚舌は許されない」中国外務省 高市総理の発言を批判… [BFU★]
- ネット殺到「高市総理の責任」「完全に高市リスク」「負けるな」中国が水産物輸入停止→流石に総理批判の声も「どう責任取る?」 ★8 [樽悶★]
- 中国国際航空が日本便を減便へ、春節休みも SNSでは投稿相次ぐ [七波羅探題★]
- 【実況】博衣こよりのえちえちお子様ランチ🛸💜🥀🧪🍃★2
- 【実況】博衣こよりのえちえちお子様ランチ🛸💜🥀🧪🍃
- 【悲報】高市有事、中国から追加の報復措置が来る模様 [834922174]
- 【悲報】イチゴ高騰で、ショートケーキからイチゴが消える🍰 [966095474]
- 【男磨き】ハウスルール汁遊び禁止🈲🏡【ジョージメンズコーチ】
- 【高市悲報】上念司、6月に輸出再開した途端禁輸になり嘆くナマコ業者を煽る「アンタ今まで何してたんだ?😤」 [359965264]
