Rust part13

■ このスレッドは過去ログ倉庫に格納されています
2021/11/07(日) 10:04:59.35ID:pJhT3MIE
公式
https://www.rust-lang.org/
https://blog.rust-lang.org/
https://github.com/rust-lang/rust

Web上の実行環境
https://play.rust-lang.org

日本語の情報
https://rust-jp.rs/

※Rustを学びたい人はまず最初に公式のThe Bookを読むこと
https://doc.rust-lang.org/book/

※Rustのasyncについて知りたければ「async-book」は必読
https://rust-lang.github.io/async-book/

※C++との比較は専用スレへ
C++ vs Rust
https://mevius.5ch.net/test/read.cgi/tech/1619219089/

※次スレは原則>>980が立てること

前スレ
Rust part12
https://mevius.5ch.net/test/read.cgi/tech/1629813327/
2022/01/22(土) 22:32:38.62ID:g0imoAcW
>>657
そんなレベルじゃないだろw
「値の参照外し」くらいのありえねーやつだぞ
2022/01/22(土) 23:03:41.04ID:bh/4ELt7
>>663
&Tを渡すこと
2022/01/22(土) 23:09:33.04ID:j/zdYx9z
>>654
>BoxとRefCellには共通点も類似性も関係性も何もない
そうそう、何の共通点も類似性も関係性もないのに
The BookではBoxとRefCellを対比させてどういうケースにどっちを使うかわざわざ解説してるんだよなぁ
何の共通点も類似性も関係性も無いにも関わらずw
2022/01/22(土) 23:45:04.56ID:YZScTEQ/
>>666
マジでその二つは関連も類似も何もない
大きく分類してもBoxはスマートポインタの一種だが
RefCellはスマートポインタではなく内部可変性という性質の指定のみ
2022/01/23(日) 00:16:51.00ID:GGOFm3A0
>>666
https://doc.rust-lang.org/book/ch15-05-interior-mutability.html
https://doc.rust-jp.rs/book-ja/ch15-05-interior-mutability.html
ここのこと?
2022/01/23(日) 01:50:05.66ID:N2HN4NXS
clippy様がvoldemort typeを説明せよと仰せなのだが
もしかして、名前を言ってはいけないあの人のことをご存じない?

>>668
そこはinterior mutabilityの前提としてborrowing rulesを
おさらいするためにBoxを出してるだけだから違うだろ。
多義的なオレオレ用語が多くて質は悪いけど
the bookに意味もなくBoxとRefCellを登場させてる章なんてなかったと思う。
2022/01/23(日) 09:58:49.85ID:I/0ReqFd
なんでわざわざ自演するのかね?
2022/01/23(日) 10:23:00.27ID:pcY9kzKW
それが仲介おじの悪癖なんよ
2022/01/23(日) 14:04:42.46ID:Tw7cio1+
病気だな
病名は知らんけど
2022/01/23(日) 15:19:04.05ID:Qjn377p7
rust勉強しはじめたばかり、C,C++はだいぶ昔少し経験がある程度

Cとかじゃ、constなpointerは、変数自体がconstと、指ししめす対象自体がconstである場合があり
const T * const p;
みたいな宣言があったが

Rustはデフォルトでイミュータブルなのはわかるけど、mutを付けると、変数自体も指し示す対象もmutableになってしまう?

let mut v = vec![1, 2, 3];
v.push(2);
v = vec![4,5,6];

