Rust part19

■ このスレッドは過去ログ倉庫に格納されています
2023/01/17(火) 12:41:32.25ID:nikBFIMQ
公式
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/
2023/01/20(金) 00:47:21.47ID:sbzTb5wM
イテレータ化してchain()で繋げるとか?
でも手間は変わらないか
32デフォルトの名無しさん
垢版 |
2023/01/20(金) 02:52:18.79ID:rWEP7xyW
>>30
ないんじゃね
何回も書く必要があるなら単に関数化する
||演算子で書きたければマクロ内独自文法作る
2023/01/20(金) 11:05:21.77ID:cF/QvtGv
>>20
今だいたいそうなっていてmainにエラー出力用のコードが散在している状態
エラーメッセージの出力先もコンソールのみじゃないのでexpectだと難しい気が
2023/01/20(金) 13:36:20.52ID:pmLm7hT0
ちんちん!シュッ!シュッ!!シュッ!!!
35デフォルトの名無しさん
垢版 |
2023/01/20(金) 21:59:08.95ID:A12k25he
>>33
いろんな問題をごちゃ混ぜにしすぎ
頭とコードを整理しよう
2023/01/21(土) 14:16:15.90ID:tEFzN85r
1.すべてmainまで返してmainでエラー処理をする
2.エラー処理用の関数を作ってそれを呼び出す
3.パニックハンドラでエラーメッセージを出力
くらいしか思いつかん。ググってもThe Bookに書いてある程度のことしか出てこなくて参考にならない
3はpanic!やexpectで脱出できるのは楽だけどハンドラへ渡せるデータが文字列のみでなのがいまいち
またエラー処理に必要な情報を文字列にエンコードする必要がある
2ならmainまで戻らずともエラー処理できるのでこの方向で実装中
37デフォルトの名無しさん
垢版 |
2023/01/21(土) 14:57:31.49ID:hb5eMxVX
log crateやtrace crateはチェック済み?
logは準標準、実装は好きなのを選ぶ必要がある
traceはtokio-rs製
2023/01/21(土) 16:41:16.71ID:3Tq4pZe4
>>32
|オペレータのstd::ops::BitOrトレイトのように
||オペレータのトレイトをRustコンパイラが用意してくれたらOptionも||で扱えそう
2023/01/21(土) 18:30:23.18ID:/bIQjlWu
>>37
info!やerror!ってpanic!やexpectと本質的に変わらないような。いずれにしろ呼び出し側で文字列の加工が必要
GUIへの対応方法もよくわからない。開発時はもちろんコンソールへの出力を使うけど
運用中のエラー出力はGUIのポップアップメッセージがメインになるし

あとソースコードは600行弱くらいだけどリリースビルドで生成されるバイナリは800KB弱もあるんで
これ以上でかくしたくないというのもある
40デフォルトの名無しさん
垢版 |
2023/01/21(土) 22:40:10.67ID:wag66I/R
ロガーを設定/生成するコード
ロガーを使うコード
ロガー自体のコード
それぞれ分けて考える

ロガーを使うコードではファイル出力だろうが標準出力だろうがinfo!やerror!でコードを変える必要はない
使うロガーを変えたり設定を変えたりする

