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/17(火) 12:41:51.84ID:esjs4yiD
たておつ
2023/01/17(火) 14:00:56.91ID:MqwPrlrO
89 それでも動く名無し 2023/01/10(火) 23:26:51.53 ID:pA5+SQtP0
痴漢ものAVと違ってこういうガチ痴漢は臨場感が違うわ
抵抗されて上手く行かなかったり、たまに他の客にバレて逃走してるからな
マジで興奮する
https://i.imgur.com/My4nuB1.jpg
https://i.imgur.com/ttXkWGH.jpg
https://i.imgur.com/upphmaU.jpg
https://gcol;le.net/product_info.php/products_id/763929/ref/15062/affiliate_banner_id/1

520 名無しさん@ピンキー sage 2023/01/03(火) 21:36:57.85 ID:AS4vmq4R0
不朽の名作が復活していたので
https://i.imgur.com/SGsDTp5.jpg
https://i.imgur.com/4R20ojB.jpg
https://gcol;le.net/product_info.php/products_id/863650/ref/15062/affiliate_banner_id/1
2023/01/17(火) 14:01:08.20ID:MqwPrlrO
すみません、誤爆しました
2023/01/17(火) 14:04:39.15ID:QD1aLS8A
   . :::';;;;: . .     ..,,,;;:
   . . :;;;;;:.:;;,,    ..:.;;;;.:
   :;;'''  .:';;; . .  .:.:;;;;;':. . .        .,,,,;,,...,,
      .:;;;' :   .:;;;;; .: ,,,;;;,,,   ,  .:;;;';;''' ''';;;;,,
     . :.;;;;' . .:   ;;;;;;;;'''' ';;;:.:.. ,;: . .    ''''''"
     ';;:;'     '''';   .:.';;;;,,;;.
                 '''  ,.:.:';;;;,,,,
             ,、—-、    .;.';:;.:.: ;;;;;;:.;.;...
   -、_      (_二ニ=っ,、;;;:.:;.:;...:.:...'''''''''''
     `‐-、_  (  ´∀)f、 `''、:..:.:. .:
         `-,ノ   つ; /
         (〇  〈-`'"
         (_,ゝ  ) `‐-、_
           (__)     `'‐-、,_..
                        `‐-、._
2023/01/17(火) 14:25:12.33ID:IvlgRnTP
ここが新しいおちんぽスレと聞いて
7デフォルトの名無しさん
垢版 |
2023/01/17(火) 14:31:29.73ID:AjT+2M0N
最低だな
犯罪者予備軍やん
2023/01/17(火) 16:35:46.70ID:+0g0VEsU
通報しといたよ
2023/01/17(火) 16:41:04.96ID:mmIRzxLT
はよ立て直せ
2023/01/18(水) 10:59:16.69ID:j7LzfbP6
ワッチョイ有効スレ
https://mevius.5ch.net/test/read.cgi/tech/1674007100/
2023/01/18(水) 12:30:23.66ID:NvrWVfIW
おちんぽまんまんスレ違いと聞いて
2023/01/18(水) 20:15:50.70ID:CRD98AUE
ResultがErrの時だけブロックを実行するifってどうやって書けばいいの?
if Err(_) = fs::read_to_string("foo.txt") { err() }
は通らないようだが
2023/01/18(水) 20:29:34.91ID:vXgVoSzN
if let Err(_)
2023/01/18(水) 20:41:58.72ID:CRD98AUE
>>13
サンキュー。行けた
2023/01/19(木) 04:27:00.05ID:UpsgRjC+
>>12
エラーが起きた時は先に判断してreturnして
そうでなく正常値が得られた時はlet代入してインデントを下げずに書けないかな?
2023/01/19(木) 07:51:52.20ID:kHXiKnOP
>>15
それが少し前に入ってみんな喜んでた let else だね。

let Ok(value) = result else { return };
/* Ok のときやりたい処理 */

みたいにエラーは早期リターンして、正常系をインデント下げて書くみたいなことができる。

俺は Err は anyhow で呼び出し側に返しちゃう事が多いから正直あまり使わないけど。
17デフォルトの名無しさん
垢版 |
2023/01/19(木) 10:36:41.67ID:pws6L0p3
Option/Result系は?演算子で素直に返すしそれ以外でもResultを返す関数に切り出して呼び出し側で?演算子にするからlet-elseは使い所がよく分からん
2023/01/19(木) 11:05:24.00ID:MVgEnHGb
>>15
そもそもreturnしない。err()の中身はエラーメッセージを出力後にパニックさせるので一方通行
19デフォルトの名無しさん
垢版 |
2023/01/19(木) 13:52:46.10ID:i8wJP128
expectじゃだめなのかな?
もう少しちゃんとしたロギングをしたいならlog crate使ってlog_expectみたいな形でunwrap
20デフォルトの名無しさん
垢版 |
2023/01/19(木) 14:21:48.46ID:plizw9iy
自分で書いといてあれだからやっばりexpect使うケースじゃないな
panicさせるよりもErrのまま最上位まで返してそこでログ出力含めてハンドリング
2023/01/19(木) 18:44:58.53ID:kHXiKnOP
expectってライブラリの動作確認とかサンプルコードとか、トップレベルで雑なことしたいとき以外使わなくない?

深めの階層で見かけたら身構えちゃいそう。
2023/01/19(木) 19:25:25.54ID:UlqzrrZi
論理的に安全にunwrapできるってわかってる箇所には使うかな
もしパニックになるならそもそも致命的な論理バグがあるってことになるから
変にエラー処理するより早期に落とした方がいいってケース
2023/01/19(木) 20:03:32.07ID:KyLvYp+m
横からですまんが安全なら unwrap() でよくない?
expect() にする理由ってなんだろう
2023/01/19(木) 20:30:48.24ID:UlqzrrZi
個人的には Regex::new(r"").unwrap() みたいに自明ならunwrap
安全にunwrapできる理由を書きたいならコメントに書くよりexpectに書くかな
2023/01/19(木) 20:45:59.09ID:kHXiKnOP
なるほどね。自明な時に unwrap したいけど、仮に起きたときに原因調査しやすいよう expect というのは納得できる。
2023/01/19(木) 20:51:26.80ID:kHXiKnOP
あ、違うか。unwrapできる理由を書くわけか。

paniced at 'ここでは 0 は渡ってこないので自信を持って除算する'

みたいな出力になるから割と恥ずかしいな。
2023/01/19(木) 21:03:13.60ID:KyLvYp+m
>>26
これは俺も思ったw
まぁ自分しか使わないライブラリとかならいいかもね
2023/01/19(木) 22:24:19.09ID:uAmZfzQm
>>27
自分意外が使う前提のときのほうが except が必要だと思う。

外部から与えられる情報が仕様外の場合 (事前条件が満たされない場合) など
使い方が誤っているときに起こりえるなら except で説明があったほうがいいんじゃない?

内部的なロジック的に起こりえないと確信しているところは unwrap でいいと思う。
間違いがあったときに panic! してくれることには変わりないしバックトレースも出せるんで、
特に必要だと思う箇所だけ説明を付けておけば十分でしょ。
2023/01/19(木) 22:58:51.51ID:TbDEskmg
>>26
関係ないけどpanicに-ed、-ingつけるとkが差し込まれてpanicked、panickingになる
自分もRust触るまで知らなかった
2023/01/20(金) 00:14:17.87ID:+VmzUJ32
Optionを返す関数が2つ(以上)あり、
Someを得られるまで遅延評価で順に試す場合に、
func1(arg)
.or_else(|| func2(arg))
と非対称で手間なのを改善する方法ありますか?
例えば func1(arg) || func2(arg) と書けると便利だと思いました
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アプリって...通信が出来ない状態でも何らかのオフライン操作が行えるアプリであればそうでしょうが
仕様上、エラーハンドリングを行わなければならないとされていないならバグではないでしょ....
むしろ大したログやコンソールでの情報も出さず、「エラー:通信ができましぇん」なんて返されるほうが迷惑だわ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況