どっちか一方を禁止する方法とかあるのですか?
2022/01/23(日) 17:38:28.44ID:v0FQj8Ao
C上がりのヤツって意味のないところにconst付けがち
関数の引数にconst DWORD vとか
2022/01/23(日) 19:54:52.69ID:GGOFm3A0
>>673
どういうことをしたいのかによるけど
let x = Vec![...];
let mut y = &x;
みたいにすればyは再代入可能だけどxやvecの中身は変更不可になる
2022/01/23(日) 20:02:24.55ID:N2HN4NXS
末尾oとかWとかで荒らしてるやつ回線なんだ?亡霊か?
2022/01/23(日) 20:58:37.79ID:sgP3cX+L
えっ、一人二役まだ続けるのか
2022/01/23(日) 22:45:59.41ID:N2HN4NXS
お前Lはないだろ
2022/01/23(日) 23:46:00.51ID:QpDxG2zZ
ちなみにRustでのconstとはコンパイル時点で定数(どんな複雑な型でもよい)であること
プログラミング言語によってはconstなのに実行時に決まる値(がその後変化しないこと、つまり単なるimmutable)を意味しているので意味の差に注意
2022/01/23(日) 23:59:31.12ID:2V1gRdrY
>>674
Rustでは関数の引数にconstはないな
ジェネリクスとしてのパラメータにはconstがありこちらは便利
2022/01/24(月) 00:27:06.65ID:bSZB9aci
>>675
ありがとうございます。
やりたいことは、だいたい同じですけど、少し違って
v.push(2)か再代入のv= vec![4,5,6];のどちらかを禁じたいでしたけど
あなたの投稿みて考えて

let v = &mut vec![1, 2, 3];
v.push(2);
//v = vec![4, 5, 6]; エラーになる

で一応できました。
でも再代入可能で、中身変更不可にvをする方法は思い浮かびませんでした。
675のようにして、vからyに代入したらyはそうなりますが。
682デフォルトの名無しさん
垢版 |
2022/01/26(水) 20:11:49.47ID:IHm+4QQV
すまんが、Replit使って学習してるんだけどさ
たまたま海外勢の動画見たら、同じReplitのはずなのに波線の指摘とかコード補完とか効いててびっくりしたわ
https://www.youtube.com/watch?v=MsocPEZBd-M
うちではこんなのならないんだけど・・・・やり方わかる人いたら教えてくれんかな?
2022/01/26(水) 22:40:12.84ID:e2k0MxNT
Repl.itは、リンターやデバッガーからサードパーティのパッケージ、ホスティング、デプロイまで、

すべてを備えた、ブラウザー内の完全な共同クラウド開発環境です
2022/01/27(木) 14:52:35.89ID:kmz9k/kc
プログラミングRustの第2版の訳書出たんだな
2022/01/27(木) 17:03:59.04ID:O/Xb3RdK
t
2022/01/30(日) 18:39:19.14ID:Np8aVX2s
Rustはゼロ除算はコンパイルエラーになるの?
2022/01/30(日) 18:46:47.93ID:iWlFH2We
const文脈ならコンパイルエラーになったはず
2022/01/30(日) 19:13:28.33ID:9ei8l7Ku
コンパイル時に判明しないゼロ除算やオーバーフロー除算 ex. -128_i8 / -1_i8 はpanicとなるので
それが困る場合はchecked_div()を使えばOption型が返りNoneとなる
2022/01/30(日) 20:48:51.55ID:iWlFH2We
>>688
ほんとだ、定数式じゃなくてもエラーになるんだね
https://play.rust-lang.org/?version=stable&;mode=debug&edition=2021&gist=78efbd7a2e6ac42c15da2cfb0d11485f

即値じゃなくてもエラーにしてくれてある程度賢そう
https://play.rust-lang.org/?version=stable&;mode=debug&edition=2021&gist=381372577a28207f3a37bc007ac6e29c
2022/01/30(日) 21:12:48.50ID:2J0C/Vn/
const fn divide(x:i32, y:i32) ->i32 {
x / y
}

let x = divide(1, 0); //panic
const y: i32 = divide(1, 0); //compile error
2022/01/31(月) 00:45:03.08ID:wgfsi16C
>>690
定数式の文脈でゼロ除算起きるとコンパイルエラーになるのはある意味当然だと思うんだけど
そうじゃないところでエラーになるのが意外だった
デバッグビルドでもMIRの最適化とかで定数畳み込みみたいなことやってるのかな
2022/01/31(月) 07:35:21.99ID:qlFEomu1
>>691
Rustではconst fnな関数を使ってconstな定数を作ることができる
つまりコンパイラがその定数を算出するためコンパイル時点で判明する
2022/01/31(月) 10:25:13.89ID:y6tOo2ii
とあるデータフォーマットを扱うライブラリを作っています。
一定形式のレコードが連続で書き込まれて最後には終端レコードが書き込まれるという単純な形式です。
Rust 上でもレコードを追加するのと終端処理のふたつのメソッドがあるだけです。
要は ↓ のように使えるライブラリだということです。

