公式
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
215デフォルトの名無しさん
2023/01/31(火) 09:12:07.56ID:YNMDboNb >>210
panicはバグとかメモリー不足とかでどうしようない状態になったときに呼び出されるもので通常のエラー処理なんてできないってことぐらい理解しなよ
panicはバグとかメモリー不足とかでどうしようない状態になったときに呼び出されるもので通常のエラー処理なんてできないってことぐらい理解しなよ
216デフォルトの名無しさん
2023/01/31(火) 09:18:10.08ID:7I30yv0f >>213
そういう使い方をしたいならば例えばライブラリA,B,Cに対してMyErrorをEnumでErrorA,ErrorB,ErrorC各収容した方が扱いやすさも効率も良い
そのEnumに格納するだけのコードimpl From<MyError> for ErrorAしておくだけで簡単
そういう使い方をしたいならば例えばライブラリA,B,Cに対してMyErrorをEnumでErrorA,ErrorB,ErrorC各収容した方が扱いやすさも効率も良い
そのEnumに格納するだけのコードimpl From<MyError> for ErrorAしておくだけで簡単
217デフォルトの名無しさん
2023/01/31(火) 09:23:20.28ID:cRk5v+aU >>216
全部自動でやってよ
全部自動でやってよ
218デフォルトの名無しさん
2023/01/31(火) 09:28:45.86ID:7I30yv0f >>214
Rustでは通過する途中の関数においても"?"オペレータの有無で未処理エラーを上位へ委託しているか否かが明白に分かる
だからコードレビューがしやすいし機能追加やリファクタリングする時にも見落としがない
一方で例外機構のある多くの言語では通過する途中の関数を見ても例外が通過するのか否かすら分からない
範囲を大きく広げて探し回らないといけなくなりムダな作業も発生して不便である
Rustでは通過する途中の関数においても"?"オペレータの有無で未処理エラーを上位へ委託しているか否かが明白に分かる
だからコードレビューがしやすいし機能追加やリファクタリングする時にも見落としがない
一方で例外機構のある多くの言語では通過する途中の関数を見ても例外が通過するのか否かすら分からない
範囲を大きく広げて探し回らないといけなくなりムダな作業も発生して不便である
219デフォルトの名無しさん
2023/01/31(火) 10:14:19.93ID:PU9Vswnw >>205
自分のcrate用にエラーenumを定義して下位のエラーはそれにwrapするんだよ
その辺を楽させてくれるのがthiserror
カスタムな例外を定義しなくてもBulit-inの例外を使い回すだけで規模の小さいプログラムなら書ける例外+継承のある言語とは違うところ
Rustの場合はioエラーのみとかじゃなければ常にエラーenumを書くようになる
自分のcrate用にエラーenumを定義して下位のエラーはそれにwrapするんだよ
その辺を楽させてくれるのがthiserror
カスタムな例外を定義しなくてもBulit-inの例外を使い回すだけで規模の小さいプログラムなら書ける例外+継承のある言語とは違うところ
Rustの場合はioエラーのみとかじゃなければ常にエラーenumを書くようになる
220デフォルトの名無しさん
2023/01/31(火) 10:15:37.08ID:YNMDboNb221デフォルトの名無しさん
2023/01/31(火) 10:18:35.43ID:7I30yv0f222デフォルトの名無しさん
2023/01/31(火) 10:29:38.37ID:7I30yv0f >>220
中間関数は関与していないのではなくcatchしないことで例外エラーを上位へ移譲している
機能追加やリファクタリングではその処理位置が変わり得るから無関係ではなく把握する必要がある
同じことをRustならば上位への移譲があるか否かが明確に分かるため非常にやりやすい
中間関数は関与していないのではなくcatchしないことで例外エラーを上位へ移譲している
機能追加やリファクタリングではその処理位置が変わり得るから無関係ではなく把握する必要がある
同じことをRustならば上位への移譲があるか否かが明確に分かるため非常にやりやすい
223デフォルトの名無しさん
2023/01/31(火) 10:37:25.48ID:YNMDboNb >>222
> 機能追加やリファクタリングではその処理位置が変わり得るから無関係ではなく把握する必要がある
そりゃその関数が関与するような修正するならな、当たり前
でも全ての関数が毎回関与するわけじゃないだろ
なんかダメな理由を必死に探してるとしか思えないけど
> 機能追加やリファクタリングではその処理位置が変わり得るから無関係ではなく把握する必要がある
そりゃその関数が関与するような修正するならな、当たり前
でも全ての関数が毎回関与するわけじゃないだろ
なんかダメな理由を必死に探してるとしか思えないけど
224デフォルトの名無しさん
2023/01/31(火) 10:41:06.15ID:7I30yv0f225デフォルトの名無しさん
2023/01/31(火) 11:26:55.99ID:5zDIQfkR メモリ不足でパニックとか言っている時点で全く判かっていないの草
メモリのアロケーションに失敗した場合パニックしてもその動作は保証されない
なぜならスタックの巻き戻し中にメモリのアロケーションが試みられないことを保証するのは難しいからだ
そのアロケーションに失敗した場合に二重パニックになる
パニック時にアボートする場合は別だが、その場合はリソースやロックの開放もれが発生する可能性があるね
メモリのアロケーションに失敗した場合パニックしてもその動作は保証されない
なぜならスタックの巻き戻し中にメモリのアロケーションが試みられないことを保証するのは難しいからだ
そのアロケーションに失敗した場合に二重パニックになる
パニック時にアボートする場合は別だが、その場合はリソースやロックの開放もれが発生する可能性があるね
226デフォルトの名無しさん
2023/01/31(火) 11:52:51.31ID:df6faTWR227デフォルトの名無しさん
2023/01/31(火) 11:55:03.20ID:df6faTWR >>226
[補足]
Java などでは、例外を投げるには throw new SomeException(); のようにするが、
C++ では、throw SomeException() のようにする。つまり、前者はヒープから、
後者はスタックから例外オブジェクトを確保する。なので、例外throwそれ自体は
メモリー不足にはならない。
[補足]
Java などでは、例外を投げるには throw new SomeException(); のようにするが、
C++ では、throw SomeException() のようにする。つまり、前者はヒープから、
後者はスタックから例外オブジェクトを確保する。なので、例外throwそれ自体は
メモリー不足にはならない。
228デフォルトの名無しさん
2023/01/31(火) 11:56:57.46ID:eIPLUE+9 Resultでエラーを表現する一番の目的は
抜け漏れなくエラー対応してることを
シグニチャーを見ただけでわかるようにして
簡単に静的チェックができるようにするため
抜け漏れなくエラー対応してることを
シグニチャーを見ただけでわかるようにして
簡単に静的チェックができるようにするため
229デフォルトの名無しさん
2023/01/31(火) 12:41:27.68ID:YNMDboNb >>224
いらない情報書かれても読みにくいだけ
いらない情報書かれても読みにくいだけ
230デフォルトの名無しさん
2023/01/31(火) 12:44:13.13ID:+FKSpugG 今日もpanic警察が必死です。MISRA-C警察みたい
231デフォルトの名無しさん
2023/01/31(火) 12:45:18.07ID:YNMDboNb >>225
メモリー不足で動作が保証されないなんて常色だろ
同じくプログラマーの想定外の場合でも動作は保証できないからそういう時は余計なことしないで早期に終了させるしかない
panicってそのためのものだよ
なので個人的にはrustのスタック巻き戻しはやり過ぎだと思ってる
メモリー不足で動作が保証されないなんて常色だろ
同じくプログラマーの想定外の場合でも動作は保証できないからそういう時は余計なことしないで早期に終了させるしかない
panicってそのためのものだよ
なので個人的にはrustのスタック巻き戻しはやり過ぎだと思ってる
232デフォルトの名無しさん
2023/01/31(火) 12:46:06.11ID:YNMDboNb >>230
必要ないと思うなら使わなきゃいいのになぜか鬼の敵みたいになってるの草
必要ないと思うなら使わなきゃいいのになぜか鬼の敵みたいになってるの草
233デフォルトの名無しさん
2023/01/31(火) 12:47:09.57ID:oegPHy5Y panic使う人は使っても困らないような
プログラム開発してるだけ
本人が困ってないならそっとしておけ
プログラム開発してるだけ
本人が困ってないならそっとしておけ
234デフォルトの名無しさん
2023/01/31(火) 12:51:11.39ID:CpP2rI02 panicを使う理由が対応コード書くのがめんどくさいとか見通しとか回復可能でも呼ぶぜってところからきた話なので
回復不能エラーで呼び出された場合とか当たり前なところ話しても議論にもならんやろ
回復不能エラーで呼び出された場合とか当たり前なところ話しても議論にもならんやろ
235デフォルトの名無しさん
2023/01/31(火) 14:46:39.65ID:YNMDboNb > 本人が困ってないならそっとしておけ
と言いながら構わずに居られない>>233であったw
と言いながら構わずに居られない>>233であったw
236デフォルトの名無しさん
2023/01/31(火) 15:00:44.42ID:hwxs0+db 病院行ったほうがいいよ
237デフォルトの名無しさん
2023/01/31(火) 15:03:53.55ID:ylr44mGO >>233
元からそういう話だぞ。panic原理主義者が発狂しているだけで
元からそういう話だぞ。panic原理主義者が発狂しているだけで
238デフォルトの名無しさん
2023/01/31(火) 15:10:39.60ID:3fV3plkN 簡単にpanicされると困るようなプログラム作りたいからこそrust選んだのでは
239デフォルトの名無しさん
2023/01/31(火) 15:39:37.08ID:CAp90nIJ JavaやC#あたりの経験もなくPythonやJavaScriptしか触ったことがない層がRustをやろうとしてるんだろうな
そうでもないと説明がつかない
そうでもないと説明がつかない
240デフォルトの名無しさん
2023/01/31(火) 15:48:38.88ID:BgaMS/KG 言語というよりはエラー種別やドメインエラーをきちんと定義するようなアプリやシステムの開発経験がないからだと思われる
241デフォルトの名無しさん
2023/01/31(火) 15:52:55.96ID:+s4b9MNJ おじおじしてきたな
242デフォルトの名無しさん
2023/01/31(火) 16:06:06.73ID:YNMDboNb 単発ワラワラw
243デフォルトの名無しさん
2023/01/31(火) 16:33:36.83ID:hwxs0+db 自分以外がすべて同一人物が書いたかのように見えるなら病院に行きなさいって
244デフォルトの名無しさん
2023/01/31(火) 16:45:54.71ID:VKWM6Cjq 複オジ2世レベルやな
立場逆転してるのが感慨深い
立場逆転してるのが感慨深い
245デフォルトの名無しさん
2023/01/31(火) 16:51:02.90ID:+s4b9MNJ246デフォルトの名無しさん
2023/01/31(火) 17:01:16.78ID:k74gCp3T レスバしたいだけにしか見えねえ
247デフォルトの名無しさん
2023/01/31(火) 17:26:31.56ID:5mHFhJcn GoとかRustとか例外サポートしなくなった言語、標準でスタックトレースサポートしなくなった辛さにみんなどう対応してるのかね。
エラーメッセージで grep とか、ログからコールスタックを想像とか、かなり辛いんですけど。
エラーメッセージで grep とか、ログからコールスタックを想像とか、かなり辛いんですけど。
248デフォルトの名無しさん
2023/01/31(火) 17:30:47.95ID:fFj0kljj スタックトレースサポートされてるぞ
だかスタックトレースないとどこでエラーが発生したかわからないような作りは見直すべき
だかスタックトレースないとどこでエラーが発生したかわからないような作りは見直すべき
249デフォルトの名無しさん
2023/01/31(火) 18:11:46.10ID:CpP2rI02 古き良きline!マクロ
250デフォルトの名無しさん
2023/01/31(火) 18:25:09.41ID:Qz5B8C78 c++勉強しているけどやっぱりrustっていいんだな
c++の場合どのオーバーロードが足りないかもエラーをチラ見しながら勘で判断するしかない
少なくとも能力の低いワイはそうやって対処している
c++の場合どのオーバーロードが足りないかもエラーをチラ見しながら勘で判断するしかない
少なくとも能力の低いワイはそうやって対処している
251デフォルトの名無しさん
2023/01/31(火) 19:05:37.94ID:Tu8zoz2s 例外連呼しているくせに具体的なことを書かない時点でエアプか煽りなんだろうな
例外機構を持つ処理系はエラー処理を局所化できるメリットがある
同様のメリットをRustで得るにはどのような実装が推奨されるんかな?
例外機構を持つ処理系はエラー処理を局所化できるメリットがある
同様のメリットをRustで得るにはどのような実装が推奨されるんかな?
252デフォルトの名無しさん
2023/01/31(火) 19:31:24.49ID:p+H/rvZ9 そこまで言うなら見せてもらおうか。
スレッド間エラー転送とやらを。
スレッド間エラー転送とやらを。
253デフォルトの名無しさん
2023/01/31(火) 19:36:37.66ID:94wkFUZO254デフォルトの名無しさん
2023/01/31(火) 19:41:28.43ID:7I30yv0f >>229
Rustの利点に対して「いらない情報」と言い張るのはまるでアンチのように悪意があるなあ
可読性の向上という開発効率でのメリットと実行効率のメリットさらにスレッドやコルーチン実装のタスクからも伝播させることができるRust方式は非常に優れているよ
Rustの利点に対して「いらない情報」と言い張るのはまるでアンチのように悪意があるなあ
可読性の向上という開発効率でのメリットと実行効率のメリットさらにスレッドやコルーチン実装のタスクからも伝播させることができるRust方式は非常に優れているよ
255デフォルトの名無しさん
2023/01/31(火) 19:47:33.31ID:YNMDboNb256デフォルトの名無しさん
2023/01/31(火) 19:51:16.79ID:7I30yv0f >>247
Rustは標準でスタックトレースをサポートとしている
何でもいいからコンパイルして実行したことあればRUST_BACKTRACE=1と環境変数をセットすれば出力すると表示されることすら知らないのは不思議
ちなみにstd::backtrace::Backtraceによって自由自在に好きなところでバックトレースをキャプチャすることも出来る
Rustは標準でスタックトレースをサポートとしている
何でもいいからコンパイルして実行したことあればRUST_BACKTRACE=1と環境変数をセットすれば出力すると表示されることすら知らないのは不思議
ちなみにstd::backtrace::Backtraceによって自由自在に好きなところでバックトレースをキャプチャすることも出来る
257デフォルトの名無しさん
2023/01/31(火) 19:56:49.64ID:7I30yv0f258デフォルトの名無しさん
2023/01/31(火) 19:58:31.81ID:iWzBLVlH >>255
254じゃないけど、メリットは分かりやすいけどなぁ。
関数のインターフェイスに、関数の作用に関する情報がまとまっていたらそりゃ便利だろう。
例外を投げる関数の場合、例外に関する情報は関数のマニュアルを参照するかソースを参照するしかないことがほとんどじゃない?インターフェイスを見ただけで例外を把握できる言語てあったっけ?
254じゃないけど、メリットは分かりやすいけどなぁ。
関数のインターフェイスに、関数の作用に関する情報がまとまっていたらそりゃ便利だろう。
例外を投げる関数の場合、例外に関する情報は関数のマニュアルを参照するかソースを参照するしかないことがほとんどじゃない?インターフェイスを見ただけで例外を把握できる言語てあったっけ?
259デフォルトの名無しさん
2023/01/31(火) 20:06:28.07ID:0vRdrBrN ML系の系譜の言語はまあ大体そうなんじゃね
そしてRustでもdyn Errorで返されたら結局同じことやらされる羽目に……
そしてRustでもdyn Errorで返されたら結局同じことやらされる羽目に……
260デフォルトの名無しさん
2023/01/31(火) 20:17:47.02ID:YNMDboNb >>258
だから例外に関与しないのになぜそんな情報いるんだ?
だから例外に関与しないのになぜそんな情報いるんだ?
261デフォルトの名無しさん
2023/01/31(火) 20:25:27.93ID:QTaicIN8262デフォルトの名無しさん
2023/01/31(火) 20:27:00.46ID:1QZESm3t 例外に関与しないってどういう意味なんだろう?
ガン無視するって言ってるんだろうか?
ガン無視するって言ってるんだろうか?
263デフォルトの名無しさん
2023/01/31(火) 20:36:05.54ID:YNMDboNb >>261-262
いちいち曲解するなよ
下位で発生した例外は何もしなければそのまま上位に伝搬するだろ
例外安全に作られてればその関数で確保したリソースはちゃんと解放される
それは下位の例外の種類に依存しない
いちいち曲解するなよ
下位で発生した例外は何もしなければそのまま上位に伝搬するだろ
例外安全に作られてればその関数で確保したリソースはちゃんと解放される
それは下位の例外の種類に依存しない
264デフォルトの名無しさん
2023/01/31(火) 21:10:03.87ID:QTaicIN8 >>263
「上位に伝達する」という意味わかっている?
>258がインターフェイスの話をしているのは理解できている?
関数の呼び出し元からすれば、呼び出し先で投げられているのか、さらにその先で投げられているのか、とか関係なく「関数を使ったら例外を投げられた」だよ。関数のユーザーからすれば「投げる例外くらい明確化するのが常識だろ」と思うよな。
関数が例外を投げるのに、その関数の作者が「例外に関与しないからオレ知らね」とか言って逃げたらブチ切れるわ。そんなんだったら例外全部catchして関数の外に漏らすな、と。
「上位に伝達する」という意味わかっている?
>258がインターフェイスの話をしているのは理解できている?
関数の呼び出し元からすれば、呼び出し先で投げられているのか、さらにその先で投げられているのか、とか関係なく「関数を使ったら例外を投げられた」だよ。関数のユーザーからすれば「投げる例外くらい明確化するのが常識だろ」と思うよな。
関数が例外を投げるのに、その関数の作者が「例外に関与しないからオレ知らね」とか言って逃げたらブチ切れるわ。そんなんだったら例外全部catchして関数の外に漏らすな、と。
265デフォルトの名無しさん
2023/01/31(火) 21:16:22.90ID:1QZESm3t266デフォルトの名無しさん
2023/01/31(火) 21:28:25.11ID:Qz/Q1rYV Javaの検査/非検査例外以降の約20年余りの試行錯誤の結果辿り着いた現時点でのベストプラクティスを採用したのがRustやSwiftのエラー処理モデル
C → Java → C# → Go →Swift/Rust
C → Java → C# → Go →Swift/Rust
267デフォルトの名無しさん
2023/01/31(火) 21:35:24.95ID:Mxurit6u268デフォルトの名無しさん
2023/01/31(火) 21:42:42.48ID:QTaicIN8 まぁ、Result使うとしてもtry catch finallyブロックみたいなフローが欲しいというのはわからんでもない。
関数から抜ける時にResultを漏らさず処理したいというのはたまにあるし。
関数から抜ける時にResultを漏らさず処理したいというのはたまにあるし。
269デフォルトの名無しさん
2023/01/31(火) 21:48:12.48ID:jD2BQUnk270デフォルトの名無しさん
2023/01/31(火) 22:04:35.47ID:WaCEL3Yw この件でプログラミング言語が最低限サポートして欲しい点2つ
ある関数(ライブラリ)を使おうとした時に
①その関数やその子孫からエラーや例外が上がってくるのか、それとも全て処理済なのか?
これが奥深く辿らなくても局所的に把握できること
ドキュメントベースはそのミスや見落としが生じるため不可
②エラーや例外が下から上がってくる関数を用いた時に、
その処理をせずに続行してしまうコードを書いてしまったら、実行前に言語システムにより防げること
例えばRustならば①は返値がResult型かどうかですぐに把握できる
②は型システムによりRustコンパイラが型不一致や未処理放置Resultの存在を伝えてくれる
Rustは現在ベストなプログラミング言語と言い切っても過言ではない
ある関数(ライブラリ)を使おうとした時に
①その関数やその子孫からエラーや例外が上がってくるのか、それとも全て処理済なのか?
これが奥深く辿らなくても局所的に把握できること
ドキュメントベースはそのミスや見落としが生じるため不可
②エラーや例外が下から上がってくる関数を用いた時に、
その処理をせずに続行してしまうコードを書いてしまったら、実行前に言語システムにより防げること
例えばRustならば①は返値がResult型かどうかですぐに把握できる
②は型システムによりRustコンパイラが型不一致や未処理放置Resultの存在を伝えてくれる
Rustは現在ベストなプログラミング言語と言い切っても過言ではない
271デフォルトの名無しさん
2023/01/31(火) 22:16:44.29ID:Mxurit6u272デフォルトの名無しさん
2023/01/31(火) 22:19:53.43ID:Mxurit6u273デフォルトの名無しさん
2023/01/31(火) 22:45:41.29ID:WaCEL3Yw274デフォルトの名無しさん
2023/01/31(火) 23:47:23.84ID:ovWek0QN 使いたい関数だけじゃなくて、その関数が使ってる関数、更にその関数が、、、って調べていかないといけないのが無駄にコスト高になるんだよね。
275デフォルトの名無しさん
2023/01/31(火) 23:54:22.59ID:hwxs0+db >>274
使いたい関数のシグニチャ見れば分かることだろ?????
使いたい関数のシグニチャ見れば分かることだろ?????
276デフォルトの名無しさん
2023/02/01(水) 00:33:02.66ID:CK4ZTpUy やっぱ複オジは成長しねーな
2世と同類だわ
2世と同類だわ
277デフォルトの名無しさん
2023/02/01(水) 03:40:06.80ID:RyGmTTdX >>275
それが正しいか信頼できんだろ
それが正しいか信頼できんだろ
278デフォルトの名無しさん
2023/02/01(水) 06:17:22.82ID:5NtLPUR3279デフォルトの名無しさん
2023/02/01(水) 07:12:22.77ID:Hf88nfPH280デフォルトの名無しさん
2023/02/01(水) 07:21:02.47ID:Hf88nfPH281デフォルトの名無しさん
2023/02/01(水) 08:02:53.27ID:5NtLPUR3282デフォルトの名無しさん
2023/02/01(水) 08:17:31.54ID:rokbXrwB283デフォルトの名無しさん
2023/02/01(水) 08:17:38.20ID:Hf88nfPH284デフォルトの名無しさん
2023/02/01(水) 08:20:02.84ID:Hf88nfPH285デフォルトの名無しさん
2023/02/01(水) 08:25:05.41ID:ATJMUMOg >>279
その調べるかどうかをどう判断するかって話なんだが…
putsがI/Oエラーを上げてくるって知ってるから無視して上に上げるって判断ができるわけ
じゃあライブラリXの関数Yは無視すべきなのかそうでないのか?ってこと
その調べるかどうかをどう判断するかって話なんだが…
putsがI/Oエラーを上げてくるって知ってるから無視して上に上げるって判断ができるわけ
じゃあライブラリXの関数Yは無視すべきなのかそうでないのか?ってこと
286デフォルトの名無しさん
2023/02/01(水) 08:27:52.62ID:rokbXrwB287デフォルトの名無しさん
2023/02/01(水) 08:30:01.09ID:5NtLPUR3288デフォルトの名無しさん
2023/02/01(水) 08:37:05.02ID:rokbXrwB ダックタイプ系の開発効率を求めるならRustは選択すべきじゃないよね。メモリの取り扱い見ればRustは「作法を強制する言語」だということは明らか。
そういうのはPythonとかRubyとかスクリプト言語があるんだからそっちを選ぶべき。
そういうのはPythonとかRubyとかスクリプト言語があるんだからそっちを選ぶべき。
289デフォルトの名無しさん
2023/02/01(水) 08:41:21.89ID:wznv5J1H >> 279
> 強い保証の意味がよくわからんが自前でキャッチして処理すれば良くね?
他は既に突っ込まれてるから言わんが
例外に関するプログラミングしてたらすぐにわかる概念だからググれ
つうか例外安全って言葉使うなら知っとけ
> 強い保証の意味がよくわからんが自前でキャッチして処理すれば良くね?
他は既に突っ込まれてるから言わんが
例外に関するプログラミングしてたらすぐにわかる概念だからググれ
つうか例外安全って言葉使うなら知っとけ
290デフォルトの名無しさん
2023/02/01(水) 08:54:40.02ID:Hf88nfPH291デフォルトの名無しさん
2023/02/01(水) 08:55:45.56ID:Hf88nfPH292デフォルトの名無しさん
2023/02/01(水) 08:58:06.40ID:ATJMUMOg >>290
別に調べ直す必要はないよ
下位にエラーが追加されても直接呼び出す関数のシグネチャが変わらないなら対応不要、変わったら対応するってだけ
結局呼び出す関数のResult型が対応すべきもののすべてなんだからそれ以外見る必要がない
別に調べ直す必要はないよ
下位にエラーが追加されても直接呼び出す関数のシグネチャが変わらないなら対応不要、変わったら対応するってだけ
結局呼び出す関数のResult型が対応すべきもののすべてなんだからそれ以外見る必要がない
293デフォルトの名無しさん
2023/02/01(水) 09:02:33.17ID:JRuvbVor294デフォルトの名無しさん
2023/02/01(水) 09:20:03.74ID:JRuvbVor >>290
> そもそも最下位の関数に新しいエラーが定義されたらrust使いは全部調べ直すのか?
Rustでそんなことをする必要がないよ
元々他のエラーも返す関数だったならば返り値型が元々Result型だから枠組みは変化なし
新たにエラーを返すように返り値型が変わったならばコンパイルエラーで気付く
> そもそも最下位の関数に新しいエラーが定義されたらrust使いは全部調べ直すのか?
Rustでそんなことをする必要がないよ
元々他のエラーも返す関数だったならば返り値型が元々Result型だから枠組みは変化なし
新たにエラーを返すように返り値型が変わったならばコンパイルエラーで気付く
295デフォルトの名無しさん
2023/02/01(水) 09:26:13.19ID:ypE1x0h9 fishシェルをRustで書き直すことが(ほぼ)決まったよ
https://github.com/fish-shell/fish-shell/pull/9512
C++ と CMakeをかなり腐してるけど意外に荒れてない
ちなみに提案者は開発リーダーなのでほぼ決まりでしょう
リンクされてる移行プランは他のプロジェクトでも参考になりそう
https://github.com/fish-shell/fish-shell/pull/9512
C++ と CMakeをかなり腐してるけど意外に荒れてない
ちなみに提案者は開発リーダーなのでほぼ決まりでしょう
リンクされてる移行プランは他のプロジェクトでも参考になりそう
296デフォルトの名無しさん
2023/02/01(水) 12:36:36.73ID:o2DBVRIO >>292,294
> 元々他のエラーも返す関数だったならば返り値型が元々Result型だから枠組みは変化なし
なら、その新しいエラー(例えばディスクフルを検出してたが今回ディスクオフラインなんてエラーが追加された)の処理が抜けてないことはどうやってわかるんだ?
実行時にしかわからないなら例外と変わらん
むしろ途中の伝搬コードをいちいち書くのが面倒なだけだろ
> 元々他のエラーも返す関数だったならば返り値型が元々Result型だから枠組みは変化なし
なら、その新しいエラー(例えばディスクフルを検出してたが今回ディスクオフラインなんてエラーが追加された)の処理が抜けてないことはどうやってわかるんだ?
実行時にしかわからないなら例外と変わらん
むしろ途中の伝搬コードをいちいち書くのが面倒なだけだろ
297デフォルトの名無しさん
2023/02/01(水) 12:42:13.45ID:BH4poKX+ Elixir にも、try/rescue の例外があるけど、あまり使わない。
throw/catch, raise でも、例外の発生場所を関数の外側から内側へ移すだけ
try do
%{a: a} = map
{:ok, a}
rescue
MatchError -> {:error, ":a が無い"}
end
とは書かずに、パターンマッチで書くのがElixir流
case map do
%{a: a} -> {:ok, a}
_ -> {:error, ":a が無い"}
end
throw/catch, raise でも、例外の発生場所を関数の外側から内側へ移すだけ
try do
%{a: a} = map
{:ok, a}
rescue
MatchError -> {:error, ":a が無い"}
end
とは書かずに、パターンマッチで書くのがElixir流
case map do
%{a: a} -> {:ok, a}
_ -> {:error, ":a が無い"}
end
298297
2023/02/01(水) 12:45:24.97ID:BH4poKX+ >>297
修正。内側・外側が逆だった
>throw/catch, raise でも、例外の発生場所を関数の外側から内側へ移すだけ
throw/catch, raise でも、例外の発生場所を関数の内側から外側へ移すだけ
修正。内側・外側が逆だった
>throw/catch, raise でも、例外の発生場所を関数の外側から内側へ移すだけ
throw/catch, raise でも、例外の発生場所を関数の内側から外側へ移すだけ
299デフォルトの名無しさん
2023/02/01(水) 14:01:39.16ID:TUW+NsdV >>296
それはResult<T,E>のEで返されるエラーenumのvariantが増えるだけ
んでvariantが増えればEをハンドルしてるところでexhaustiveに処理してなければコンパイルエラー
それはResult<T,E>のEで返されるエラーenumのvariantが増えるだけ
んでvariantが増えればEをハンドルしてるところでexhaustiveに処理してなければコンパイルエラー
300デフォルトの名無しさん
2023/02/01(水) 14:08:16.76ID:w5pt5x/h >>282
>言いたいのは「似たようなエラーをまとめておいて、修正も一括で行う」のイメージだった。
これはResultのコレクションを返せばいい
例外のある言語でもこのケースは例外じゃなくエラー情報を貯めたオブジェクトを戻り値で返してエラーがあったかどうかをチェックして分岐するコードを書く
それと似たようなもの
>例えば「関数内で細切れでファイルに書き込んでいるとき、どこかで書き込みエラーが出たらロールバックしてログを取って再書き込みする」とか。
ロールバックする系の処理ならエラーを貯めずにエラーが一つ出た時点で中断するように作ったほうがいい
>言いたいのは「似たようなエラーをまとめておいて、修正も一括で行う」のイメージだった。
これはResultのコレクションを返せばいい
例外のある言語でもこのケースは例外じゃなくエラー情報を貯めたオブジェクトを戻り値で返してエラーがあったかどうかをチェックして分岐するコードを書く
それと似たようなもの
>例えば「関数内で細切れでファイルに書き込んでいるとき、どこかで書き込みエラーが出たらロールバックしてログを取って再書き込みする」とか。
ロールバックする系の処理ならエラーを貯めずにエラーが一つ出た時点で中断するように作ったほうがいい
301デフォルトの名無しさん
2023/02/01(水) 15:31:55.23ID:4CkJdapD 脳死でdyn Error突っ込んでるやつです
302デフォルトの名無しさん
2023/02/01(水) 15:34:50.34ID:ypE1x0h9 dyn Errorで受け取った後の活用法が分からん
303デフォルトの名無しさん
2023/02/01(水) 17:49:22.59ID:HDxpsRMp dyn Errorでできるのは
・print!とかwrite!でログ出力する
(ErrorトレイトにDebugとDisplayが内包されてるからちゃんと実装されてれば何か教えてくれる)
・source()で内部のdyn Errorを掘り起こす
(エラーの原因のエラーがあれば一緒にログ出力できる)
くらいだからログ出力以上の活用がしたいならそのためのError型を使わないといけない
・print!とかwrite!でログ出力する
(ErrorトレイトにDebugとDisplayが内包されてるからちゃんと実装されてれば何か教えてくれる)
・source()で内部のdyn Errorを掘り起こす
(エラーの原因のエラーがあれば一緒にログ出力できる)
くらいだからログ出力以上の活用がしたいならそのためのError型を使わないといけない
304デフォルトの名無しさん
2023/02/01(水) 18:15:38.74ID:pHJayYFi >>302
具体的なエラーの型で分岐させたいならダウンキャストが必要(The Bookにも書いてたはず)
エラーenumを定義してwrapしたものに変換(map_err)しておけばダウンキャストは不要
anyhowに組み合わせてthiserrorの#[from]や#[error(transparent)]を使うと楽にwrapできる
anyhow/thiserrorのやってることに最初から自力で辿り着くのは大変だから先に使ってみて必要な要素を学んだ方が早いよ
具体的なエラーの型で分岐させたいならダウンキャストが必要(The Bookにも書いてたはず)
エラーenumを定義してwrapしたものに変換(map_err)しておけばダウンキャストは不要
anyhowに組み合わせてthiserrorの#[from]や#[error(transparent)]を使うと楽にwrapできる
anyhow/thiserrorのやってることに最初から自力で辿り着くのは大変だから先に使ってみて必要な要素を学んだ方が早いよ
305デフォルトの名無しさん
2023/02/01(水) 19:06:46.56ID:JRuvbVor >>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に格納する「?」時の自動変換を書いたり
それぞれ簡単で単純なパターンなのだから標準ライブラリで基礎を身に着けた上で自作や外部のライブラリを選ぶのがお勧め
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デフォルトの名無しさん
2023/02/01(水) 19:07:10.38ID:sE34HuOS307デフォルトの名無しさん
2023/02/01(水) 19:18:58.38ID:RjOpz7Dl 単発無能認定おじさん
308デフォルトの名無しさん
2023/02/01(水) 19:27:56.01ID:JRuvbVor >> ライブラリならドキュメントに書いてあるでしょ
ドキュメントは言語システムの一部ではないため
ミスで現実のコードとドキュメントが食い違っていることもあれば
ドキュメントは正しくても利用者が見落としてしまうこともある
大規模な開発になればなるほどミスや見落としが紛れ込むことは避けられない
特にエラー処理が済んでいるか未だなのかは致命的になりかねない
一方でRustは言語システムの中で下位関数からエラーが上がってくるか処理済か分かる
さらにResultが未処理のままだとRustコンパイラが指摘してくれる
言語システムとして少なくともこれらの機能を持つ言語へと今後は移行していくべき流れ
ドキュメントは言語システムの一部ではないため
ミスで現実のコードとドキュメントが食い違っていることもあれば
ドキュメントは正しくても利用者が見落としてしまうこともある
大規模な開発になればなるほどミスや見落としが紛れ込むことは避けられない
特にエラー処理が済んでいるか未だなのかは致命的になりかねない
一方でRustは言語システムの中で下位関数からエラーが上がってくるか処理済か分かる
さらにResultが未処理のままだとRustコンパイラが指摘してくれる
言語システムとして少なくともこれらの機能を持つ言語へと今後は移行していくべき流れ
309デフォルトの名無しさん
2023/02/01(水) 21:57:57.91ID:qgBIsers >>305
>それぞれ簡単で単純なパターンなのだから
実装の簡単さやパターンの単純さが問題じゃないんだよ
Rustのエラー処理に必要な「それぞれ簡単で単純なパターン」を網羅的に知識として仕入れてRustのエラー処理はこうやってやるものだと自信を持って言えるようになるまでの学習効率の問題
anyhow/thiserrorはそのパターンを楽に使えるよう作られてるから「ああRustのエラー処理ってこうやればいいんだな」ってのが標準ライブラリ前提で学ぶより断然早く理解できる
>それぞれ簡単で単純なパターンなのだから
実装の簡単さやパターンの単純さが問題じゃないんだよ
Rustのエラー処理に必要な「それぞれ簡単で単純なパターン」を網羅的に知識として仕入れてRustのエラー処理はこうやってやるものだと自信を持って言えるようになるまでの学習効率の問題
anyhow/thiserrorはそのパターンを楽に使えるよう作られてるから「ああRustのエラー処理ってこうやればいいんだな」ってのが標準ライブラリ前提で学ぶより断然早く理解できる
310デフォルトの名無しさん
2023/02/01(水) 22:05:04.46ID:JRuvbVor >>309
dynの取り扱いと「?」オペレータによる自動変換はRustの基本事項で必須の知識
もちろん標準ライブラリの中で完結して使えるしシンプル仕組みなのですぐ使えるようになる
この基本を習得せずに外部ライブラリへ行くことを勧めるのは基本知識を欠いた人を生み出してしまう愚かな行為
dynの取り扱いと「?」オペレータによる自動変換はRustの基本事項で必須の知識
もちろん標準ライブラリの中で完結して使えるしシンプル仕組みなのですぐ使えるようになる
この基本を習得せずに外部ライブラリへ行くことを勧めるのは基本知識を欠いた人を生み出してしまう愚かな行為
311デフォルトの名無しさん
2023/02/01(水) 22:25:39.32ID:JqtaL/Do >>310
もしかしてパターンってdyn Errorと?オペレータ使った自動変換の話だけなの?
それだけじゃRustで現実的にどうエラー処理を実装すべきかThe Book読み終えたくらいの人にはわかんないと思うよ
もしかしてパターンってdyn Errorと?オペレータ使った自動変換の話だけなの?
それだけじゃRustで現実的にどうエラー処理を実装すべきかThe Book読み終えたくらいの人にはわかんないと思うよ
312デフォルトの名無しさん
2023/02/01(水) 22:59:41.62ID:JRuvbVor >>311
エラー処理パターンは様々な方針があり
その前提知識としての共通の必須事項として今回のスレの流れで話が出て来ていたdynの取り扱いと?での自動変換の話を書いた
例えばあなたが出したanyhowはdyn Errorを扱う外部ライブラリの一種
anyhow::Errorから具体的な型を取り出すためには>>305で書いたdynの取り扱い知識が必須
この知識を知らないと細かいエラー分類が出来ずにエラー表示のみしか出来ない人になってしまう
もう一つあなたが出したthiserrorも?での自動変換を用いる外部ライブラリ(というかマクロ)の一種
>>305で示したFrom::from()による自動変換の基礎知識を欠いたままでは仕組みすら分からず魔法のように外部ライブラリを使うダメな人になってしまう
応用が効かないだけでなく利用していて何か問題にハマった時に基本知識がないと解決することもできない
エラー処理パターンは様々な方針があり
その前提知識としての共通の必須事項として今回のスレの流れで話が出て来ていたdynの取り扱いと?での自動変換の話を書いた
例えばあなたが出したanyhowはdyn Errorを扱う外部ライブラリの一種
anyhow::Errorから具体的な型を取り出すためには>>305で書いたdynの取り扱い知識が必須
この知識を知らないと細かいエラー分類が出来ずにエラー表示のみしか出来ない人になってしまう
もう一つあなたが出したthiserrorも?での自動変換を用いる外部ライブラリ(というかマクロ)の一種
>>305で示したFrom::from()による自動変換の基礎知識を欠いたままでは仕組みすら分からず魔法のように外部ライブラリを使うダメな人になってしまう
応用が効かないだけでなく利用していて何か問題にハマった時に基本知識がないと解決することもできない
313デフォルトの名無しさん
2023/02/02(木) 00:32:13.04ID:y8eaHXgz >>312
設計やプラクティスとしてのパターンのことを言ってたんだが君は言語機能のことをパターンと呼んでるみたいで噛み合ってないよね
dyn Errorや?オペレータ使ってinto経由で変換されるような基本的な機能面の知識はThe Bookにも書かれてるレベルだし多少分からなくてもリファレンス読めばいいだけの話
でもそれだけの知識でRust初心者がエラー周りの実践的な設計をできるようにはならないでしょ
設計やプラクティスとしてのパターンのことを言ってたんだが君は言語機能のことをパターンと呼んでるみたいで噛み合ってないよね
dyn Errorや?オペレータ使ってinto経由で変換されるような基本的な機能面の知識はThe Bookにも書かれてるレベルだし多少分からなくてもリファレンス読めばいいだけの話
でもそれだけの知識でRust初心者がエラー周りの実践的な設計をできるようにはならないでしょ
314デフォルトの名無しさん
2023/02/02(木) 00:53:57.92ID:tzaW+blt anyhow/thiserrorは最近出てきた新興ライブラリ
当然それまでは誰も使っていなかったわけで初心者がいきなり必須なものでもない
初心者にとっては複雑で機能過多で理解しにくいのでまずは標準ライブラリから始めたほうが良いかな
当然それまでは誰も使っていなかったわけで初心者がいきなり必須なものでもない
初心者にとっては複雑で機能過多で理解しにくいのでまずは標準ライブラリから始めたほうが良いかな
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- バリ島で男子生徒ら集団万引きか、防犯カメラ映像が拡散 京都の大谷中学・高校が「窃盗行為」謝罪★4 [七波羅探題★]
- 中国軍機レーダー照射、トランプ氏沈黙突く 試される日本外交 [蚤の市★]
- 【広島】「万引きした人を追跡」コンビニ店員の男性(46)を果物ナイフで刺したか 中国籍の少年(17)を殺人未遂容疑で現行犯逮捕 [ぐれ★]
- 【地震】青森県で震度6強 長周期地震動も 津波注意報すべて解除 ★7 [ぐれ★] [ぐれ★]
- 【サッカー】58歳カズ「オファーが来ている」 J3福島と近日中にも交渉 早ければ年内にも決断 [征夷大将軍★]
- 【速報】気象庁は津波注意報すべて解除 [蚤の市★]
- 【実況】博衣こよりのえちえち朝こよ🧪
- (´・ω・`)おはよ
- さかまた「過呼吸になった」かなた「耳聞こえない」ござる「声出ない」まつり「ご飯食べれない」
- 【画像】カリカリ女、脱いだらすごい😨 [632966346]
- くそしてかがやけ
- 🪬本日のコンマ占い🧿
