Rust part19 ..
[2ch|▼Menu]
525:デフォルトの名無しさん
23/02/10 19:24:57.65 VelAUwkm.net
>>521
Rustには何年も前からラベル付breakがあります
今さら文句をつけている人はRustを知らずイチャモンを付けたいだけだとバレていますよ

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

逆にラベル付breakを持っていない代表的な言語がC/C++です
今回のRust叩きをしている犯人はいつもと同じ人だと分かります

526:デフォルトの名無しさん
23/02/10 19:52:12.29 ec863R6+.net
breakに対してジャンプだとかgotoだとかトンデモ発言が出ていたのはそういうことか
C/C++しか知らないと多重ループすらgotoで抜けるしかないもんな
そういう貧弱な世界しか知らない視野の狭い人だから必死にRustを叩いていたわけか

527:デフォルトの名無しさん
23/02/10 21:33:52.77 zr0HQZhu.net
前から常駐してるアンチRustのやつだろ
ばればれだがアンチとばれないように装いつつRustの色んな点を批判してきた
特にRustならではの機能とか新たな機能とかRustらしい書き方とかを嫌う

528:デフォルトの名無しさん
23/02/10 22:57:01.58 9GdW2Tn6.net
同じことしか言わないから自演丸分かりやんww

529:デフォルトの名無しさん
23/02/10 22:59:03.20 Y2H2O9Fe.net
>>525
大半の言語が備えてるラベル付breakはループから抜けるものでブロックから抜けるものじゃないぞ

530:デフォルトの名無しさん
23/02/10 23:14:34.63 z32i1LMi.net
swiftがdo statementでブロックスコープから抜ける機能を用意してるがtry/catchなしの形では誰も使ってない

531:デフォルトの名無しさん
23/02/10 23:16:17.28 TiW7YUw7.net
そんなことよりさっさとif let Some(c) = chars.next(); c.is_whitespace() {とかって書けるようになってほしい

532:デフォルトの名無しさん
23/02/10 23:22:50.62 KiCBMwJT.net
ブロックは「必ず1回で終了するループ」と解釈可能なのでループからのラベル指定breakがあるならブロックからもbreakで抜けられる方が自然

533:デフォルトの名無しさん
23/02/10 23:24:33.98 PcQ6rbEj.net
Javaも文法的にはループ以外でもラベル付きブレイク使えるけど絶対使わないな

534:デフォルトの名無しさん
23/02/10 23:32:27.37 Qit9LgYB.net
>>532
その理屈でいけばラベルなしブロックからもbreakで抜けられないとおかしくない?

535:デフォルトの名無しさん
23/02/10 23:37:03.68 q3LdPEQ+.net
RFCの例を4パターンで書いてみたけどラベル付きbreakは無いな
1か2のパターンに収まる形にリファクタリングする
大半の人がラベル付きbreakを選びたくなるようなサンプルはないのかな?
1. 関数化
2. Optionコンビネータ
3. クロージャ
4. ラベル付きbreak
URLリンク(play.rust-lang.org)

536:デフォルトの名無しさん
23/02/10 23:46:57.14 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:デフォルトの名無しさん
23/02/11 00:18:21.11 VRz38Asr.net
>>531
セミコロンじゃなくて&&だよね
stableになるのは半年後くらいじゃない

538:デフォルトの名無しさん
23/02/11 00:22:48.96 LT0L6YWb.net
>>535
再利用しない前提ならクロージャを変数に束縛してしまえば3.も視野に入ると思うんだ
URLリンク(play.rust-lang.org)

539:デフォルトの名無しさん
23/02/11 00:29:21.70 N8U5Q6xc.net
異なる種類のエラーを返す関数が絡んできたとき、ラベル指定breakのみエラーの合成を?演算子で関数境界に押し込められる
関数やクロージャだと「ブロック内のエラーを合成した型」を明示的に取り扱うことになって二度手間

540:デフォルトの名無しさん
23/02/11 00:48:21.15 C7Sk8k8l.net
>>536
tapでbreakなんて初めて知ったわ
イテレータのメソッドチェーンの途中経過を出力する時にしか使ったことなかった

541:デフォルトの名無しさん
23/02/11 01:02:10.14 rZ1nyaTw.net
>>538
これは同意
>>539
サンプルコード書いてみてよ

542:デフォルトの名無しさん
23/02/11 01:49:22.40 sVZS7q05.net
すまんがRustlingsでまたちょっと教えてほしいんだけどさ
これ↓のListing 8-8の&mutって、一体どういう意味があるの???
URLリンク(doc.rust-lang.org)
Rustlingsをやっていて、似たような場面で&mutなしでも動いちゃうように見えるけど・・・・状況が似て非なるものなんだろか・・・・・
URLリンク(play.rust-lang.org)

543:デフォルトの名無しさん
23/02/11 02:18:23.31 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:デフォルトの名無しさん
23/02/11 03:08:28.64 ClzSOMcn.net
>>535
その程度ならば型宣言で冗長になる関数化をするまでもないからブロック式でも十分かな
使い分けできるようにブロック式の不備を整備したRustの方針は正しいと思うよ
>>542
所有権を渡すのは消費尽くすときだけでその後も使いたい時は参照&か可変参照&mutを渡す
そのコードのv.iter_mut()の方に見かけ上&mutが見当たらないのはメソッド定義にそれがあるから
メソッドでは所有権を渡すか参照を渡すか可変参照を渡すかをその定義でselfか&selfか&mut selfか指定することでメソッド使用時に毎回指定しなくて済むようになっている

545:デフォルトの名無しさん
23/02/11 03:56:21.21 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()を呼び出してからイテレートする仕組み
URLリンク(doc.rust-lang.org)


最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

497日前に更新/165 KB
担当:undef