let mut file = File::create("file.hoge").unwrap();
Hoge::new(&mut file).add_entry("string1")?.add_entry("string2")?.finish();

このとき
・ 終端処理は必ずしたい
・ 終端処理はエラーの可能性もあり、それは捕捉したい (ので drop でさせられない)
という制約を静的に表現できるでしょうか?

現状では終端処理のメソッドが実行されたときにフラグを立てておいて
drop 内でそのフラグを検査するという形にしています。
可能ならコンパイル時に発見できるようにしたいです。
2022/01/31(月) 11:02:40.38ID:qlFEomu1
エラーを捕捉したいことをデストラクタに任せない
つまりそのような終端処理はdropされる前に終える
例えばBufWriter利用時も終える時は明示的にflushを呼ぶ
そしてflushはResultを返しエラーが判明する
2022/01/31(月) 11:32:28.54ID:LhFaS6j7
finishの呼び忘れを静的に捕捉したいということだからflushの例では不十分かな
add_entryの戻り値型の暗黙のdropを防げばいいけど、そういった機能はまだない(RFCにはあるけど進んではない)

https://users.rust-lang.org/t/prevent-drop-at-compile-time/20508
このスレッドではdropの実装に存在しないC FFI呼び出しを書いておいて、リンクエラーとして捕捉する方法が提案されているね
2022/01/31(月) 11:35:46.57ID:y6tOo2ii
>>694
それを制約として表現できるか (終端処理をしていないときにエラーになるように制約を書けるか) という質問をしてる。
つまり出来ないってこと?
2022/01/31(月) 11:53:47.47ID:y6tOo2ii
>>695
それは残念。

言語の機能として用意されてないまわりくどい方法を使うと
エラーメッセージがよくわからん (本来の問題とは違う内容が出てくる) ことになりがちだし、
使うときに unsafe や forget をいちいち書いてもらわなきゃならないのは
ライブラリとして提供するときにはちょっと汚すぎるなぁ。
2022/01/31(月) 12:37:43.75ID:pXNCEmdM
PhantomType的な?
2022/01/31(月) 12:39:21.72ID:pXNCEmdM
エラーメッセージがよくわからん事になりがちだからNGか
2022/01/31(月) 12:47:03.61ID:qlFEomu1
>>696
なるほど
コンパイラは解析してdropさせるべき位置を把握しているから
そこへ至る全ての経路上で例えばFinalize trait実装型はそのメソッドfinalize()を呼んでいないとコンパイルエラーとなる
というような制約をするFinalize trait
が存在していれば要望を満たす?
2022/01/31(月) 13:15:16.14ID:wgfsi16C
>>692
非const fnについての話なんだけど
2022/02/01(火) 18:21:42.44ID:EUosKgIx
amazon primeの記事経由でegui見てみたが結構いいな
ネイティブで試してみたが充分実用レベル
703デフォルトの名無しさん
垢版 |
2022/02/01(火) 21:04:57.74ID:YxH4csZd
GCは標準からは消えたけどライブラリでやればいいってかつてこのスレで言われたことがあるのだが、GCライブラリのデファクトスタンダードってどれだ
2022/02/01(火) 21:52:48.48ID:noSg7Gj9
>>703
デファクトなんてあるわけないじゃん
マークスイープGCするならRust使う意味ないんだから
705デフォルトの名無しさん
垢版 |
2022/02/01(火) 22:04:01.37ID:YxH4csZd
>>704
いや一部だけGC欲しい時は普通にあるからそれは言い過ぎ
2022/02/01(火) 22:51:54.30ID:l+/c7OlD
クッソ身につまされる記事があったので共有する
https://dystroy.org/blog/how-not-to-learn-rust
2022/02/01(火) 23:11:34.83ID:rVnoodM/
>>706
これはいい記事だな
次からテンプレ入り希望
708デフォルトの名無しさん
垢版 |
2022/02/01(火) 23:23:08.93ID:rLXhSAw+
>>702
eguiは毎回60fpsで全画面を描き直すことで差分描き直しを避けて簡単にしてるようだけど
省力化したい方針と合わないや
ゲーム向き?

