公式
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
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も普通によく見かける
691デフォルトの名無しさん
2023/02/19(日) 00:45:16.79ID:BpqMGyUW ?はunwrap or return (Err/None)
.unwrapはunwrap or panic
欲しかったのはこれらと同じように使える
unwrap or breakとunwrap or continue
でも出来たのは新しい構文のlet elseでしたとさ
.unwrapはunwrap or panic
欲しかったのはこれらと同じように使える
unwrap or breakとunwrap or continue
でも出来たのは新しい構文のlet elseでしたとさ
692デフォルトの名無しさん
2023/02/19(日) 01:10:22.21ID:HkvRLrfo https://rust-lang.github.io/rfcs/3137-let-else.html#examples
RFCのExamplesなんてbeforeもafterもlet else以前の問題
typestate使ってtry_fromとnewを用意するというrustのidiomを使えば良いだけなのに
実施して当然のリファクタリングもやってないようなコードを前提に議論が進んでるのを見ると悲しいね
RFCのExamplesなんてbeforeもafterもlet else以前の問題
typestate使ってtry_fromとnewを用意するというrustのidiomを使えば良いだけなのに
実施して当然のリファクタリングもやってないようなコードを前提に議論が進んでるのを見ると悲しいね
693デフォルトの名無しさん
2023/02/19(日) 06:25:34.88ID:fFCNNJwx >>692
それはRFCつまり単なる叩き台
無意味に長いサンプルだからThe Rust Referenceでは短く書き換わっている
typestateは適用できないケース、不向きなケース、向いているがそこまでやらなくてもいいと判断するケースがあり
それ以前にlet elseとは無関係だから持ち出して批判するのは揚げ足取りにしか見えない
それはRFCつまり単なる叩き台
無意味に長いサンプルだからThe Rust Referenceでは短く書き換わっている
typestateは適用できないケース、不向きなケース、向いているがそこまでやらなくてもいいと判断するケースがあり
それ以前にlet elseとは無関係だから持ち出して批判するのは揚げ足取りにしか見えない
694デフォルトの名無しさん
2023/02/19(日) 07:06:24.11ID:C1cC1Qr1695デフォルトの名無しさん
2023/02/19(日) 08:40:02.37ID:Y5aKpigf 特定のサンプルに対してこう書けるから要らないと主張したり、
自分は使わないから要らないと主張したり、
それらの主張は何の意味もないことにそろそろ気付かないと
自分は使わないから要らないと主張したり、
それらの主張は何の意味もないことにそろそろ気付かないと
696デフォルトの名無しさん
2023/02/19(日) 09:32:40.87ID:Qqyqhdv7 関数の「切り出し」とか行数で語ってるのとかまだまだ幼いなってオモタw
最近の流れじゃあ>>689サンだけ一個上のレベルにおるな
最近の流れじゃあ>>689サンだけ一個上のレベルにおるな
697デフォルトの名無しさん
2023/02/19(日) 10:03:16.21ID:xSIr/CQB698デフォルトの名無しさん
2023/02/19(日) 10:56:50.58ID:iJY+vHtr >>696
君はまだ参照の持ち回りや明示的に型を書くことのデメリットを理解せずになんでもかんでも関数にするレベルにいるんだね
君はまだ参照の持ち回りや明示的に型を書くことのデメリットを理解せずになんでもかんでも関数にするレベルにいるんだね
699デフォルトの名無しさん
2023/02/19(日) 11:10:19.79ID:xSIr/CQB 相手すんなよ、どう見ても>>689の自演だろ
700デフォルトの名無しさん
2023/02/19(日) 11:13:57.20ID:XqM1QV+K >>693
最終的なRFCはたたき台じゃないよ
RFCは議論の進行とともに更新された上で提案された機能を採用するどうかを判断するための公式ドキュメントとなる
採用決定後に書かれるリファレンスとは全く役割が違う
最終的なRFCはたたき台じゃないよ
RFCは議論の進行とともに更新された上で提案された機能を採用するどうかを判断するための公式ドキュメントとなる
採用決定後に書かれるリファレンスとは全く役割が違う
701デフォルトの名無しさん
2023/02/19(日) 11:21:38.84ID:Y5aKpigf >>689
関数切り出しでは出来ないこともあれば無駄な記述が増えることを含
めて様々なデメリットもあるから、
それらをクリアできて上回るメリットがある時に絞って使い分けるとよい
あと関数切り出しすれば何でもcontinueやbreakという制御構造を無くせるわけでもない
そして君の使い方だと出番がないからそれらが不要だとの主張には何の意味もない
関数切り出しでは出来ないこともあれば無駄な記述が増えることを含
めて様々なデメリットもあるから、
それらをクリアできて上回るメリットがある時に絞って使い分けるとよい
あと関数切り出しすれば何でもcontinueやbreakという制御構造を無くせるわけでもない
そして君の使い方だと出番がないからそれらが不要だとの主張には何の意味もない
702デフォルトの名無しさん
2023/02/19(日) 11:30:31.86ID:xSIr/CQB703デフォルトの名無しさん
2023/02/19(日) 13:11:23.57ID:zmZHaY7K >>688
フフッ、奴らはRust魔術師なんて名乗ってるが所詮は、正確な儀式魔法陣の設計と、正確で美しい呪文の詠唱にこだわる愚物よ!
それで発動するのが初級のファイヤーボールたるファイル検索とか笑えるだろ?
無詠唱でループで取り囲まれている敵陣真っただ中に転移ジャンプすることすら叶わぬのだッ!
フフッ、奴らはRust魔術師なんて名乗ってるが所詮は、正確な儀式魔法陣の設計と、正確で美しい呪文の詠唱にこだわる愚物よ!
それで発動するのが初級のファイヤーボールたるファイル検索とか笑えるだろ?
無詠唱でループで取り囲まれている敵陣真っただ中に転移ジャンプすることすら叶わぬのだッ!
704デフォルトの名無しさん
2023/02/19(日) 14:21:00.44ID:LfhOnc3U >>702
ユーザーマニュアルと開発時の要件定義書や設計書の違いだよ
承認された最終版の要件定義書や設計書をたたき台と呼んでる会社なのかな?
提案資料と捉えても別に構わないとは思うが
採用判断の妥当性を確かめるために参照するのは間違ってもユーザーマニュアルではない
ユーザーマニュアルと開発時の要件定義書や設計書の違いだよ
承認された最終版の要件定義書や設計書をたたき台と呼んでる会社なのかな?
提案資料と捉えても別に構わないとは思うが
採用判断の妥当性を確かめるために参照するのは間違ってもユーザーマニュアルではない
705デフォルトの名無しさん
2023/02/19(日) 14:23:05.09ID:k7Ha0AgI 実装は正確に、商談はいい加減にやればいいのに
消費税込み0円で物々交換することすら叶わぬのだ
消費税込み0円で物々交換することすら叶わぬのだ
706デフォルトの名無しさん
2023/02/19(日) 14:26:53.65ID:Qo8ZRnUl >>673
Option,Resultならunwrapで良いけど、任意のenumから同じように中身を取り出す方法ある?
Option,Resultならunwrapで良いけど、任意のenumから同じように中身を取り出す方法ある?
707デフォルトの名無しさん
2023/02/19(日) 14:33:14.38ID:GfHJyYZp if letとlet elseがmatchのsyntax sugarなのは自明だから
RFCのサンプルという特定の例に対して別の書き換えが可能だと主張しても何の意味もない
if/let/elseという既存の概念と既存のキーワードの組み合わせによりmatchより短く書けて利便性も良いと総合的に判断されてRustに導入された
RFCのサンプルという特定の例に対して別の書き換えが可能だと主張しても何の意味もない
if/let/elseという既存の概念と既存のキーワードの組み合わせによりmatchより短く書けて利便性も良いと総合的に判断されてRustに導入された
708デフォルトの名無しさん
2023/02/19(日) 14:44:02.93ID:xSIr/CQB709デフォルトの名無しさん
2023/02/19(日) 15:44:36.19ID:iJY+vHtr RFCは叩き台だと思う
たたき‐だい【×叩き台】
読み方:たたきだい
批判・検討などを加えて、よりよい案を得るための原案。
たたき‐だい【×叩き台】
読み方:たたきだい
批判・検討などを加えて、よりよい案を得るための原案。
710デフォルトの名無しさん
2023/02/19(日) 15:53:32.74ID:iN4G4OW1711デフォルトの名無しさん
2023/02/19(日) 16:00:16.45ID:0DtJLXl4 単なる叩き台wに従って仕様が変わる言語w
712デフォルトの名無しさん
2023/02/19(日) 16:00:56.96ID:K3OK+ZQ9 RFCに議論の過程もなぜ導入しようとしたのかもメリットも書いてるのに
サンプルコードが別の書き方できるってもう重箱隅つつきたいだけでしょ
せめてRFCテキスト一文に対する反論なり書いてれば議論になるんだろうけど
サンプルコードが別の書き方できるってもう重箱隅つつきたいだけでしょ
せめてRFCテキスト一文に対する反論なり書いてれば議論になるんだろうけど
713デフォルトの名無しさん
2023/02/19(日) 16:07:55.43ID:CVP+1vur IDコロコロしてレベルの低いこと連投する複オジ
714デフォルトの名無しさん
2023/02/19(日) 16:09:05.87ID:Y5aKpigf let elseの話ならばもはやRFCの段階ではなく、
既に正式にlet文の一部として位置付けられて取り込まれており、
公式Referenceにもletの機能として必要な条件などが記載されている段階
既に正式にlet文の一部として位置付けられて取り込まれており、
公式Referenceにもletの機能として必要な条件などが記載されている段階
715デフォルトの名無しさん
2023/02/19(日) 16:26:24.12ID:Y5aKpigf RFC (request for comment)はもちろんその名の通り『叩き台』で合ってる
ただしlet elseについては既に結論が出ているので、
RFCのtracking issueと合わせて過去の経緯と議論を見るための存在へと変わっている
今はRust公式Referenceを見るだけで十分
ただしlet elseについては既に結論が出ているので、
RFCのtracking issueと合わせて過去の経緯と議論を見るための存在へと変わっている
今はRust公式Referenceを見るだけで十分
716デフォルトの名無しさん
2023/02/19(日) 16:39:11.76ID:zHbwXkn0 複オジさんの役に立たない自演珍説言い訳レスはもうお腹いっぱい
717デフォルトの名無しさん
2023/02/19(日) 17:04:26.59ID:GfHJyYZp 3ヶ月も前にstableに導入されたlet elseやラベル付ブロックbreakを今になって自分は使わないからその機能は不要だと主張している人は何をしたいのだろう?
時期的にも不明であるし執拗に不要だと言い続けている意図も不明だ
同時に導入されたGATも使わないから不要と言い出しそうだな
時期的にも不明であるし執拗に不要だと言い続けている意図も不明だ
同時に導入されたGATも使わないから不要と言い出しそうだな
718デフォルトの名無しさん
2023/02/19(日) 17:10:07.16ID:CVP+1vur >>717
ようわからんけどお前の発言の意図も不明だぞw
ようわからんけどお前の発言の意図も不明だぞw
719デフォルトの名無しさん
2023/02/19(日) 17:58:31.87ID:bwwdc6fu そもそも要らん機能だと言い張るならRustフォークして削除した版作って勝手にやってりゃいいと思う
720デフォルトの名無しさん
2023/02/19(日) 19:36:27.82ID:Y5aKpigf うむ
721デフォルトの名無しさん
2023/02/19(日) 20:00:19.52ID:CVP+1vur まぁCのgotoも使う人にとっては要る機能だしね
722デフォルトの名無しさん
2023/02/19(日) 20:04:13.68ID:C1cC1Qr1 有意義ではないとは言ってない
使うのは稀だと言ってるだけ
稀で済むからRustを使ってるの
使うのは稀だと言ってるだけ
稀で済むからRustを使ってるの
723デフォルトの名無しさん
2023/02/19(日) 20:21:42.49ID:iJY+vHtr Cの時代にはgotoは普通に要る機能だったからな
コンパイラも今ほど賢くないし
コンパイラも今ほど賢くないし
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- バリ島で男子生徒ら集団万引きか、防犯カメラ映像が拡散 京都の大谷中学・高校が「窃盗行為」謝罪★4 [七波羅探題★]
- 中国軍機レーダー照射、トランプ氏沈黙突く 試される日本外交 [蚤の市★]
- 【地震】青森県で震度6強 長周期地震動も 津波注意報すべて解除 ★7 [ぐれ★] [ぐれ★]
- 【広島】「万引きした人を追跡」コンビニ店員の男性(46)を果物ナイフで刺したか 中国籍の少年(17)を殺人未遂容疑で現行犯逮捕 [ぐれ★]
- トランプ大統領 エヌビディア製AI半導体の中国輸出許可 安全保障重視の方針転換 [蚤の市★]
- 【サッカー】58歳カズ「オファーが来ている」 J3福島と近日中にも交渉 早ければ年内にも決断 [征夷大将軍★]
- 【実況】博衣こよりのえちえち朝こよ🧪
- さかまた「過呼吸になった」かなた「耳聞こえない」ござる「声出ない」まつり「ご飯食べれない」
- 【悲報】高市早苗の擬人化がXで大バズりwwwwwwwwwwww [455031798]
- くそしてかがやけ
- 🎌日本の地震をお祝いします👏👏👏✨
- お茶だと思って飲んだらションベンだった
