公式
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
287デフォルトの名無しさん
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は最近出てきた新興ライブラリ
当然それまでは誰も使っていなかったわけで初心者がいきなり必須なものでもない
初心者にとっては複雑で機能過多で理解しにくいのでまずは標準ライブラリから始めたほうが良いかな
当然それまでは誰も使っていなかったわけで初心者がいきなり必須なものでもない
初心者にとっては複雑で機能過多で理解しにくいのでまずは標準ライブラリから始めたほうが良いかな
315デフォルトの名無しさん
2023/02/02(木) 01:38:05.78ID:JL6WsU2I 対象年齢付きのおもちゃか何か?w
自分だけ勝手に縛ってろw
自分だけ勝手に縛ってろw
316デフォルトの名無しさん
2023/02/02(木) 03:39:28.87ID:S9qGtTXE Rustは「教官付き教習車」だよ。
cとかと違ってアホが膝を撃ち抜く自由は許さない。
それが嫌ならRust止めれば?
cとかと違ってアホが膝を撃ち抜く自由は許さない。
それが嫌ならRust止めれば?
317デフォルトの名無しさん
2023/02/02(木) 07:11:05.90ID:02L2EQ2o Rustはコンパイラの防波堤の中で安全な自由があるけどそれはともかく
クセの強いanyhowをRustの基本より先に初心者に教えるのはあかんよ
たとえば、他人も使うライブラリ作成ではanyhowの使用を避ける、といった当たり前のことも
エラーに関する基本を知らないと陥ってしまう
クセの強いanyhowをRustの基本より先に初心者に教えるのはあかんよ
たとえば、他人も使うライブラリ作成ではanyhowの使用を避ける、といった当たり前のことも
エラーに関する基本を知らないと陥ってしまう
318デフォルトの名無しさん
2023/02/02(木) 07:31:00.57ID:c3pJ+FwE >>316
rustの免許とりたいんですがおすすめの教習所はありますか?w
rustの免許とりたいんですがおすすめの教習所はありますか?w
319デフォルトの名無しさん
2023/02/02(木) 07:34:23.41ID:/W20jYzd anyhowはもはや標準ライブラリでしょ
320デフォルトの名無しさん
2023/02/02(木) 07:55:32.16ID:Cx26n0QZ321デフォルトの名無しさん
2023/02/02(木) 08:05:47.28ID:VrfwqxiC >>318
コンパイラ(教官)はひとつしか無いから選択肢は無いよ。
コンパイラ(教官)はひとつしか無いから選択肢は無いよ。
322デフォルトの名無しさん
2023/02/02(木) 08:14:13.18ID:eMZEpDOV コードを貼るわけでも実装例を示すわけでもない時点でシッタカだろ
323デフォルトの名無しさん
2023/02/02(木) 09:11:33.63ID:ICVq01Bq anyhow勧めてる人自身があんまり理解してないんだと思う
324デフォルトの名無しさん
2023/02/02(木) 12:40:03.75ID:8vdGQp5R325デフォルトの名無しさん
2023/02/02(木) 12:47:49.51ID:YyXCj6j+ オライリー本にも実戦ではanyhowとthiserrorを使えと書いてる
326デフォルトの名無しさん
2023/02/02(木) 12:59:53.51ID:c3pJ+FwE >>321
うまいこといいますね。お見事!
うまいこといいますね。お見事!
327デフォルトの名無しさん
2023/02/02(木) 13:20:28.44ID:C8PK02xw 禁忌事項はライブラリを作って提供する時にanyhowを使ってしまうことだけだから
そこはanyhowを使わずにthiserrorを使えばヨシ
そこはanyhowを使わずにthiserrorを使えばヨシ
328デフォルトの名無しさん
2023/02/02(木) 15:47:50.42ID:HD9HoUeH 別にanyhowをthiserrorに差し替えるのも大した手間じゃないしな
ライブラリで使っちゃってるなら変更PRでも出してやれば良い
ライブラリで使っちゃってるなら変更PRでも出してやれば良い
329デフォルトの名無しさん
2023/02/02(木) 23:07:11.98ID:3wRXRcn7 >>325
anyhowとthiserrorを使うなと言ってる人は誰もいなくて
・まず先にstd::error::Errorを覚えよう
・次に?変換とdynダウンキャストを覚えよう
・そしてanyhowとthiserrorへ進もう
という話でしょ
そうすればanyhowをライブラリで使うべきでない理由もわかるでしょうし
anyhowとthiserrorを使うなと言ってる人は誰もいなくて
・まず先にstd::error::Errorを覚えよう
・次に?変換とdynダウンキャストを覚えよう
・そしてanyhowとthiserrorへ進もう
という話でしょ
そうすればanyhowをライブラリで使うべきでない理由もわかるでしょうし
330デフォルトの名無しさん
2023/02/02(木) 23:14:43.66ID:3quZbai0 Rustの世界でダウンキャストってなんかキモいな
331デフォルトの名無しさん
2023/02/02(木) 23:37:26.35ID:wswA48V7 むしろRust基盤の一つ
downcastはエラー処理に限らずdyn Traitを元の型に戻すために必須
anyhowでも元のエラー型に戻すために必須
downcastはエラー処理に限らずdyn Traitを元の型に戻すために必須
anyhowでも元のエラー型に戻すために必須
332デフォルトの名無しさん
2023/02/02(木) 23:53:43.61ID:86yN0Q3V ダウンキャストのソース見てみたら
やっぱりunsafeのかたまりだった
やっぱりunsafeのかたまりだった
333デフォルトの名無しさん
2023/02/02(木) 23:53:52.64ID:QEJ+oT50 ダウンキャストを知らないと
>>303のようにdyn Errorで出来ることはログ出力だけと思いこんでしまう
>>303のようにdyn Errorで出来ることはログ出力だけと思いこんでしまう
334デフォルトの名無しさん
2023/02/02(木) 23:59:01.23ID:Cx26n0QZ335デフォルトの名無しさん
2023/02/03(金) 00:57:17.44ID:teLYlQt8 dynを元の型に戻すという発想に違和感(気持ち悪さ)を感じる人もいると思う
元の型に戻すつもりならそもそもdynにしないというか
ダウンキャストは戻すべき型(の変更)を全部把握できる閉じた状況じゃないと使いにくい
元の型に戻すつもりならそもそもdynにしないというか
ダウンキャストは戻すべき型(の変更)を全部把握できる閉じた状況じゃないと使いにくい
336デフォルトの名無しさん
2023/02/03(金) 01:37:41.39ID:VgIBWdEw >>335
anyhowを使うのはそういう全部把握できる閉じた状況で
独自エラー型を用意するのが面倒な時に使うからダウンキャストが理に適っている
嫌ならanyhow使わずにthiserrorを使えばよい
anyhowを使うのはそういう全部把握できる閉じた状況で
独自エラー型を用意するのが面倒な時に使うからダウンキャストが理に適っている
嫌ならanyhow使わずにthiserrorを使えばよい
337デフォルトの名無しさん
2023/02/03(金) 07:58:09.95ID:+r7mcEDE >>335
型を全て把握しておく必要はない
例えばエラー処理で大半はエラー表示のみだが一部だけ特別な処理をしたいとすると
その処理したいエラー型のみダウンキャストして使えばいい
ちなみにダウンキャストは内部で定数のu64で表現される型番号をu64比較するだけなのでコストがかかるものではない
型を全て把握しておく必要はない
例えばエラー処理で大半はエラー表示のみだが一部だけ特別な処理をしたいとすると
その処理したいエラー型のみダウンキャストして使えばいい
ちなみにダウンキャストは内部で定数のu64で表現される型番号をu64比較するだけなのでコストがかかるものではない
338デフォルトの名無しさん
2023/02/03(金) 08:54:57.66ID:Vma9tJMI ダウンキャストの扱いかどうか知らんが、パターンマッチングも総和型から個別型ヘのキャストみたいなもんだろ。
339デフォルトの名無しさん
2023/02/03(金) 09:11:06.24ID:+r7mcEDE もしdyn使わずに自作Enum収容エラー型を定義して使っても
Enumタグ比較で分岐することになるから状況は似たようなもの
Enumタグ比較で分岐することになるから状況は似たようなもの
340デフォルトの名無しさん
2023/02/03(金) 09:18:29.47ID:H94wvEsC std::any::Any.downcast_ref() を使わずにanyhow独自に実装してるね
341デフォルトの名無しさん
2023/02/03(金) 09:36:29.67ID:e19a6Rdo 初めて間もないけど
println!("{}", a);
とか手が攣って辛い
tabでもprintlnまでしかでないしコピペでもしてるの?
println!("{}", a);
とか手が攣って辛い
tabでもprintlnまでしかでないしコピペでもしてるの?
342デフォルトの名無しさん
2023/02/03(金) 09:43:50.06ID:90dUFc67 downcastすればいいだけだからdyn Error返してもデメリットは無いってのなら
ライブラリでanyhowを使うのも大した問題じゃないって結論になるん?
ライブラリでanyhowを使うのも大した問題じゃないって結論になるん?
343デフォルトの名無しさん
2023/02/03(金) 10:26:25.61ID:5QmoSp+n344デフォルトの名無しさん
2023/02/03(金) 10:31:15.17ID:Vma9tJMI >>343
anyhowの問題点なんて一般的じゃないんだから、曖昧に言わずに具体的に説明しなよ。
anyhowの問題点なんて一般的じゃないんだから、曖昧に言わずに具体的に説明しなよ。
345デフォルトの名無しさん
2023/02/03(金) 10:48:35.31ID:yQvnFmTM 予言しよう
ググれば分かるんだから書かないとか言って絶対に具体的な説明はしないやつだよ
ググれば分かるんだから書かないとか言って絶対に具体的な説明はしないやつだよ
346デフォルトの名無しさん
2023/02/03(金) 12:00:34.82ID:7ZLHWUFf 俺はなんも知らんから頭の片隅に覚えておくくらいにしとくわ
使うときに調べる
使うときに調べる
347デフォルトの名無しさん
2023/02/03(金) 12:23:43.68ID:dwx7vokg >>345
検索しても出てこなかったよ。
検索しても出てこなかったよ。
348デフォルトの名無しさん
2023/02/03(金) 12:37:16.79ID:tbHpIbwJ Rustでエラー型はstd::error::Errorトレイトを実装するのが共通のお約束だけど
anyhow::Errorは諸事情あって実装されていないんよ
std::error::Errorトレイト実装を前提として扱っているところへライブラリがanyhow::Errorを返しちゃうと困っちゃう
ライブラリを作るときはthiserrorでエラー型を作ればstd::error::Errorトレイトを自動で実装してくれるから大丈夫だよ
もちろんthiserror使わずに自分で実装してもいいよ
anyhow::Errorは諸事情あって実装されていないんよ
std::error::Errorトレイト実装を前提として扱っているところへライブラリがanyhow::Errorを返しちゃうと困っちゃう
ライブラリを作るときはthiserrorでエラー型を作ればstd::error::Errorトレイトを自動で実装してくれるから大丈夫だよ
もちろんthiserror使わずに自分で実装してもいいよ
349デフォルトの名無しさん
2023/02/03(金) 15:29:10.83ID:Vma9tJMI350デフォルトの名無しさん
2023/02/03(金) 18:59:27.03ID:NDb3ccU3 Box<dyn Error>もErrorトレイト実装してないよ(コンフリクトで実装できない)
その点はdyn Errorで返してもanyhowで返しても大差ない
libraryのpublicなAPIでtype erasedなエラーを返したいときは
Errorを実装した独自のエラー型を用意するのが普通
anyhowで返してる有名ライブラリもあるけどね
ライブラリでanyhow使ったらダメなんてことは特にないんだけど
Readme読めばすぐわかるように基本的にはアプリケーション用
なぜ同じ作者のエラー系のライブラリがanyhowとthiserrorと2つあるんだろうか?
と疑問に持つだけでも初心者はstdベースで学習するよりも1歩先に進めてる
その点はdyn Errorで返してもanyhowで返しても大差ない
libraryのpublicなAPIでtype erasedなエラーを返したいときは
Errorを実装した独自のエラー型を用意するのが普通
anyhowで返してる有名ライブラリもあるけどね
ライブラリでanyhow使ったらダメなんてことは特にないんだけど
Readme読めばすぐわかるように基本的にはアプリケーション用
なぜ同じ作者のエラー系のライブラリがanyhowとthiserrorと2つあるんだろうか?
と疑問に持つだけでも初心者はstdベースで学習するよりも1歩先に進めてる
351デフォルトの名無しさん
2023/02/04(土) 00:38:01.54ID:5aCWsuCk ダウンキャストは静的チェックできず変更に弱いからホイホイ使うものじゃないよ
352デフォルトの名無しさん
2023/02/04(土) 07:20:32.73ID:eqpqpGi8 >>351
ダウンキャストは静的に型を指定して
Some()で静的な型で値が返ってきて
その値の使用も静的に型チェックされる
「マッチングが動的ではないか?」については
Enumで複数の型を収容した場合と全く同じ
どちらの場合もマッチングは動的に行われるが静的に型チェックされる
どちらも静的に型を抽象化した定数の整数値との比較によるマッチングとなる点も同じ
ダウンキャストは静的に型を指定して
Some()で静的な型で値が返ってきて
その値の使用も静的に型チェックされる
「マッチングが動的ではないか?」については
Enumで複数の型を収容した場合と全く同じ
どちらの場合もマッチングは動的に行われるが静的に型チェックされる
どちらも静的に型を抽象化した定数の整数値との比較によるマッチングとなる点も同じ
353デフォルトの名無しさん
2023/02/04(土) 09:46:17.84ID:4OrKEijd ばかばかc
354デフォルトの名無しさん
2023/02/04(土) 09:59:08.11ID:wSUDs8sY Rustのdynとそのdowncastは安全性と最小限のコストを両立させており安心して使える
引数などでimpl Traitが使える場合はimplが有利なケースもあるが
返値などでdyn Traitしか使えない場合もあり適材適所で使い分け
引数などでimpl Traitが使える場合はimplが有利なケースもあるが
返値などでdyn Traitしか使えない場合もあり適材適所で使い分け
355デフォルトの名無しさん
2023/02/04(土) 10:30:58.71ID:yB06Lfm4 >>352
よくわかってないものを人に勧めちゃダメだよ
よくわかってないものを人に勧めちゃダメだよ
356デフォルトの名無しさん
2023/02/04(土) 12:22:28.04ID:eqpqpGi8 久々に荒らし発生かな
357デフォルトの名無しさん
2023/02/04(土) 12:44:13.93ID:vEFKnpWX ダウンキャストの安全性みたいなのは downcast_ref 使ってりゃ議論の余地はないと思うけど網羅性は限界があるわね。
ライブラリはやっぱエラー型を明示すべき。
ライブラリはやっぱエラー型を明示すべき。
358デフォルトの名無しさん
2023/02/04(土) 13:10:09.04ID:QerlffZr 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
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デフォルトの名無しさん
2023/02/04(土) 13:39:49.84ID:A1ugYU/e エラー処理で網羅性は関係ないだろ
std::io::Errorのenum ErrorKindからしてnon_exaustive指定だぞ
match式で網羅性はチェックされない
特別な処理が必要なエラーだけ処理対応して残りはエラー表示が普通だ
std::io::Errorのenum ErrorKindからしてnon_exaustive指定だぞ
match式で網羅性はチェックされない
特別な処理が必要なエラーだけ処理対応して残りはエラー表示が普通だ
360デフォルトの名無しさん
2023/02/04(土) 13:52:58.01ID:RtFCJdnN エラー処理で重要なことは
・エラーが発生しているにも関わらずそのまま通常処理を進めないこと
・エラー表示以外の対応を必要とするエラーの場合にその対応をすること
・それ以外のエラーはエラー表示などをすること
enumタグレベルの網羅性を求められることはないな
・エラーが発生しているにも関わらずそのまま通常処理を進めないこと
・エラー表示以外の対応を必要とするエラーの場合にその対応をすること
・それ以外のエラーはエラー表示などをすること
enumタグレベルの網羅性を求められることはないな
361デフォルトの名無しさん
2023/02/04(土) 14:46:52.23ID:7PnUG+Eh 元々の話はdyn Errorかanyhowか、だったような気がするけど、
anyhowはdyn Errorの自作ラッピングみたいなもので、
とちらを使ってもダウンキャストしなきゃいけない点も網羅性がない点も同じだよね。
そしてそれらをアプリ側で使ってる限り困ることもない。
anyhowはdyn Errorの自作ラッピングみたいなもので、
とちらを使ってもダウンキャストしなきゃいけない点も網羅性がない点も同じだよね。
そしてそれらをアプリ側で使ってる限り困ることもない。
362デフォルトの名無しさん
2023/02/04(土) 17:06:34.73ID:1vu2ZDPp そもそもがダックタイピングとか向いてる言語じゃない。
フロントでこの言語使おうとするとかただのバカでしかないわ。
フロントでこの言語使おうとするとかただのバカでしかないわ。
363デフォルトの名無しさん
2023/02/04(土) 17:36:37.29ID:roDrLtFP 唐突にフロントとかダックタイピングとかどうした?
しかもその二つも関連性がない
しかもその二つも関連性がない
364デフォルトの名無しさん
2023/02/04(土) 18:06:27.05ID:uIknpDmG 上位レイヤーも含めてエラーの内容によって分岐したいならdyn Errorはやめたほうがいい
365デフォルトの名無しさん
2023/02/04(土) 18:34:38.01ID:srvPtSil 分岐にenumのタグを使うかErrorの型名を使うかの違いでしょ
enumを使うと一貫性を担保しやすいから保守性が向上するし
dyn Errorを使うとenumの定義を省略できるからコードを減らせる
自分は(分岐するなら)enum派だけど何を重視するかで結論が変わりそう
ただ「やることが一緒だからどっちも同じ」と考えはいただけない
enumを使うと一貫性を担保しやすいから保守性が向上するし
dyn Errorを使うとenumの定義を省略できるからコードを減らせる
自分は(分岐するなら)enum派だけど何を重視するかで結論が変わりそう
ただ「やることが一緒だからどっちも同じ」と考えはいただけない
366デフォルトの名無しさん
2023/02/04(土) 18:40:15.09ID:3y1LLse5367デフォルトの名無しさん
2023/02/04(土) 19:00:20.00ID:eqpqpGi8 dyn Errorもダウンキャストも使用して全く問題ないよ
有名どころでも普通に使われている
例えばreqwestはdyn Errorを使っていてdowncast_ref()してエラー処理している
cargoはanyhowを使っていてdowncast_ref()してエラー処理している
使うのをやめたほうがいいと主張している人は一種の宗教にすぎないことに気付こう
有名どころでも普通に使われている
例えばreqwestはdyn Errorを使っていてdowncast_ref()してエラー処理している
cargoはanyhowを使っていてdowncast_ref()してエラー処理している
使うのをやめたほうがいいと主張している人は一種の宗教にすぎないことに気付こう
368デフォルトの名無しさん
2023/02/04(土) 22:40:19.42ID:JjHQagj1 勘違いしてる内容が同じだから
自演しまくっても同一人物なの丸分かりだね
ダウンキャストオジ==複オジ
自演しまくっても同一人物なの丸分かりだね
ダウンキャストオジ==複オジ
369デフォルトの名無しさん
2023/02/05(日) 02:20:20.64ID:VCqNNrEk 無敵やな
もちろんいい意味で
もちろんいい意味で
370デフォルトの名無しさん
2023/02/05(日) 02:25:01.54ID:a/eU++XN 一年ぐらい前にanyhowを標準化する、みたいな話なかったっけ?
371デフォルトの名無しさん
2023/02/05(日) 02:59:04.83ID:26rYdUrG anyhowはダウンキャストするしかないクソ
372デフォルトの名無しさん
2023/02/05(日) 06:00:11.27ID:TqN0qcyT オライリーの本って出てから1年経つけどさあ
これの電子版って、セールになったりする機会ってあるもんなの?
これの電子版って、セールになったりする機会ってあるもんなの?
373デフォルトの名無しさん
2023/02/05(日) 06:31:13.67ID:qzS4+JVd ダウンキャストを毛嫌いしてる人の心理を知りたい
374デフォルトの名無しさん
2023/02/05(日) 12:11:30.30ID:vL4nY6Md375デフォルトの名無しさん
2023/02/05(日) 12:37:36.14ID:yQ5U4c14 作るシステムの性質や分野ごとで許されるエラーハンドリングは別物だからね。
ミッションクリティカルだけが正解ってわけでもないのよ。
ミッションクリティカルだけが正解ってわけでもないのよ。
376デフォルトの名無しさん
2023/02/05(日) 14:02:09.96ID:dIeXO9aa >>375
何がまちがってるかさえも分からないようならThe Bookを一から読み直して出直してこい
何がまちがってるかさえも分からないようならThe Bookを一から読み直して出直してこい
377デフォルトの名無しさん
2023/02/05(日) 14:22:39.74ID:Ib1Yzzhk たまに出てくる「間違っている」「勘違いしてる」「嘘を書くな」の人
今までも文句をつけるだけで正確を書いたことがないから信頼できないのよね
今までも文句をつけるだけで正確を書いたことがないから信頼できないのよね
378デフォルトの名無しさん
2023/02/05(日) 14:23:18.13ID:8OOQa3AE どっちも自分の脳内シチュでしか語ってないからふわっふわで論破出来るわけもなし
自分の主張が通る具体例上げるといいよ
自分の主張が通る具体例上げるといいよ
379デフォルトの名無しさん
2023/02/05(日) 14:35:53.55ID:LY0V54Tb 「カッコウのアルゴリズムさえまともに実装できてないからクソ遅いんだよな」
みたいに適当なワード混ぜて意味不明なこと言いつつ同意してる風を装うと「そうなんだよ!」とか勝手に乗っかってきて自爆するから面白いぞ
みたいに適当なワード混ぜて意味不明なこと言いつつ同意してる風を装うと「そうなんだよ!」とか勝手に乗っかってきて自爆するから面白いぞ
380デフォルトの名無しさん
2023/02/05(日) 15:42:56.66ID:XUJKjP/6381デフォルトの名無しさん
2023/02/05(日) 15:53:21.98ID:ANWYibFj382デフォルトの名無しさん
2023/02/05(日) 16:01:07.42ID:3wawDpMD383デフォルトの名無しさん
2023/02/05(日) 16:04:59.96ID:0ZBI/vwq384デフォルトの名無しさん
2023/02/05(日) 17:40:20.51ID:X5wQdMGf 網羅性が必要ないならResult使う必要もRustを使う必要もないわな
385デフォルトの名無しさん
2023/02/05(日) 18:32:46.51ID:rtbv+KUs386デフォルトの名無しさん
2023/02/05(日) 20:10:29.95ID:QsKcw+fO cargo crateのコード見てみた
anyhowを使ってエラーを上へ上げていく
enumを使っておらずエラーの網羅性はない
downcast_refを使ってエラー分岐している
anyhowを使ってエラーを上へ上げていく
enumを使っておらずエラーの網羅性はない
downcast_refを使ってエラー分岐している
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 立憲・野田代表が主張 台湾有事答弁で「質問者批判は筋違い」「答弁がおかしい」「高市総理迎合のネット世論は危険」 [♪♪♪★]
- 【速報】 植田日銀総裁 「円安進行が物価高を起こしている」 ★2 [お断り★]
- 【無言】中国怒らせた高市首相→1週間だんまり、国民に実害も説明なし 中国問題を避けてスルー… ★11 [BFU★]
- 【存立危機】高市総理 南アフリカに出発 G20サミット出席へ 日中の接触があるかが焦点… [BFU★]
- 【🍝】「偽カルボナーラ」にイタリア激怒、パンチェッタの使用は「犯罪」と非難 ★2 [Ailuropoda melanoleuca★]
- デヴィ夫人、悪化の日中関係に言及「戦いましょう」「日本の経済人よ、日本総力で戦えば勝てるはず」 [muffin★]
- 【鈴木早苗】お米券おひとり様3000円に閣議決定 [993451824]
- 7大、長野県の名物「信州そば」「牛乳パン」「おやき」「りんご」「エプソン」「新海誠」
- 🏡なにゃこのスリャ!🐧⚡🏡
- 麻生太郎(85)「国民は台湾有事で戦う覚悟が求められる」 [961870172]
- ジャップランドにネトウヨがこんなに多いとは想わなかったよな🥺 [929293504]
- おまえら…かわいいよ…ほんとかわいい