>>705
GC使ってもRustのRAIIを無くせるわけじゃないから
そういう時はVecに入れて使って
あとは任意のタイミングで未使用の要素の区画を再利用という感じにしてる

>>706
Rustは各種bookを読んであとはstd docとreference見ながら
コンパイルエラーの通り直すだけで何とかなるから書かれている通りだね
付け加えると基本要素については覚えていないメソッドのために回り道しがちなので
Option Result slice str Iteratorあたりの全メソッドは一通り認識しておくといいかな
2022/02/02(水) 10:20:38.88ID:OC/eznuR
複製おじは自分では何とかなってると思ってるのか
2022/02/02(水) 11:48:12.13ID:yXsdGz3O
🐜蟻型蜂🐝はポジティブシンギング🤯だから
2022/02/02(水) 18:24:25.46ID:LUGaOk8s
>>706
>Mistake 3 : Start by implementing a graph based algorithm
その通りだとは思うけどRustと相性の良いアルゴリズム集的なのは欲しいとも思う
2022/02/02(水) 19:18:50.51ID:aYiI+nmg
>>711
汎用データ構造の大部分を使うな、という話になりそうだからなぁ。
スタックとキューくらいは楽に使えるのかね。
2022/02/02(水) 20:06:31.96ID:9W9+AwqU
dynや lifetime heavyは失敗しながら学ぶのでいいと思う
普通の人はしばらくやってれば気づくから
2022/02/02(水) 20:34:19.12ID:ljjcfSf9
deny(rust_2018_idioms)はガチのマジでオススメです
2022/02/02(水) 22:05:12.51ID:cdYzXGt/
データ構造が大事なんだって言われながら育ってきた身としちゃあ辛い話じゃねえか

自分で作らなけりゃいいんだな!ってslab_tree使って
「ある条件に合致した子ノードから、ルートまでの値をリストで取り出す」
みたいな処理を書こうとしたら怒られるんだよな。
node_ref.parent() : &Self<T> -> Option<NodeRef<T>
っていう型なもんだから、次々に親をたどるために
while Some(parent) = node.parent() { node = parent; ...}
みたいな処理書くと、当然怒られる。

