1 名前:デフォルトの名無しさん mailto:sage [2023/01/17(火) 12:41:32.25 ID:nikBFIMQ.net] 公式 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/
501 名前:デフォルトの名無しさん mailto:sage [2023/02/10(金) 09:39:52.23 ID:FTCkglUc.net] >>491 動作も意味も全く同じとのことだが その構文でネストしたブロックから抜けられるのかい?
502 名前:デフォルトの名無しさん mailto:sage [2023/02/10(金) 09:47:31.36 ID:XC30Ey72.net] >>496 今も||は「短絡論理OR」で区別されてないよ 短絡論理ORと論理ORを分けてる言語ってある?
503 名前:デフォルトの名無しさん mailto:sage [2023/02/10(金) 09:58:49.88 ID:zTpuYOFQ.net] 5年もの歳月を費やしてstabilizeするほど意味ある機能じゃないよな 超ニッチなnice to haveなんだからこんな機能実装するくらいなら他の作業してくれよ
504 名前:デフォルトの名無しさん mailto:sage [2023/02/10(金) 09:58:58.37 ID:f/xkkyji.net] >>500 Rustで関数のネスト定義は可能だけどスコープを親関数内に限定するだけだよね 親関数の変数をもちろん操作できないので改めて引数も戻り値も全て型宣言して受け渡ししなければならない
505 名前:デフォルトの名無しさん mailto:sage [2023/02/10(金) 10:00:29.07 ID:76BGvvFm.net] >>500 関数のネストでやるためには 関数に切り出す必要があるから同じことを言ってるんじゃない?
506 名前:デフォルトの名無しさん mailto:sage [2023/02/10(金) 10:06:08.19 ID:f/xkkyji.net] >>501 forやloopを使ったときにどのbreakか区別できるようにラベルが付いてるだけでラベル付ブロック式のネストまでは元々求められていないんじゃないかな たまたまラベル付となったからネストさせて指定して抜けることも可能なのかも知れないけどさ
507 名前:デフォルトの名無しさん mailto:sage [2023/02/10(金) 11:35:14.97 ID:D7CjmUqS.net] >>506 指定したラベル位置に制御を移すような動きのことを一般的にはジャンプと呼ぶ ラベルで指定したブロックを”抜ける”と呼ぶ感覚ももちろん理解できるが同じようにジャンプと呼ぶ感覚くらいは理解してやれって話
508 名前:デフォルトの名無しさん mailto:sage [2023/02/10(金) 12:14:15.40 ID:53cyCMdn.net] >>503 ブロック式の早期離脱機能は同時に導入されたlet elseと並んでRustにとって必須の機能 これまではブロック式で早期離脱が出来なかったため代替処置として ・ブロックの代わりにわざわざクロージャを用意して即時実行する ・ループさせないのにloop式を目的外でブロック式として用いる ・関数として切り出して引数型や戻り型などコードが無駄に膨らむ 以上3通りの方法が苦しい回避処置として取られてきた この問題が一気に解決した
509 名前:デフォルトの名無しさん mailto:sage [2023/02/10(金) 13:14:46.92 ID:OY+cHUF0.net] >>508 おまえホント壊れたレコードみたいだな 馬鹿の一つ覚えで繰り返し同じことしか言えないからおまえが出しゃばってくるとすぐスレが腐る
510 名前:デフォルトの名無しさん mailto:sage [2023/02/10(金) 13:40:49.41 ID:icbsua9B.net] オジさんは即時実行マンセー派だったのに宗旨替えしたのかw と言っても忌み嫌われてた即時実行から半歩前進して半歩後退してるみたいなので実質進歩してないな
511 名前:デフォルトの名無しさん [2023/02/10(金) 14:05:25.21 ID:aIK+hWQq.net] いわゆる 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実装でしたという時代がくるのか?
512 名前:デフォルトの名無しさん mailto:sage [2023/02/10(金) 15:10:52.96 ID:p1oXUla5.net] 誰もが必ず使うエラーまわりには散々ボイラープレートを要求するくせに ブロックからの早期returnが必要なくらいの処理を関数に切り出したくないという理由だけで プチgoto入れちゃうのはバランス感覚おかしいわな
513 名前:デフォルトの名無しさん mailto:sage [2023/02/10(金) 15:25:57.81 ID:EzUIw58a.net] ブロック式も関数も複数の文をひとつの式にするものだから関数から早期returnできるならブロック式から早期breakできてもええやん😁
514 名前:デフォルトの名無しさん mailto:sage [2023/02/10(金) 16:46:17.45 ID:ec863R6+.net] returnやbreakのことをgoto扱いしてる人は頭おかしい むしろgotoを排除するために現在の言語ほとんどに備えられている ラベル付breakをサポートする言語も多い
515 名前:デフォルトの名無しさん mailto:sage [2023/02/10(金) 17:26:28.28 ID:TiW7YUw7.net] レスバしかしてねーなお前ら
516 名前:デフォルトの名無しさん mailto:sage [2023/02/10(金) 17:37:10.71 ID:gd5eXGUi.net] Rustの機能はすべて素晴らしいということにしないと気が済まない人がいるのはよく分かった
517 名前:デフォルトの名無しさん mailto:sage [2023/02/10(金) 17:57:37.26 ID:8u6orso3.net] マクロは強力なのはいいけど出来は悪いと思う
518 名前:デフォルトの名無しさん mailto:sage [2023/02/10(金) 18:07:23.86 ID:VmkjxzjW.net] Rust の機能が全て優れてるとは思わないけど ラベル付き break なんて揉めるような機能じゃないだろ...
519 名前:デフォルトの名無しさん mailto:sage [2023/02/10(金) 18:07:48.18 ID:ec863R6+.net] Rustに限らず早期return、早期breakはどの言語でも要
520 名前:デフォルトの名無しさん mailto:sage [2023/02/10(金) 19:02:21.11 ID:MJOsdNRe.net] ブロックからの脱出とジャンプを同列に考えるやつは勉強不足だと思うがね。 Rustのスタックフレーム志向とかを考えれば、ブロック出入り操作を重視するのは自然。逆にスタックフレームの局所性を破壊する例外フローとかジャンプは嫌われて当然だわ。 例外フローにおけるエスケープ解析て確立しているんだっけ?
521 名前:デフォルトの名無しさん mailto:sage [2023/02/10(金) 19:02:40.14 ID:MoSIyINf.net] 規約で禁止していいレベルの機能 Avoid labelled break. Use functions instead.
522 名前:デフォルトの名無しさん mailto:sage [2023/02/10(金) 19:05:14.63 ID:53cyCMdn.net] >>509 唐突に発狂されても意味不明 反論があるなら技術的な話でお願いします
523 名前:デフォルトの名無しさん mailto:sage [2023/02/10(金) 19:06:54.13 ID:MJOsdNRe.net] >>521 関数みたいなブロックを作ればいいんじゃない? あるいはブロックみたいな関数とか。
524 名前:デフォルトの名無しさん mailto:sage [2023/02/10(金) 19:07:09.08 ID:MJOsdNRe.net] >>521 関数みたいなブロックを作ればいいんじゃない? あるいはブロックみたいな関数とか。
525 名前:デフォルトの名無しさん mailto:sage [2023/02/10(金) 19:24:57.65 ID:VelAUwkm.net] >>521 Rustには何年も前からラベル付breakがあります 今さら文句をつけている人はRustを知らずイチャモンを付けたいだけだとバレていますよ メジャーなプログラミング言語の大半がラベル付breakを備えています JavaでもSwiftにもGoもJavaScriptすらラベル付breakを持っています プログラミングにおいて必須の機能だからです 逆にラベル付breakを持っていない代表的な言語がC/C++です 今回のRust叩きをしている犯人はいつもと同じ人だと分かります
526 名前:デフォルトの名無しさん mailto:sage [2023/02/10(金) 19:52:12.29 ID:ec863R6+.net] breakに対してジャンプだとかgotoだとかトンデモ発言が出ていたのはそういうことか C/C++しか知らないと多重ループすらgotoで抜けるしかないもんな そういう貧弱な世界しか知らない視野の狭い人だから必死にRustを叩いていたわけか
527 名前:デフォルトの名無しさん mailto:sage [2023/02/10(金) 21:33:52.77 ID:zr0HQZhu.net] 前から常駐してるアンチRustのやつだろ ばればれだがアンチとばれないように装いつつRustの色んな点を批判してきた 特にRustならではの機能とか新たな機能とかRustらしい書き方とかを嫌う
528 名前:デフォルトの名無しさん mailto:sage [2023/02/10(金) 22:57:01.58 ID:9GdW2Tn6.net] 同じことしか言わないから自演丸分かりやんww
529 名前:デフォルトの名無しさん mailto:sage [2023/02/10(金) 22:59:03.20 ID:Y2H2O9Fe.net] >>525 大半の言語が備えてるラベル付breakはループから抜けるものでブロックから抜けるものじゃないぞ
530 名前:デフォルトの名無しさん mailto:sage [2023/02/10(金) 23:14:34.63 ID:z32i1LMi.net] swiftがdo statementでブロックスコープから抜ける機能を用意してるがtry/catchなしの形では誰も使ってない
531 名前:デフォルトの名無しさん mailto:sage [2023/02/10(金) 23:16:17.28 ID:TiW7YUw7.net] そんなことよりさっさとif let Some(c) = chars.next(); c.is_whitespace() {とかって書けるようになってほしい
532 名前:デフォルトの名無しさん mailto:sage [2023/02/10(金) 23:22:50.62 ID:KiCBMwJT.net] ブロックは「必ず1回で終了するループ」と解釈可能なのでループからのラベル指定breakがあるならブロックからもbreakで抜けられる方が自然
533 名前:デフォルトの名無しさん mailto:sage [2023/02/10(金) 23:24:33.98 ID:PcQ6rbEj.net] Javaも文法的にはループ以外でもラベル付きブレイク使えるけど絶対使わないな
534 名前:デフォルトの名無しさん mailto:sage [2023/02/10(金) 23:32:27.37 ID:Qit9LgYB.net] >>532 その理屈でいけばラベルなしブロックからもbreakで抜けられないとおかしくない?
535 名前:デフォルトの名無しさん mailto:sage [2023/02/10(金) 23:37:03.68 ID:q3LdPEQ+.net] 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
536 名前:デフォルトの名無しさん mailto:sage [2023/02/10(金) 23:46:57.14 ID:XHs/nBWT.net] 流れと一切関係ないけど rubyは一時期tapとbreakで値を返す文化?あったな foo.tap {|x| bar} // selfつまりfooを返す foo.tap {|x| break bar} // breakでbarを返す foo.then {|x| bar} // ブロックの結果つまりbarを返す。今はthen使うのが素直。
537 名前:デフォルトの名無しさん mailto:sage [2023/02/11(土) 00:18:21.11 ID:VRz38Asr.net] >>531 セミコロンじゃなくて&&だよね stableになるのは半年後くらいじゃない
538 名前:デフォルトの名無しさん mailto:sage [2023/02/11(土) 00:22:48.96 ID:LT0L6YWb.net] >>535 再利用しない前提ならクロージャを変数に束縛してしまえば3.も視野に入ると思うんだ https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=3159733485aa1a7ee3a1838637a3a097
539 名前:デフォルトの名無しさん mailto:sage [2023/02/11(土) 00:29:21.70 ID:N8U5Q6xc.net] 異なる種類のエラーを返す関数が絡んできたとき、ラベル指定breakのみエラーの合成を?演算子で関数境界に押し込められる 関数やクロージャだと「ブロック内のエラーを合成した型」を明示的に取り扱うことになって二度手間
540 名前:デフォルトの名無しさん mailto:sage [2023/02/11(土) 00:48:21.15 ID:C7Sk8k8l.net] >>536 tapでbreakなんて初めて知ったわ イテレータのメソッドチェーンの途中経過を出力する時にしか使ったことなかった
541 名前:デフォルトの名無しさん mailto:sage [2023/02/11(土) 01:02:10.14 ID:rZ1nyaTw.net] >>538 これは同意 >>539 サンプルコード書いてみてよ
542 名前:デフォルトの名無しさん [2023/02/11(土) 01:49:22.40 ID:sVZS7q05.net] すまんが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
543 名前:デフォルトの名無しさん mailto:sage [2023/02/11(土) 02:18:23.31 ID:N8U5Q6xc.net] >>542 詳細はトレイトとか 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 のイテレーションができる
544 名前:デフォルトの名無しさん mailto:sage [2023/02/11(土) 03:08:28.64 ID:ClzSOMcn.net] >>535 その程度ならば型宣言で冗長になる関数化をするまでもないからブロック式でも十分かな 使い分けできるようにブロック式の不備を整備したRustの方針は正しいと思うよ >>542 所有権を渡すのは消費尽くすときだけでその後も使いたい時は参照&か可変参照&mutを渡す そのコードのv.iter_mut()の方に見かけ上&mutが見当たらないのはメソッド定義にそれがあるから メソッドでは所有権を渡すか参照を渡すか可変参照を渡すかをその定義でselfか&selfか&mut selfか指定することでメソッド使用時に毎回指定しなくて済むようになっている
545 名前:デフォルトの名無しさん mailto:sage [2023/02/11(土) 03:56:21.21 ID:VRz38Asr.net] >>542 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