ロギングライブラリを使うのは自前で作るのは面倒だから
41デフォルトの名無しさん
垢版 |
2023/01/22(日) 02:33:12.00ID:5IaN6zUW
書籍で最初に読むとしたら
平家蟹の方?
それとも可愛い方?
2023/01/22(日) 02:45:54.00ID:DAK16wxY
平家蟹がかわいくないとか、こいつアンチか?
43デフォルトの名無しさん
垢版 |
2023/01/22(日) 02:46:40.77ID:4BdfAMug
>>39
>GUIへの対応方法もよくわからない。
GUIのレイヤーまでResultを戻してErrならエラー表示をするだけ
2023/01/22(日) 12:43:00.06ID:WLCvNrGP
>>39
ログはログ。何が起きたか記録するだけ。ログレベルが何であれ副作用は起こさない。
エラーはエラー。発生したときにどうハンドリングするかはプログラムの性質で決める。
パニックはそのまま稼働したらまずい状況に陥ったら時だけ起こす。
45デフォルトの名無しさん
垢版 |
2023/01/22(日) 14:52:04.22ID:RMpOCJx1
>>41
モンタギュー蟹の方
46デフォルトの名無しさん
垢版 |
2023/01/22(日) 15:29:33.81ID:WCVJRVcD
アプリケーションのレイヤーでパニック起こすのはバグの時だけ
2023/01/25(水) 16:19:44.22ID:zlgPT3s2
ネットワーク前提にしてる時に、panicになるのはバグではないよ?
2023/01/25(水) 16:35:00.31ID:LG3Fy/yw
うっわすっげー読みやすいコードと思ってよく見てみたら
過去に自分が書いたやつだった(´・ω・`)
2023/01/25(水) 16:39:27.19ID:5onhVltK
天才か?
2023/01/25(水) 16:40:49.73ID:GSIKYco3
過去の自分は他人だと思え、がプログラミングの基本
2023/01/25(水) 17:17:39.71ID:xORIlv/9
過去のことを忘れていても過去の自分が考えることは今の自分が考えることとあまり差がない。
名前の付け方とかは何度考えても同じような状況なら同じ名前を付けるし。

書くときに想定する読み手が全くの他人のときと未来の自分のときではちょっと違う意識があるな。
2023/01/25(水) 18:36:03.64ID:V9gmFqbx
一度も使ったことがない機能は書くことはできても読めると思うな、が基本
使ってから読め
2023/01/25(水) 19:53:08.97ID:sck5kayB
>>47
ネットワークこそ途中で途切れること前提に書かないといけない機能の最たるものだろ。エラー返してハンドリングしろ。
54デフォルトの名無しさん
垢版 |
2023/01/25(水) 20:37:11.28ID:5EKz9Dxo
>>48
あるあるだね
55デフォルトの名無しさん
垢版 |
2023/01/25(水) 20:38:19.94ID:xtWPaGBn
>>47
なんでpanicになるの?
2023/01/25(水) 21:43:02.36ID:jK9fbSTx
>>38
一度ポシャってるけど実装される可能性はあると思う
https://github.com/rust-lang/libs-team/issues/144
2023/01/25(水) 23:55:49.39ID:7h2BZmgN
bool以外でも&&と||の遅延評価が使えるようになるわけか
欲しいね
2023/01/26(木) 00:47:59.28ID:Oik+f0Gv
bool以外でもifを使えるといえばif letで
elseを省略することで3項ではなく2項演算のようになるのも&&と同じ
だがelseを省略できても{}を省略できなければ意味がない
59デフォルトの名無しさん
垢版 |
2023/01/26(木) 11:05:43.50ID:G0iCERKY
>>58
もうちょっと基礎を勉強してからレスしろ
60デフォルトの名無しさん
垢版 |
2023/01/26(木) 11:09:10.89ID:QY5r5/0E
すまんが、これの解答はmutをつけろっていうことなのはわかるけどさ
https://github.com/rust-lang/rustlings/blob/main/exercises/variables/variables4.rs
なんで8行目で所有権を失って9行目で代入できなくなったりしないの・・・・?
61デフォルトの名無しさん
垢版 |
2023/01/26(木) 11:24:13.84ID:DDvWU5a2
>>60
これはもっともな疑問

The Bookのどこかに書いてたように思うけど
ざっくり言えばprintlnはreferenceを取るから所有権は移動しない

DisplayトレイトやDebugトレイトのメソッドシグニチャを見ると分かる
2023/01/26(木) 11:33:53.75ID:Y60o/Mze
>>60
ついこないだ Teratail で同じような質問を見たぞ。
マクロは構文糖を作り出す仕組みなので展開形によっては所有権を取ることも借用なことも何にも使いすらしないということもある。
2023/01/26(木) 14:03:27.91ID:YuUaXpq9
ある関数の&mut T型の引数として、T型の変数を貸すのは分かるけど
&mut T型の変数を又貸しするのが不思議
なぜmoveしたことにならないのか
2023/01/26(木) 15:25:17.84ID:MCrVnhV0
>>63
&TはCopyだからmoveしないよ
65デフォルトの名無しさん
垢版 |
2023/01/26(木) 15:35:28.34ID:SkvAt80a
>>63
implicit reborrowのことかな?
&mut Tの又貸しと言ってるのがどういうケースなのかはコードかないハッキリはわからないな
2023/01/26(木) 17:21:49.46ID:YuUaXpq9
implicitly reborrowedされるとhogeが&mut *hogeになるのか
勉強になった
ありがとう
2023/01/26(木) 18:45:49.05ID:nglgEIPC
結局&mutを持っている間は専有しているから既存ルールに抵触することなく貸し出し自由自在という理解でいいのかな
&*でimmutableなreborrowも出来ちゃうもんね
2023/01/26(木) 19:48:43.33ID:16g2h/GU
>>60
変数が値を所有しているんだよ
値がムーブされて一度無効化された変数にも新しい値を所有させられるよ
例えば、その9行目でxが3を所有していなかったとしても新しい値を入れられるよ
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=657d792c80f30e9430f0fbff11556fe6
2023/01/26(木) 19:50:53.34ID:uBPDOaY+
暗黙で参照が外されることがあるからわかりにくいんだろうな
最初から暗黙の参照外しがなければよかったと思うが
後方互換性を大事にするなら、もう改善は不可能だな
2023/01/26(木) 20:31:02.62ID:q1WzF/2m
>>53
だからバグじゃないよね?
71デフォルトの名無しさん
垢版 |
2023/01/26(木) 21:11:51.00ID:BacNCpeu
>>70
エラーを返すんだからpanicしないだろ
72デフォルトの名無しさん
垢版 |
2023/01/26(木) 21:14:28.71ID:GObOayQz
>>68
そりゃmutならなw
73デフォルトの名無しさん
垢版 |
2023/01/26(木) 21:18:17.56ID:q8T2WGhT
implicit reborrowはThe Bookには書かれないし直感的でもないから動きが理解しにくいというのはよく分かる
2023/01/26(木) 21:50:47.31ID:ZxPs9rBQ
>>70
例えばtwitterアプリを地下鉄とか通信できない状況で起動して panic で落ちる事を考えてみろ。そりゃバグだろ。
2023/01/26(木) 22:06:21.53ID:HEA6MC1t
Deref無しは流石にきついな
一気にRust書きたくなくなる気がする
2023/01/26(木) 22:20:38.36ID:nglgEIPC
>>69
むしろderef含めたcoercionのおかげでRustは便利かつ読みやすいと思う
初心者の最初のうちだけは混乱するかもしれないけどそのデメリットを誤差にするほどの絶大なメリットがある
7760
垢版 |
2023/01/27(金) 11:24:22.85ID:CSClNfzp
教えてくれてるのは本当にありがたいんですが、訳がわかんないぽ・・・・
78デフォルトの名無しさん
垢版 |
2023/01/27(金) 11:51:57.32ID:YDsF+xqw
>>77
何がわからないのか書いて
7960
垢版 |
2023/01/27(金) 13:58:30.55ID:CSClNfzp
マクロが展開するコードがあって、そこに&がついてるってことなんですか?
2023/01/27(金) 14:00:09.55ID:MqPTrKVr
せやで
Playgroundの左上のボタンでShow HIRするとマクロ展開等終わった後のコード出るから見てみ
2023/01/27(金) 19:13:43.59ID:q2LYouLt
&はついてるけどあなたの疑問とは関係ないと思う
2023/01/27(金) 21:29:03.39ID:N1uoRX56
>>74
例がtwitterアプリって...通信が出来ない状態でも何らかのオフライン操作が行えるアプリであればそうでしょうが
仕様上、エラーハンドリングを行わなければならないとされていないならバグではないでしょ....
むしろ大したログやコンソールでの情報も出さず、「エラー:通信ができましぇん」なんて返されるほうが迷惑だわ
2023/01/27(金) 21:54:30.76ID:cQ0vJjwr
>>82
バグかどうかは仕様次第というのはそりゃそうなんだけど、それじゃ建設的な議論にならんでしょ。
俺はError返しといたほうが利用側がハンドリングする余地があっていいと思うね。
2023/01/28(土) 02:45:04.16ID:OM0pptP0
>>82
Rust の文化にあまり詳しいわけじゃないけど panic を呼び出すのって C/C++ で言うところの assert 的なもんでしょ。
普通に考えたら panic が呼ばれるのはモジュールの仕様に対して使い方が間違っているかリカバリ不可能な場合。
逆に言えば使い方が正しくてリカバリ可能な状況で panic になるべきではない。

モジュールの使い方が完璧に正しいプログラムを書いても panic が引き起こされてしまうなら panic の使い方のほうが間違ってる。
絶対に通信が確立する状況で使えという仕様を設定すりゃあ間違ってるのは使い方のほうではあるけどさー、
ネットワークでそれは不可能な前提じゃん? ありえない前提を元にするのは不毛だろ。
2023/01/28(土) 07:46:19.92ID:NqcfPhRT
>>82
> 仕様上、エラーハンドリングを行わなければならないとされていないならバグではないでしょ....
仕様バグ...
2023/01/28(土) 09:58:07.00ID:40nYh31B
ユーザーにとって不自然な動作をすれば開発者が仕様だと言い張ったところでそれはバグだよ
2023/01/28(土) 10:54:36.16ID:9JWZ6Tol
エラーにも回復可能なエラーと不可能なエラーがあり、panicすると回復不可能な状態になるんだから、回復可能なエラーはpanicすべきじゃない。ましてや通常使用でしばしば発生する状態でpanicするのは言語道断だわな。
2023/01/28(土) 10:57:15.78ID:A5TUrW0u
assertというかexitやな。推奨はされん、普通はデバッグで面倒な時くらいじゃないか。
2023/01/28(土) 11:52:23.17ID:NqcfPhRT
>>86
MSの開発者を説得してくれ
2023/01/28(土) 11:54:06.56ID:NqcfPhRT
>>88
exitは正常終了でも呼ばれるからassertのほうが意味的には近いと思うぞ
2023/01/28(土) 14:06:35.25ID:qTYDIi6E
マルチスレッド界隈ではスレッドの一つや二つ終了しても
回復不可能と思ってないでしょ
92デフォルトの名無しさん
垢版 |
2023/01/28(土) 14:59:51.08ID:pTjpQsNq
The Bookにある回復不可能かどうかという判断基準は曖昧であまり役に立たない

Resultを伝播させてトップレベルでログ出力でもしてabortさせるのに比べて
問題発生箇所でpanicさせるメリットは処理をinfallibleな関数として定義出来ること

逆に言えばバグでも無いのにinfallibleな関数呼び出しでpanicで落ちるような設計はそれ自体がバグの可能性大
2023/01/28(土) 17:20:49.61ID:qTYDIi6E
0か1かではなくバグが何個あるのかも重要
落とせば一つ?
進めれば二つ以上?
94デフォルトの名無しさん
垢版 |
2023/01/28(土) 17:59:00.91ID:b6xT90Ev
>>93
イミフ
2023/01/28(土) 19:43:12.93ID:qTYDIi6E
>>86
開発者なんていないよ、みんなユーザーだよって言い張ったのがオープンソースだね
96デフォルトの名無しさん
垢版 |
2023/01/28(土) 21:12:57.88ID:ZIiiTUHL
>>95
イミフ その3
2023/01/28(土) 22:16:55.89ID:qTYDIi6E
ユーザーと開発者を分断して対立煽るのをやめようってことだよ
2023/01/28(土) 23:41:24.90ID:j4/fJAgO
自分(たち)で用いるツール類だけは
自明な前提を満たしていない場合に限り
エラー処理をサボったpanicで終わらせてもよい

それ以外のpanicは状態矛盾など続行不可禁止で発生するが
正しくエラー終了させるべきものであり
panic発生はバグと呼んでも差し支えない
2023/01/29(日) 01:28:33.47ID:K5ah9cLk
>>98
panicをハンドリングしないのはバグかどうかは仕様次第と完全に認めてるのに、建設的な議論って・・・
作法的な話や、ユーザーフレンドリなUIでエラーメッセージを出したい、いきなり終了して欲しくないのであってもプロジェクトごとに異なるし、一般的な普遍性なんて「仕様上」に何が言いようがあるんだ?
オレはいつもこうしてます!という癖だったらいくらでも言えるし、100人集めてアプリケーションのレイヤーでpanicをハンドリングする/しないでアンケートしてどっちが人気かで正しさが決まるようなものではない。
最終的に「アプリケーションのレイヤーでパニック起こすのはバグの時だけ」とかいうのは明らかに間違ってるでしょ
そうするような特定のプロジェクトの仕様がたまたま(確率的に)一致するかもしれないが、それも一般化できる話ではないよ。

まあ、お望みの建設的な議論をするなら、アプリケーションをライブラリのように使用できる余地があるならResultsなどでErrorを返すのはとても良いですが、それでもpanicをハンドリングしてErrorで返すべきでは”無い”でしょうね
なぜならRustはそれを推奨していないし、Errorチェックしてをpanicに変換する方向性はあっても、panicをErrorに変える方向性は、仮にログ出力してもpanicの握り潰しやエラー情報の欠落に等しい。(なぜならログへのI/Oエラーになってる可能性もあるから)
それは、そもそもRustのpanicは言葉上は回復不能なエラーであり、バグではなくメモリーに物理的な障害が発生して配列インデックスが変になったとか、処理が続行できない、もしくはいったん特定の場所に戻って回復できないときに使われる思想。
なので、panic->Error変換処理が正常に働くかも怪しい。だからRustはそれを捉えず上位へ流して最低限やるスタックの巻き戻しのみ処理を推奨し、即座に終了させる(=プログラムが落ちる)
Linusはこのスタックの自動巻き戻しがとても気に入らないらしいが、理由は巻き戻し処理が正常に働く理由が無いからだ。
それを無理やり捉えて、スタックトレースが出るのが嫌、即座に終了するのが嫌、は分かるけどpanicで終了したからと言って仕様に書いてなければバグじゃないでしょ

これを癖でやってしまうのはtry-catch構文があるC#やJava系から来た人が多いのではないかな...?
2023/01/29(日) 02:35:07.62ID:r5isV+tS
誰もpanicをResultに変換する話はしとらんやろ
2023/01/29(日) 07:18:58.36ID:ksaPk66E
て言うか>>99は前半と後半で矛盾してるしアホほど長文を証明してるw
102デフォルトの名無しさん
垢版 |
2023/01/29(日) 11:17:47.92ID:p51Kojpz
panicは仕様に書いてなければバグでしょ
どんなプログラム書いてんだよ
103デフォルトの名無しさん
垢版 |
2023/01/29(日) 11:27:06.90ID:FaEg6ckP
エラーハンドリングという言葉をpanicをハンドリングしてResultにすることだと思ってたのか
そりゃ噛み合わないわな
2023/01/29(日) 13:10:21.68ID:ZDOIjMr/
例えばpythonのexitの代用としてpanicを使ったところで何の問題もない
105デフォルトの名無しさん
垢版 |
2023/01/29(日) 14:45:33.86ID:ttNbSKVN
問題ありまくり
同じexitがあるのにわざわざpanicで代用するメリットは何?
2023/01/29(日) 15:29:55.13ID:yzACUqHq
まずは異常終了と正常終了を分断するメリットを知る必要がある
2023/01/29(日) 15:33:47.16ID:ZDOIjMr/
>>105
へー今初めて知った
The BookのCommon Programming Conceptsあたりにそれっぽい記述はないし
中断したければpanicするしかないと思っていたよ
後学のためにどこで解説されているのか教えてほしいな
2023/01/29(日) 15:48:49.58ID:CZoRokqJ
panic!すべきかするまいか
https://doc.rust-jp.rs/book-ja/ch09-03-to-panic-or-not-to-panic.html
109デフォルトの名無しさん
垢版 |
2023/01/29(日) 17:07:54.00ID:qjfBPBdR
>>107
The Bookの12章を復習して
https://doc.rust-lang.org/book/ch12-00-an-io-project.html

ただThe Bookは他言語から来た人が最初に読むチュートリアルとして用意されてるものなのでカバーされてない内容も多々あるし深い解説がされてるわけでもない点は理解しておいた方がいいよ
2023/01/29(日) 17:16:49.84ID:2OIx0YXk
標準ライブラリのマニュアルでも panic! はバグを説明するために使うということは書いてあるね。
https://doc.rust-lang.org/std/macro.panic.html
2023/01/29(日) 18:20:40.83ID:yP5ym/xP
>>107
exitはプロセスの終了状態コードを伝えることを兼ねたOSシステムコールだから通常の言語には必ずある
そしてそのことを分かっていればRust初心者であってもstd::process::exitをすぐに見つけられる
2023/01/29(日) 18:41:07.89ID:qSgQK/Ke
>>105
Pythonのsys.exitと同じ感覚でstd::process::exit使うほうがはるかに問題では?
少なくとも異常終了に使う分にはpanic!のほうがsys.exitに近いと思うよ

sys.exit()
https://docs.python.org/3/library/sys.html#sys.exit
・SystemExit例外を投げるだけ
・メインスレッドで実行して、かつ例外がトップレベルまで捕捉されなければ、通常の例外機構に従ってプロセスが終了する
→finallyとかwithでリソース解放書けばちゃんと解放される

std::process::exit()
https://doc.rust-lang.org/std/process/fn.exit.html
・無条件でプロセスを終了させる
・実行スレッドも他のスレッドも一切スタック巻き戻しが行われない
→デストラクタ呼ばれない
113デフォルトの名無しさん
垢版 |
2023/01/29(日) 18:45:14.86ID:jE2G9ZiM
_exit()はシステムコールだけどexit()はライブラリの関数
pythonのexit()やsys.exit()は基本的にexitcodeを設定してSystemExit例外を投げてるだけ
os._exit()がprocess::exit()に近い
114デフォルトの名無しさん
垢版 |
2023/01/29(日) 18:46:31.90ID:jE2G9ZiM
>>112
例外のある言語と同じ感覚でプログラミングするのが一番の問題
それ抜きにpythonと比べとも意味ないよ
2023/01/29(日) 18:48:13.88ID:yP5ym/xP
一般的な他の言語におけるtry-throw-catchの機能が欲しいならば
それはRustやGoなどでは意図的に排除されていて存在しない
RustではResultで返すだけでよく利便性と効率を両立させている
2023/01/29(日) 19:53:25.69ID:ZDOIjMr/
>>109
そこは見ているけど制御機構を説明しているところで同時に解説すべきなのでは

>The Bookは他言語から来た人が最初に読むチュートリアルとして用意されてるもの
なおさら他言語でメジャーな機能や実装と対比した解説が必要では

>>112
unwind不可なのは使いにくい場面が少なからずありそう
今作っているのはdrop使っているから強制abortは問題しかない
2023/01/29(日) 21:27:11.45ID:yzACUqHq
RustのdropにはRcという具体的な目的がある
Rcが完璧主義ではないのでdropも完璧にする必要を感じない
118デフォルトの名無しさん
垢版 |
2023/01/29(日) 21:32:58.27ID:ns31yZLJ
>>112
>Pythonのsys.exitと同じ感覚でstd::process::exit使うほうがはるかに問題では?

RustではResultをmainまで戻してからprocess::exitする
Pythonは例外という仕組みでランタイムがそれをやってくれる
panicはやってることがにてるからという理由で使うようなものじゃない
2023/01/29(日) 21:46:05.85ID:hfoWSJ8/
>>115
そうではないよ?例えばrustの標準ライブラリのTcpStreamにはset_read_timeoutでタイムアウトを設定すると、それ設定値以上でpanicを起こす。
これは通信中に非同期制御やスレッド監視などをしないための苦肉の策でResultをmatchするだけという考えから外れて、回復不能としているのだがリードタイムアウトであろうと再試行するようなプログラムではpanicを考慮しなければならない。
一方でTcpStreamの多くはResult<>を返すので、高度なプロトコルを作るような場合、受け取ったデータなどを調べてpanicさせる方法などが公式ドキュメントにも述べられている。
120デフォルトの名無しさん
垢版 |
2023/01/29(日) 21:46:28.34ID:6XW+IoFB
The Bookに書いてるようにpanicを使う対象となるような回復不可能なエラーは常にバグによるもの

Rust groups errors into two major categories: recoverable and unrecoverable errors.
Unrecoverable errors are always symptoms of bugs.
121デフォルトの名無しさん
垢版 |
2023/01/29(日) 21:56:31.01ID:saQmfbkd
>TcpStreamにはset_read_timeoutでタイムアウトを設定すると、それ設定値以上でpanicを起こす。
readで設定したtimeout値を超えたらpanicすると言ってる?
少なくともリファレンスにはResultが返されるとあるんだが
2023/01/29(日) 21:57:37.90ID:K3YIwpIF
>>113
_exitはexit_groupのラップ関数だよ
2023/01/29(日) 22:09:10.65ID:+VDCQEdm
言語の理想と実装は違うから食い違いが出ている。現実的には作者がめんどくさくなったり、ライブラリとそれを利用するレイヤーの区別があいまいな場合などに大域脱出とスタック巻き戻しがしたいだけで回復可能な場合にもpanicを投げてしまう実装もありうるのでバグではない。標準ライブラリでさえそうなのだから
124デフォルトの名無しさん
垢版 |
2023/01/29(日) 22:14:20.10ID:jL8Axswy
> 受け取ったデータなどを調べてpanicさせる方法などが公式ドキュメントにも述べられている。
これはpanicを使えということじゃなくサンプルコードとしての簡潔さ優先してるだけ
改善はされてきてるけどunwrapがあちこちにあるのと同じ
箸の上げ下げレベルで手取り足取り教えてもらうことを期待し過ぎじゃないか
2023/01/29(日) 22:21:53.21ID:qSgQK/Ke
>>118
うん別に良いデザインではないよ、そこは同意する
俺は「同じexitがあるのに」という表現が招きかねない誤解に釘を差しただけです
2023/01/29(日) 22:33:36.00ID:+VDCQEdm
>>124
もちろんドキュメントで述べられてる通り、Resultが一番の選択肢で回復可能で返せるのにpanicを使うのは愚策でしょう。だから理想はとそういってますよね?
手取り足取り教えてもらうのはどちらなのかというよりも、どうしてもpanicで終了はバグだという理想・意見をとゴリ押ししたいだけに見えます。
これは(=回復可能なのに)panicを使えということじゃなくというのは強く同意ですが、そうなっていないものを使用している現実があるという話でpanicを書いてないことに期待し過ぎじゃないか?ということになります
2023/01/29(日) 22:38:36.38ID:yP5ym/xP
>>119
Rustでそのような形のpanicの使われ方はしませんしpanicは起きません
タイムアウトもio::Resultでio::Errorが返るだけです

これはC言語で書いてSO_RCVTIMEOでタイムアウト値を設定してreadで-1とerrnoが返る時と全く同じ状況です
言語独自の例外機構を持つ言語は複雑にしてややこしくしているだけなのでその考えをまず捨てるところからスタートしましょう
2023/01/29(日) 22:44:10.80ID:yP5ym/xP
>>126
今回のケースでも標準ライブラリはpanicを起こしていませんしpanicを起こす仕様はありません
もしpanicが起きたのならばそれはあなたがResultの処理をせずに強引にunwrap()したためであり
あなたのコードがpanicを引き起こしたのです
2023/01/29(日) 22:49:39.52ID:ZDOIjMr/
The BookにmainまでResultで戻す実践的な設計方法って解説されてる?
機能の説明はあっても実装するうえでどのようにしたらいいのかってところは抜けているような
ググるとstd::num::*を返す例、Stringを返す例、enumを返す例などが出てくるが
どのように使い分ければいいのかって点は不明
このスレ見ていてもこの部分に関する資料を提示している人は見かけないし

>>124
>箸の上げ下げレベルで手取り足取り教えてもらうことを期待し過ぎじゃないか
箸文化圏なら要らないだろうがスプーン・フォーク文化圏なら要るんじゃね
他所と大きく違うのであれば十分な説明を求められるのは当然では
2023/01/29(日) 22:51:25.05ID:CZoRokqJ
> 例には、不正なデータを渡されたパーサとか、 訪問制限に引っかかったことを示唆するステータスを返す
> HTTPリクエストなどが挙げられます。 このような場合には、呼び出し側が問題の処理方法を決定できる
> ようにResultを返してこの悪い状態を委譲して、 失敗が予想される可能性であることを示唆するべきです。
> panic!を呼び出すことは、 これらのケースでは最善策ではないでしょう。
■ このスレッドは過去ログ倉庫に格納されています