何とか抜け道無いかって探したら、node自身じゃなくてそのIDを使えばよかったんだけど、
いつも抜け道があるとは思えない。辛い。
2022/02/02(水) 22:39:17.87ID:O+j3A95O
Rustで普通にやってるとスレッドセーフを強いられるから制約がキツくなるんだよね
2022/02/02(水) 22:41:53.47ID:J71gX0gE
大昔からの単純なポインタ相互参照だと
ダングリングポインタ・多重解放・解放忘れなどが全く存在しないことを検証すべき範囲が一般的には広くなりすぎる
もし狭い範囲に閉じ込められるケースならば閉じ込めた中でunsafeを用いたとしても効率的な型を提供すればよい
標準ライブラリにあるヒープを用いる型は全てそのようにして作られている
2022/02/03(木) 23:00:23.96ID:KgH5nhZs
>>684
今それ読んでる
出版物だけあって日本語の質はずっといい
2022/02/03(木) 23:17:16.89ID:VxNIdQ9k
Craterについて教えてください
2022/02/04(金) 00:50:00.86ID:Ueb60Gjp
>>718
もしかしてThe Bookの勝手訳の質と比べてる?
2022/02/04(金) 21:15:13.65ID:fCF+Tqbd
>>720
勝手訳というのがなにを指すのか不明だけどオリジナルのThe Bookからリンクされている日本語訳のことであればそれと比べている
2022/02/04(金) 21:21:32.40ID:b3SZZj/4
そんなのを見るのは極初期だけで些細な話
その後はdoc.rust-lang.orgとdocs.rsしか見ないのだから
2022/02/05(土) 13:22:14.88ID:XET6D0Ck
その極初期の人が見る和訳の質の話をしてるんだろ
2022/02/05(土) 14:41:30.63ID:e42LAXmg
あれは害悪レベルの訳だから初期でも見ない方がいいよ
ここでよくおかしなレスしてる人もあれの影響なんじゃないか?
2022/02/05(土) 15:12:20.92ID:WBcMnxrA
どうせ>>722のドキュメント見ないと先へ進めないしほとんどは中学生でもわかる平易な英語
日本語訳の質にこだわるような低レベルのやつはほっとけばいい
2022/02/05(土) 15:52:33.91ID:2hiBx8fY
Mistake 2 : Dive in without looking at the book
2022/02/05(土) 15:59:05.92ID:WBcMnxrA
>>726
まさにそれで最初は日本語訳でもいいがその後にthe bookを直接見るべき
そしてどの英単語でどう表現されているかを掴めば日本語訳がどうかに関わらず先へ進める
2022/02/05(土) 16:02:12.98ID:2hiBx8fY
>>727
言ってること変わってますけど
2022/02/05(土) 16:03:52.79ID:WBcMnxrA
一貫してるぞ
日本語訳の質にこだわるような低レベルのやつはほっとけばいい
これしか主張していない
2022/02/05(土) 16:09:07.88ID:2hiBx8fY
そこ以外の文章はポエムか何かだったの?
2022/02/05(土) 16:22:12.93ID:XET6D0Ck
じゃあ和訳の質を話題にしている低レベルの人同士の会話はほっとけばいいのにw
2022/02/05(土) 17:02:52.76ID:VkrSTqtm
日本語イラネ言っている人は技術資料が英語でも
日本語でも生産性が変わらない人なんだよね?
アメリカの仕事でもした方が稼げるんじゃない?
2022/02/05(土) 17:05:29.47ID:nog/R4+C
和訳の質にこだわってる人たちも唯一役に立つチャンスがあるよ
それは和訳の改善案を提案して質の向上に貢献すること
しかし和訳の質にこだわってるここの人たちは批判だけで提案がないから残念な人たち
2022/02/05(土) 17:15:34.64ID:9gZgvarh
和訳の質にこだわっている人たちの質にこだわっている人は何の役にたつの?
2022/02/05(土) 17:36:04.99ID:XET6D0Ck
どこの食堂が美味いか話しているところに割り込んで、
不味い方を立て直してこいと言うくらいナンセンス。
2022/02/05(土) 17:36:55.75ID:Z82/7dFa
>>725
その結果、所有権を複製しちゃったんでしょw
2022/02/05(土) 17:58:18.58ID:oHTbhGZf
とはいえ元の話は
無料の炊き出しがレストランより不味い
みたいな話なのでそりゃそうだろうとしか
誰もがオライリーを気軽に買えるわけでもないし
それぞれ意味はあるだろう
2022/02/05(土) 18:14:45.46ID:9gZgvarh
ざんねんながら悪文どころか誤訳だらけで無料の炊き出しよりひどいのがままあるのが技術書の世界
2022/02/05(土) 18:19:44.18ID:nog/R4+C
>>738
誤訳だと言うなら改善案を提案して質の向上に貢献するのがいいよ
それができないなら単なるイチャモン付けるだけの残念な人
2022/02/05(土) 18:40:50.96ID:SfaxLljQ
クソ不味い飯屋にわざわざ改善案を提案するやつww
「批判するなら対案出せ」と同じアホ理論www
2022/02/05(土) 18:44:43.09ID:NEwj3nV7
両立するよ。
改善に取り組みつつ現時点では良くないところもある (信頼しすぎるな) と初心者に警告するのは何も矛盾しない。
2022/02/05(土) 18:55:08.74ID:RA3mCqKO
>>741
>両立するよ。
何と何が両立するの?
2022/02/05(土) 19:15:32.20ID:9gZgvarh
>>739
ではイチャモン付けるだけの残念じゃない君が俺の代わりに改善案を提案しておいてくれ
2022/02/05(土) 19:38:56.71ID:nog/R4+C
>>743
自分は現状の和訳で問題ない派
そんな些細なことよりも和訳だけでなく原文も併用した方がよく
その後は原文だけの世界なのだから
2022/02/05(土) 19:43:44.48ID:9gZgvarh
なんだ、日本語が読めない人だったか
2022/02/05(土) 19:50:42.02ID:WBcMnxrA
日本語訳の質にこだわるような低レベルのやつはその先へ行けないため日本語訳にこだわる
2022/02/05(土) 21:53:27.09ID:tUU0u0u/
複製おじさんが言っても説得力ゼロ
2022/02/05(土) 22:32:09.49ID:nog/R4+C
和訳にイチャモン付けるだけの残念な人は「複製おじさん」を連呼する人でしたか
2022/02/06(日) 10:19:03.76ID:rpYaxfPG
>>543からの流れを見ると確かに複製おじさんは英語読めないっぽいが
Copyを「所有権の複製」と思い込むのは日本語訳の質が原因ではない気がする
2022/02/06(日) 21:49:38.13ID:iA9Wv++J
そんな超初心者入門のところでもめてるのかね
trait Copyを実装している型は複製されて、実装していなかったら移動となるだけだぞ
所有権は難しくない
2022/02/06(日) 21:58:58.41ID:nXnmaz3p
>>750
何が複製されて
何が移動するのかな?
2022/02/06(日) 22:11:28.10ID:BkoYcqr9
>>489 の文章が間違ってる、いやおかしくない、って揉めてただけだよ
まあ気付けば普通はおかしいと思うんだけど
2022/02/06(日) 22:13:32.98ID:iA9Wv++J
>>751
所有権
Copy実装型は常に所有権が分岐する
2022/02/06(日) 22:39:23.39ID:JXWBQEX4
>>753
複製(copy)と分岐(branching)は全く違う意味だけどCopy実装型だと所有権が複製されつつ常に分岐する??
どういう意味?
2022/02/06(日) 22:43:41.39ID:iA9Wv++J
>>754
初期状態は全く同じ
つまり複製されて分岐する
それ以降は異なりうる
2022/02/06(日) 22:57:43.95ID:VdsOdvUM
Rustの所有権というのは権利というよりも所有しているリソースの解放義務を指している
複製できたら所有権管理の意味がない
分岐はもっと意味不明
2022/02/06(日) 22:59:53.55ID:9tkt2bmo
489から始まった議論をまたやり直すの?
2022/02/06(日) 23:01:30.97ID:s1W7Zv37
複製おじさんが分岐して所有権分岐おじさんにw
2022/02/06(日) 23:04:45.50ID:iA9Wv++J
>>756
複製され分岐するため
リソース解放義務はそれぞれに生じる
2022/02/06(日) 23:09:58.47ID:Woj/yg4T
>>759
複製おじさん、嘘ついちゃダメだよ
詳しくはdoc.rust-lang.orgとdocs.rs見てねw
2022/02/06(日) 23:26:57.07ID:kRmD/jh4
複製おじさん連呼する人は、もちっと具体的に指摘してくれるとありがたいんだが。
2022/02/06(日) 23:31:49.27ID:iA9Wv++J
嘘ではない
もちろんCopy実装型の時点でヒープは使われないので解放といってもスタッフ上のみだから実質何も行われない
そのためデストラクタも容認されていない
その観点からCopy実装型は所有権がないと主張する人もいるくらいだ
2022/02/06(日) 23:59:50.68ID:fxuI+J0l
>>761
おじさんを連呼してる人はスレを荒らしているだけのクズ
説明や代案や根拠などを語れない
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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