- 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/
- 301 名前:デフォルトの名無しさん mailto:sage [2023/02/01(水) 15:31:55.23 ID:4CkJdapD.net]
- 脳死でdyn Error突っ込んでるやつです
- 302 名前:デフォルトの名無しさん mailto:sage [2023/02/01(水) 15:34:50.34 ID:ypE1x0h9.net]
- dyn Errorで受け取った後の活用法が分からん
- 303 名前:デフォルトの名無しさん mailto:sage [2023/02/01(水) 17:49:22.59 ID:HDxpsRMp.net]
- dyn Errorでできるのは
・print!とかwrite!でログ出力する (ErrorトレイトにDebugとDisplayが内包されてるからちゃんと実装されてれば何か教えてくれる) ・source()で内部のdyn Errorを掘り起こす (エラーの原因のエラーがあれば一緒にログ出力できる) くらいだからログ出力以上の活用がしたいならそのためのError型を使わないといけない
- 304 名前:デフォルトの名無しさん [2023/02/01(水) 18:15:38.74 ID:pHJayYFi.net]
- >>302
具体的なエラーの型で分岐させたいならダウンキャストが必要(The Bookにも書いてたはず) エラーenumを定義してwrapしたものに変換(map_err)しておけばダウンキャストは不要 anyhowに組み合わせてthiserrorの#[from]や#[error(transparent)]を使うと楽にwrapできる anyhow/thiserrorのやってることに最初から自力で辿り着くのは大変だから先に使ってみて必要な要素を学んだ方が早いよ
- 305 名前:デフォルトの名無しさん mailto:sage [2023/02/01(水) 19:06:46.56 ID:JRuvbVor.net]
- >>303
dynはErrorに限らず自由に元へ戻せるよ 例えばstd::io::Errorを含むdyn Errorが返ってきた時 if let Some(io_err) = dyn_err.downcast_ref::<io::Error>() { match io_err.kind() { io::ErrorKind::NotFound => { このように細かいエラーハンドリングが可能 >>304 順序が逆だよ まずは標準ライブラリ内で上記のようにdyn Errorを使ったり あるいはdynを使わずにimpl From<MyError> for io::ErrorでMyErrorのEnumに格納する「?」時の自動変換を書いたり それぞれ簡単で単純なパターンなのだから標準ライブラリで基礎を身に着けた上で自作や外部のライブラリを選ぶのがお勧め
- 306 名前:デフォルトの名無しさん mailto:sage [2023/02/01(水) 19:07:10.38 ID:sE34HuOS.net]
- >>290
例外をサポートしているような言語なら、投げる例外を関数のインターフェイスとしてドキュメントに記載する。 Rustなら>>292 >考え方が逆なの、自分に関与しない例外は触らない >290が>285 >286を理解できない無能だということは理解できた。 c++とかでライブラリ関数からドキュメントに無い例外を投げられた経験が無いんだろうな。おめでたい。
- 307 名前:デフォルトの名無しさん mailto:sage [2023/02/01(水) 19:18:58.38 ID:RjOpz7Dl.net]
- 単発無能認定おじさん
- 308 名前:デフォルトの名無しさん mailto:sage [2023/02/01(水) 19:27:56.01 ID:JRuvbVor.net]
- >> ライブラリならドキュメントに書いてあるでしょ
ドキュメントは言語システムの一部ではないため ミスで現実のコードとドキュメントが食い違っていることもあれば ドキュメントは正しくても利用者が見落としてしまうこともある 大規模な開発になればなるほどミスや見落としが紛れ込むことは避けられない 特にエラー処理が済んでいるか未だなのかは致命的になりかねない 一方でRustは言語システムの中で下位関数からエラーが上がってくるか処理済か分かる さらにResultが未処理のままだとRustコンパイラが指摘してくれる 言語システムとして少なくともこれらの機能を持つ言語へと今後は移行していくべき流れ
- 309 名前:デフォルトの名無しさん [2023/02/01(水) 21:57:57.91 ID:qgBIsers.net]
- >>305
>それぞれ簡単で単純なパターンなのだから 実装の簡単さやパターンの単純さが問題じゃないんだよ Rustのエラー処理に必要な「それぞれ簡単で単純なパターン」を網羅的に知識として仕入れてRustのエラー処理はこうやってやるものだと自信を持って言えるようになるまでの学習効率の問題 anyhow/thiserrorはそのパターンを楽に使えるよう作られてるから「ああRustのエラー処理ってこうやればいいんだな」ってのが標準ライブラリ前提で学ぶより断然早く理解できる
- 310 名前:デフォルトの名無しさん mailto:sage [2023/02/01(水) 22:05:04.46 ID:JRuvbVor.net]
- >>309
dynの取り扱いと「?」オペレータによる自動変換はRustの基本事項で必須の知識 もちろん標準ライブラリの中で完結して使えるしシンプル仕組みなのですぐ使えるようになる この基本を習得せずに外部ライブラリへ行くことを勧めるのは基本知識を欠いた人を生み出してしまう愚かな行為
- 311 名前:デフォルトの名無しさん [2023/02/01(水) 22:25:39.32 ID:JqtaL/Do.net]
- >>310
もしかしてパターンってdyn Errorと?オペレータ使った自動変換の話だけなの? それだけじゃRustで現実的にどうエラー処理を実装すべきかThe Book読み終えたくらいの人にはわかんないと思うよ
- 312 名前:デフォルトの名無しさん mailto:sage [2023/02/01(水) 22:59:41.62 ID:JRuvbVor.net]
- >>311
エラー処理パターンは様々な方針があり その前提知識としての共通の必須事項として今回のスレの流れで話が出て来ていたdynの取り扱いと?での自動変換の話を書いた 例えばあなたが出したanyhowはdyn Errorを扱う外部ライブラリの一種 anyhow::Errorから具体的な型を取り出すためには>>305で書いたdynの取り扱い知識が必須 この知識を知らないと細かいエラー分類が出来ずにエラー表示のみしか出来ない人になってしまう もう一つあなたが出したthiserrorも?での自動変換を用いる外部ライブラリ(というかマクロ)の一種 >>305で示したFrom::from()による自動変換の基礎知識を欠いたままでは仕組みすら分からず魔法のように外部ライブラリを使うダメな人になってしまう 応用が効かないだけでなく利用していて何か問題にハマった時に基本知識がないと解決することもできない
- 313 名前:デフォルトの名無しさん [2023/02/02(木) 00:32:13.04 ID:y8eaHXgz.net]
- >>312
設計やプラクティスとしてのパターンのことを言ってたんだが君は言語機能のことをパターンと呼んでるみたいで噛み合ってないよね dyn Errorや?オペレータ使ってinto経由で変換されるような基本的な機能面の知識はThe Bookにも書かれてるレベルだし多少分からなくてもリファレンス読めばいいだけの話 でもそれだけの知識でRust初心者がエラー周りの実践的な設計をできるようにはならないでしょ
- 314 名前:デフォルトの名無しさん mailto:sage [2023/02/02(木) 00:53:57.92 ID:tzaW+blt.net]
- anyhow/thiserrorは最近出てきた新興ライブラリ
当然それまでは誰も使っていなかったわけで初心者がいきなり必須なものでもない 初心者にとっては複雑で機能過多で理解しにくいのでまずは標準ライブラリから始めたほうが良いかな
- 315 名前:デフォルトの名無しさん mailto:sage [2023/02/02(木) 01:38:05.78 ID:JL6WsU2I.net]
- 対象年齢付きのおもちゃか何か?w
自分だけ勝手に縛ってろw
- 316 名前:デフォルトの名無しさん mailto:sage [2023/02/02(木) 03:39:28.87 ID:S9qGtTXE.net]
- Rustは「教官付き教習車」だよ。
cとかと違ってアホが膝を撃ち抜く自由は許さない。 それが嫌ならRust止めれば?
- 317 名前:デフォルトの名無しさん mailto:sage [2023/02/02(木) 07:11:05.90 ID:02L2EQ2o.net]
- Rustはコンパイラの防波堤の中で安全な自由があるけどそれはともかく
クセの強いanyhowをRustの基本より先に初心者に教えるのはあかんよ たとえば、他人も使うライブラリ作成ではanyhowの使用を避ける、といった当たり前のことも エラーに関する基本を知らないと陥ってしまう
- 318 名前:デフォルトの名無しさん mailto:sage [2023/02/02(木) 07:31:00.57 ID:c3pJ+FwE.net]
- >>316
rustの免許とりたいんですがおすすめの教習所はありますか?w
- 319 名前:デフォルトの名無しさん mailto:sage [2023/02/02(木) 07:34:23.41 ID:/W20jYzd.net]
- anyhowはもはや標準ライブラリでしょ
- 320 名前:デフォルトの名無しさん mailto:sage [2023/02/02(木) 07:55:32.16 ID:Cx26n0QZ.net]
- >>317
あれはクセというよりanyhowの致命的な欠陥だ 分かってる人は配慮して閉じた環境だけで使うけど稀に公開ライブラリにanyhow使っちゃう無知な人もいる 基礎知識はホント一番大事
- 321 名前:デフォルトの名無しさん mailto:sage [2023/02/02(木) 08:05:47.28 ID:VrfwqxiC.net]
- >>318
コンパイラ(教官)はひとつしか無いから選択肢は無いよ。
- 322 名前:デフォルトの名無しさん mailto:sage [2023/02/02(木) 08:14:13.18 ID:eMZEpDOV.net]
- コードを貼るわけでも実装例を示すわけでもない時点でシッタカだろ
- 323 名前:デフォルトの名無しさん mailto:sage [2023/02/02(木) 09:11:33.63 ID:ICVq01Bq.net]
- anyhow勧めてる人自身があんまり理解してないんだと思う
- 324 名前:デフォルトの名無しさん mailto:sage [2023/02/02(木) 12:40:03.75 ID:8vdGQp5R.net]
- 複オジが使ったことないだけだろ
>>312も今調べてきました感満載じゃん デファクトスタンダードになってるライブラリまで排除したらrustでは何もできんぞ
- 325 名前:デフォルトの名無しさん mailto:sage [2023/02/02(木) 12:47:49.51 ID:YyXCj6j+.net]
- オライリー本にも実戦ではanyhowとthiserrorを使えと書いてる
- 326 名前:デフォルトの名無しさん mailto:sage [2023/02/02(木) 12:59:53.51 ID:c3pJ+FwE.net]
- >>321
うまいこといいますね。お見事!
- 327 名前:デフォルトの名無しさん mailto:sage [2023/02/02(木) 13:20:28.44 ID:C8PK02xw.net]
- 禁忌事項はライブラリを作って提供する時にanyhowを使ってしまうことだけだから
そこはanyhowを使わずにthiserrorを使えばヨシ
- 328 名前:デフォルトの名無しさん mailto:sage [2023/02/02(木) 15:47:50.42 ID:HD9HoUeH.net]
- 別にanyhowをthiserrorに差し替えるのも大した手間じゃないしな
ライブラリで使っちゃってるなら変更PRでも出してやれば良い
- 329 名前:デフォルトの名無しさん mailto:sage [2023/02/02(木) 23:07:11.98 ID:3wRXRcn7.net]
- >>325
anyhowとthiserrorを使うなと言ってる人は誰もいなくて ・まず先にstd::error::Errorを覚えよう ・次に?変換とdynダウンキャストを覚えよう ・そしてanyhowとthiserrorへ進もう という話でしょ そうすればanyhowをライブラリで使うべきでない理由もわかるでしょうし
- 330 名前:デフォルトの名無しさん mailto:sage [2023/02/02(木) 23:14:43.66 ID:3quZbai0.net]
- Rustの世界でダウンキャストってなんかキモいな
- 331 名前:デフォルトの名無しさん mailto:sage [2023/02/02(木) 23:37:26.35 ID:wswA48V7.net]
- むしろRust基盤の一つ
downcastはエラー処理に限らずdyn Traitを元の型に戻すために必須 anyhowでも元のエラー型に戻すために必須
- 332 名前:デフォルトの名無しさん mailto:sage [2023/02/02(木) 23:53:43.61 ID:86yN0Q3V.net]
- ダウンキャストのソース見てみたら
やっぱりunsafeのかたまりだった
- 333 名前:デフォルトの名無しさん mailto:sage [2023/02/02(木) 23:53:52.64 ID:QEJ+oT50.net]
- ダウンキャストを知らないと
>>303のようにdyn Errorで出来ることはログ出力だけと思いこんでしまう
- 334 名前:デフォルトの名無しさん mailto:sage [2023/02/02(木) 23:59:01.23 ID:Cx26n0QZ.net]
- >>332
当たり前 Rustの標準ライブラリはunsafeだらけ 原理的にunsafeは避けられないからそれを安全なインターフェイスとして公開するのがRustの標準ライブラリ
- 335 名前:デフォルトの名無しさん mailto:sage [2023/02/03(金) 00:57:17.44 ID:teLYlQt8.net]
- dynを元の型に戻すという発想に違和感(気持ち悪さ)を感じる人もいると思う
元の型に戻すつもりならそもそもdynにしないというか ダウンキャストは戻すべき型(の変更)を全部把握できる閉じた状況じゃないと使いにくい
- 336 名前:デフォルトの名無しさん mailto:sage [2023/02/03(金) 01:37:41.39 ID:VgIBWdEw.net]
- >>335
anyhowを使うのはそういう全部把握できる閉じた状況で 独自エラー型を用意するのが面倒な時に使うからダウンキャストが理に適っている 嫌ならanyhow使わずにthiserrorを使えばよい
- 337 名前:デフォルトの名無しさん mailto:sage [2023/02/03(金) 07:58:09.95 ID:+r7mcEDE.net]
- >>335
型を全て把握しておく必要はない 例えばエラー処理で大半はエラー表示のみだが一部だけ特別な処理をしたいとすると その処理したいエラー型のみダウンキャストして使えばいい ちなみにダウンキャストは内部で定数のu64で表現される型番号をu64比較するだけなのでコストがかかるものではない
- 338 名前:デフォルトの名無しさん mailto:sage [2023/02/03(金) 08:54:57.66 ID:Vma9tJMI.net]
- ダウンキャストの扱いかどうか知らんが、パターンマッチングも総和型から個別型ヘのキャストみたいなもんだろ。
- 339 名前:デフォルトの名無しさん mailto:sage [2023/02/03(金) 09:11:06.24 ID:+r7mcEDE.net]
- もしdyn使わずに自作Enum収容エラー型を定義して使っても
Enumタグ比較で分岐することになるから状況は似たようなもの
- 340 名前:デフォルトの名無しさん mailto:sage [2023/02/03(金) 09:18:29.47 ID:H94wvEsC.net]
- std::any::Any.downcast_ref() を使わずにanyhow独自に実装してるね
- 341 名前:デフォルトの名無しさん mailto:sage [2023/02/03(金) 09:36:29.67 ID:e19a6Rdo.net]
- 初めて間もないけど
println!("{}", a); とか手が攣って辛い tabでもprintlnまでしかでないしコピペでもしてるの?
- 342 名前:デフォルトの名無しさん mailto:sage [2023/02/03(金) 09:43:50.06 ID:90dUFc67.net]
- downcastすればいいだけだからdyn Error返してもデメリットは無いってのなら
ライブラリでanyhowを使うのも大した問題じゃないって結論になるん?
- 343 名前:デフォルトの名無しさん mailto:sage [2023/02/03(金) 10:26:25.61 ID:5QmoSp+n.net]
- >>342
anyhowの問題点はそこではない anyhowは最も重要なことを実装していない(不可能)という欠点があるため
- 344 名前:デフォルトの名無しさん mailto:sage [2023/02/03(金) 10:31:15.17 ID:Vma9tJMI.net]
- >>343
anyhowの問題点なんて一般的じゃないんだから、曖昧に言わずに具体的に説明しなよ。
- 345 名前:デフォルトの名無しさん mailto:sage [2023/02/03(金) 10:48:35.31 ID:yQvnFmTM.net]
- 予言しよう
ググれば分かるんだから書かないとか言って絶対に具体的な説明はしないやつだよ
- 346 名前:デフォルトの名無しさん mailto:sage [2023/02/03(金) 12:00:34.82 ID:7ZLHWUFf.net]
- 俺はなんも知らんから頭の片隅に覚えておくくらいにしとくわ
使うときに調べる
- 347 名前:デフォルトの名無しさん mailto:sage [2023/02/03(金) 12:23:43.68 ID:dwx7vokg.net]
- >>345
検索しても出てこなかったよ。
- 348 名前:デフォルトの名無しさん mailto:sage [2023/02/03(金) 12:37:16.79 ID:tbHpIbwJ.net]
- Rustでエラー型はstd::error::Errorトレイトを実装するのが共通のお約束だけど
anyhow::Errorは諸事情あって実装されていないんよ std::error::Errorトレイト実装を前提として扱っているところへライブラリがanyhow::Errorを返しちゃうと困っちゃう ライブラリを作るときはthiserrorでエラー型を作ればstd::error::Errorトレイトを自動で実装してくれるから大丈夫だよ もちろんthiserror使わずに自分で実装してもいいよ
- 349 名前:デフォルトの名無しさん mailto:sage [2023/02/03(金) 15:29:10.83 ID:Vma9tJMI.net]
- >>348
「このライブラリはanyhow対応必須です。anyhow対応しないと使えません」 ならOKかね。
- 350 名前:デフォルトの名無しさん mailto:sage [2023/02/03(金) 18:59:27.03 ID:NDb3ccU3.net]
- Box<dyn Error>もErrorトレイト実装してないよ(コンフリクトで実装できない)
その点はdyn Errorで返してもanyhowで返しても大差ない libraryのpublicなAPIでtype erasedなエラーを返したいときは Errorを実装した独自のエラー型を用意するのが普通 anyhowで返してる有名ライブラリもあるけどね ライブラリでanyhow使ったらダメなんてことは特にないんだけど Readme読めばすぐわかるように基本的にはアプリケーション用 なぜ同じ作者のエラー系のライブラリがanyhowとthiserrorと2つあるんだろうか? と疑問に持つだけでも初心者はstdベースで学習するよりも1歩先に進めてる
- 351 名前:デフォルトの名無しさん mailto:sage [2023/02/04(土) 00:38:01.54 ID:5aCWsuCk.net]
- ダウンキャストは静的チェックできず変更に弱いからホイホイ使うものじゃないよ
- 352 名前:デフォルトの名無しさん mailto:sage [2023/02/04(土) 07:20:32.73 ID:eqpqpGi8.net]
- >>351
ダウンキャストは静的に型を指定して Some()で静的な型で値が返ってきて その値の使用も静的に型チェックされる 「マッチングが動的ではないか?」については Enumで複数の型を収容した場合と全く同じ どちらの場合もマッチングは動的に行われるが静的に型チェックされる どちらも静的に型を抽象化した定数の整数値との比較によるマッチングとなる点も同じ
- 353 名前:デフォルトの名無しさん mailto:sage [2023/02/04(土) 09:46:17.84 ID:4OrKEijd.net]
- ばかばかc
- 354 名前:デフォルトの名無しさん mailto:sage [2023/02/04(土) 09:59:08.11 ID:wSUDs8sY.net]
- Rustのdynとそのdowncastは安全性と最小限のコストを両立させており安心して使える
引数などでimpl Traitが使える場合はimplが有利なケースもあるが 返値などでdyn Traitしか使えない場合もあり適材適所で使い分け
- 355 名前:デフォルトの名無しさん mailto:sage [2023/02/04(土) 10:30:58.71 ID:yB06Lfm4.net]
- >>352
よくわかってないものを人に勧めちゃダメだよ
- 356 名前:デフォルトの名無しさん mailto:sage [2023/02/04(土) 12:22:28.04 ID:eqpqpGi8.net]
- 久々に荒らし発生かな
- 357 名前:デフォルトの名無しさん mailto:sage [2023/02/04(土) 12:44:13.93 ID:vEFKnpWX.net]
- ダウンキャストの安全性みたいなのは downcast_ref 使ってりゃ議論の余地はないと思うけど網羅性は限界があるわね。
ライブラリはやっぱエラー型を明示すべき。
- 358 名前:デフォルトの名無しさん mailto:sage [2023/02/04(土) 13:10:09.04 ID:QerlffZr.net]
- match式によるパターンマッチでは、そのマッチアームによる条件網羅性がコンパイル時に検証される。
enumとmatch式は相性抜群だよな。 https://doc.rust-jp.rs/book-ja/ch06-02-match.html#%E3%83%9E%E3%83%83%E3%83%81%E3%81%AF%E5%8C%85%E6%8B%AC%E7%9A%84
- 359 名前:デフォルトの名無しさん mailto:sage [2023/02/04(土) 13:39:49.84 ID:A1ugYU/e.net]
- エラー処理で網羅性は関係ないだろ
std::io::Errorのenum ErrorKindからしてnon_exaustive指定だぞ match式で網羅性はチェックされない 特別な処理が必要なエラーだけ処理対応して残りはエラー表示が普通だ
- 360 名前:デフォルトの名無しさん mailto:sage [2023/02/04(土) 13:52:58.01 ID:RtFCJdnN.net]
- エラー処理で重要なことは
・エラーが発生しているにも関わらずそのまま通常処理を進めないこと ・エラー表示以外の対応を必要とするエラーの場合にその対応をすること ・それ以外のエラーはエラー表示などをすること enumタグレベルの網羅性を求められることはないな
- 361 名前:デフォルトの名無しさん mailto:sage [2023/02/04(土) 14:46:52.23 ID:7PnUG+Eh.net]
- 元々の話はdyn Errorかanyhowか、だったような気がするけど、
anyhowはdyn Errorの自作ラッピングみたいなもので、 とちらを使ってもダウンキャストしなきゃいけない点も網羅性がない点も同じだよね。 そしてそれらをアプリ側で使ってる限り困ることもない。
- 362 名前:デフォルトの名無しさん mailto:sage [2023/02/04(土) 17:06:34.73 ID:1vu2ZDPp.net]
- そもそもがダックタイピングとか向いてる言語じゃない。
フロントでこの言語使おうとするとかただのバカでしかないわ。
- 363 名前:デフォルトの名無しさん mailto:sage [2023/02/04(土) 17:36:37.29 ID:roDrLtFP.net]
- 唐突にフロントとかダックタイピングとかどうした?
しかもその二つも関連性がない
- 364 名前:デフォルトの名無しさん mailto:sage [2023/02/04(土) 18:06:27.05 ID:uIknpDmG.net]
- 上位レイヤーも含めてエラーの内容によって分岐したいならdyn Errorはやめたほうがいい
- 365 名前:デフォルトの名無しさん mailto:sage [2023/02/04(土) 18:34:38.01 ID:srvPtSil.net]
- 分岐にenumのタグを使うかErrorの型名を使うかの違いでしょ
enumを使うと一貫性を担保しやすいから保守性が向上するし dyn Errorを使うとenumの定義を省略できるからコードを減らせる 自分は(分岐するなら)enum派だけど何を重視するかで結論が変わりそう ただ「やることが一緒だからどっちも同じ」と考えはいただけない
- 366 名前:デフォルトの名無しさん mailto:sage [2023/02/04(土) 18:40:15.09 ID:3y1LLse5.net]
- >>364
dyn Errorをやめるべき理由がない まさかと思うが代わりにanyhow使えとか言い出すんじゃないんだろうな?
- 367 名前:デフォルトの名無しさん mailto:sage [2023/02/04(土) 19:00:20.00 ID:eqpqpGi8.net]
- dyn Errorもダウンキャストも使用して全く問題ないよ
有名どころでも普通に使われている 例えばreqwestはdyn Errorを使っていてdowncast_ref()してエラー処理している cargoはanyhowを使っていてdowncast_ref()してエラー処理している 使うのをやめたほうがいいと主張している人は一種の宗教にすぎないことに気付こう
- 368 名前:デフォルトの名無しさん mailto:sage [2023/02/04(土) 22:40:19.42 ID:JjHQagj1.net]
- 勘違いしてる内容が同じだから
自演しまくっても同一人物なの丸分かりだね ダウンキャストオジ==複オジ
- 369 名前:デフォルトの名無しさん mailto:sage [2023/02/05(日) 02:20:20.64 ID:VCqNNrEk.net]
- 無敵やな
もちろんいい意味で
- 370 名前:デフォルトの名無しさん mailto:sage [2023/02/05(日) 02:25:01.54 ID:a/eU++XN.net]
- 一年ぐらい前にanyhowを標準化する、みたいな話なかったっけ?
- 371 名前:デフォルトの名無しさん mailto:sage [2023/02/05(日) 02:59:04.83 ID:26rYdUrG.net]
- anyhowはダウンキャストするしかないクソ
- 372 名前:デフォルトの名無しさん [2023/02/05(日) 06:00:11.27 ID:TqN0qcyT.net]
- オライリーの本って出てから1年経つけどさあ
これの電子版って、セールになったりする機会ってあるもんなの?
- 373 名前:デフォルトの名無しさん mailto:sage [2023/02/05(日) 06:31:13.67 ID:qzS4+JVd.net]
- ダウンキャストを毛嫌いしてる人の心理を知りたい
- 374 名前:◆??? [2023/02/05(日) 12:21:29.64 ID:gCGZ2Fk+q BE:2843802656-2BP(0)]
- std::mem::transmute
- 375 名前:デフォルトの名無しさん mailto:sage [2023/02/05(日) 12:11:30.30 ID:vL4nY6Md.net]
- >>359-360
おまえはまるで何もわかってないのな エラーハンドリングの基礎すらおさえてないじゃん 無知なのはいいが自信満々で嘘を書きまくるのはやめろ
- 376 名前:デフォルトの名無しさん mailto:sage [2023/02/05(日) 12:37:36.14 ID:yQ5U4c14.net]
- 作るシステムの性質や分野ごとで許されるエラーハンドリングは別物だからね。
ミッションクリティカルだけが正解ってわけでもないのよ。
- 377 名前:デフォルトの名無しさん mailto:sage [2023/02/05(日) 14:02:09.96 ID:dIeXO9aa.net]
- >>376
何がまちがってるかさえも分からないようならThe Bookを一から読み直して出直してこい
- 378 名前:デフォルトの名無しさん mailto:sage [2023/02/05(日) 14:22:39.74 ID:Ib1Yzzhk.net]
- たまに出てくる「間違っている」「勘違いしてる」「嘘を書くな」の人
今までも文句をつけるだけで正確を書いたことがないから信頼できないのよね
- 379 名前:デフォルトの名無しさん mailto:sage [2023/02/05(日) 14:23:18.13 ID:8OOQa3AE.net]
- どっちも自分の脳内シチュでしか語ってないからふわっふわで論破出来るわけもなし
自分の主張が通る具体例上げるといいよ
- 380 名前:デフォルトの名無しさん mailto:sage [2023/02/05(日) 14:35:53.55 ID:LY0V54Tb.net]
- 「カッコウのアルゴリズムさえまともに実装できてないからクソ遅いんだよな」
みたいに適当なワード混ぜて意味不明なこと言いつつ同意してる風を装うと「そうなんだよ!」とか勝手に乗っかってきて自爆するから面白いぞ
- 381 名前:デフォルトの名無しさん mailto:sage [2023/02/05(日) 15:42:56.66 ID:XUJKjP/6.net]
- >>378
それは信頼以前に、相手にしなくていい外野 >>380 すごく目に見えるわその展開w
- 382 名前:デフォルトの名無しさん mailto:sage [2023/02/05(日) 15:53:21.98 ID:ANWYibFj.net]
- >>373
台所まで行けば箸(enum)があるのに手元のフォークで焼きそばを食べてる感じ 食べてるのがパスタ(Python)なら平気なんだけど
- 383 名前:デフォルトの名無しさん mailto:sage [2023/02/05(日) 16:01:07.42 ID:3wawDpMD.net]
- >>382
微妙にわかりにくい例えで草 でも複オジに比べると1000倍マシ
- 384 名前:デフォルトの名無しさん mailto:sage [2023/02/05(日) 16:04:59.96 ID:0ZBI/vwq.net]
- >>378
信頼するかどうかはあなた次第 >>359-360が嘘だらけだということが分からない人は基礎がなってないから勉強やり直すかパスタにするか
- 385 名前:デフォルトの名無しさん mailto:sage [2023/02/05(日) 17:40:20.51 ID:X5wQdMGf.net]
- 網羅性が必要ないならResult使う必要もRustを使う必要もないわな
- 386 名前:デフォルトの名無しさん mailto:sage [2023/02/05(日) 18:32:46.51 ID:rtbv+KUs.net]
- >>382
凄い納得 enum使わずにanyhow使うような連中はPythonでも使っていろ anyhowなんてものがあるから勘違いが起こる
- 387 名前:デフォルトの名無しさん mailto:sage [2023/02/05(日) 20:10:29.95 ID:QsKcw+fO.net]
- cargo crateのコード見てみた
anyhowを使ってエラーを上へ上げていく enumを使っておらずエラーの網羅性はない downcast_refを使ってエラー分岐している
- 388 名前:デフォルトの名無しさん mailto:sage [2023/02/05(日) 20:38:51.85 ID:1L9Nz43N.net]
- エラーなんて作成時点で未知のものが後から増えることもザラだし
何なら抽象レイヤー以下の実装の差し替え(ストレージのネットワーク化とか)で 動的に増えたりすることもあるんだから、網羅性とかすぐ成り立たなくなる。 可能なところで逃すものじゃないけど、こだわるものでもない。
- 389 名前:デフォルトの名無しさん mailto:sage [2023/02/05(日) 21:15:55.10 ID:yQ5U4c14.net]
- cargo みたいに手元や CI で実行するツールのエラー処理なんてその程度で十分ってこった。
もちろん、網羅が必要な領域のコードじゃそんなエラーハンドリングのやりかたじゃあ駄目だろうよ。
- 390 名前:デフォルトの名無しさん mailto:sage [2023/02/05(日) 21:31:31.79 ID:kVul7/Hf.net]
- 多数の下部ライブラリから色んなエラーが上がってくるreqwestはそれらをdyn std::error::Errorへ入れているね
そしてdowncast_refで必要な分岐をして処理しているね エラー処理はこれで十分でしょ 網羅しなくても残りは最終的にちゃんとエラー表示されるのだから
- 391 名前:デフォルトの名無しさん mailto:sage [2023/02/05(日) 22:59:47.83 ID:cfofmdL5.net]
- エラー処理で必須な網羅性とはenumの網羅性とは異なる
いつどこでどんなエラーが発生しても必ず処理されることがエラー処理の網羅性 つまりエラー処理されないまま通常処理に進まないことでありRustではResultの利用によりそれが保証されている したがってdyn Errorを使って一部をダウンキャストによりエラー処理し残りをエラー表示処理でも網羅性を満たしている
- 392 名前:デフォルトの名無しさん mailto:sage [2023/02/05(日) 23:51:35.27 ID:BjcIBdbF.net]
- opaqueなerror typeを使うメリットは何なのか?デメリットは何なのか?
少なくともreqwestの開発者はそのトレードオフを検討した上で判断を下している メリットもデメリットも理解できてないやつが珍説唱えても虚しいだけだぞ
- 393 名前:デフォルトの名無しさん mailto:sage [2023/02/05(日) 23:54:47.07 ID:arvSMdBl.net]
- >>391
おまえはエクストリームな言い訳並べ立てる前にnon_exhaustiveの意味から調べろな
- 394 名前:デフォルトの名無しさん mailto:sage [2023/02/05(日) 23:58:58.86 ID:QsKcw+fO.net]
- >>391
やっぱりそれでいいのか Rustの標準IOライブラリはenumを使っているけどnon_exhaustive指定がしてありenumの網羅性チェックをむしろ使えないようにしてる
- 395 名前:デフォルトの名無しさん mailto:sage [2023/02/06(月) 00:09:01.18 ID:ZXNgtENY.net]
- >>391
一般的なエラー処理の網羅性はその解釈だな Rustでは型システムと返り型Result及びResult放置をコンパイラが警告してくれるため必ず網羅される仕組み
- 396 名前:デフォルトの名無しさん mailto:sage [2023/02/06(月) 01:23:09.90 ID:Kt6dB8yb.net]
- >>394
non_exhaustive指定があると なぜenumの網羅性チェックが使えないの?
- 397 名前:デフォルトの名無しさん mailto:sage [2023/02/06(月) 06:52:59.94 ID:OJBoAdFu.net]
- 逆だよ
網羅性の扱いを禁止するために意図的にnon_exhaustive指定されている そのようなエラーの種類には網羅性は必要がないだけでなく 今後もしエラーの種類が増えた場合に全網羅列挙して使用している既存のコードがエラーとなってしまう そのためこういう時は不要である網羅性の扱いを禁止して全列挙コードを書かせないことで 今後エラーの種類が増えても既存の利用コードに影響を与えずに済む仕組み
- 398 名前:デフォルトの名無しさん mailto:sage [2023/02/06(月) 12:30:43.08 ID:wr+6RDlb.net]
- >>397
自信満々に間違った情報を中身のない文章で膨らませてもっともらしく見せようとするところがChatGPTそっくりww
- 399 名前:デフォルトの名無しさん mailto:sage [2023/02/06(月) 12:48:04.84 ID:/nZ/7Knj.net]
- 昔ながらの例外論争見てるみたいだ
全部取ればいいいや個別だ
- 400 名前:デフォルトの名無しさん mailto:sage [2023/02/06(月) 14:14:21.50 ID:C/yeK4bx.net]
- >>397で合っているけど補足すれば
全網羅列挙コードを書いてもコンパイラがそれを許さずエラーとなる 全網羅列挙しなくていいから必ず全マッチの _ => アームをコンパイラが要求してくる つまりコンパイラによるエラーの網羅性チェックは不可能
|

|