公式
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/
探検
Rust part13
■ このスレッドは過去ログ倉庫に格納されています
2021/11/07(日) 10:04:59.35ID:pJhT3MIE
639デフォルトの名無しさん
2022/01/20(木) 13:39:18.98ID:hnvUf8sg >>637
Cell⇔RefCell は 静的⇔動的 の関係ではない
Cell⇔RefCell は 直接⇔参照 の関係
そのため余分にRefが付く
静的⇔動的 の関係にあるのは
「&」⇔「RefCell::borrow()」)
「&mut」⇔「RefCell::borrow_mut()」
Cell⇔RefCell は 静的⇔動的 の関係ではない
Cell⇔RefCell は 直接⇔参照 の関係
そのため余分にRefが付く
静的⇔動的 の関係にあるのは
「&」⇔「RefCell::borrow()」)
「&mut」⇔「RefCell::borrow_mut()」
640デフォルトの名無しさん
2022/01/20(木) 13:52:05.11ID:O3OMKZ6x >>639
少なくとも構造体の説明としては
https://doc.rust-lang.org/std/cell/struct.Cell.html
> A mutable memory location.
https://doc.rust-lang.org/std/cell/struct.RefCell.html
> A mutable memory location with dynamically checked borrow rules
↑のように書いてあるね
だから
SCell // A mutable memory location with statically checked borrow rules
DCell // A mutable memory location with dynamically checked borrow rules
こんなんでもよかったんじゃないかなぁと思ったがこれはこれで石投げられそう
少なくとも構造体の説明としては
https://doc.rust-lang.org/std/cell/struct.Cell.html
> A mutable memory location.
https://doc.rust-lang.org/std/cell/struct.RefCell.html
> A mutable memory location with dynamically checked borrow rules
↑のように書いてあるね
だから
SCell // A mutable memory location with statically checked borrow rules
DCell // A mutable memory location with dynamically checked borrow rules
こんなんでもよかったんじゃないかなぁと思ったがこれはこれで石投げられそう
641デフォルトの名無しさん
2022/01/20(木) 14:13:35.66ID:hnvUf8sg >>640
それは違う
間違った解釈で無関係な場所に「with statically checked borrow rules」を付けてはいけない
参照借用規則『multi readers xor single writer』に対して
以下が「静的チェック⇔動的チェック」の関係にある
静的チェック: multi「 &」xor single「&mut」
動的チェック: multi「RefCell::borrow()」xor single「RefCell::borrow_mut()」
一方でCellとRefCellの関係は
内部可変性が「直接書き換えOK」⇔「参照書き換えOK」の関係
だからCellに対してRef(参照)が付くRefCellという名前になっている
そして参照となるRefCellに対してのみ上述の参照借用規則が適用される
それは違う
間違った解釈で無関係な場所に「with statically checked borrow rules」を付けてはいけない
参照借用規則『multi readers xor single writer』に対して
以下が「静的チェック⇔動的チェック」の関係にある
静的チェック: multi「 &」xor single「&mut」
動的チェック: multi「RefCell::borrow()」xor single「RefCell::borrow_mut()」
一方でCellとRefCellの関係は
内部可変性が「直接書き換えOK」⇔「参照書き換えOK」の関係
だからCellに対してRef(参照)が付くRefCellという名前になっている
そして参照となるRefCellに対してのみ上述の参照借用規則が適用される
642デフォルトの名無しさん
2022/01/20(木) 14:23:25.93ID:O3OMKZ6x >>641
なるほどね
https://doc.rust-lang.org/std/cell/struct.Cell.html#method.get_mut
> If you require interior mutability by reference,
> consider using RefCell which provides run-time checked mutable borrows through its borrow_mut method.
↑ここでもまずは「参照による内部可変性が必要な場合は」と先に来てるね
「実行時に動的に借用のチェックをさせたいという」のが動機だと俺勝手に思いこんでたけど
それは一番じゃないみたい
なるほどね
https://doc.rust-lang.org/std/cell/struct.Cell.html#method.get_mut
> If you require interior mutability by reference,
> consider using RefCell which provides run-time checked mutable borrows through its borrow_mut method.
↑ここでもまずは「参照による内部可変性が必要な場合は」と先に来てるね
「実行時に動的に借用のチェックをさせたいという」のが動機だと俺勝手に思いこんでたけど
それは一番じゃないみたい
643デフォルトの名無しさん
2022/01/20(木) 14:32:46.88ID:XZNQ8H/m >>635
Cell/RefCellと違ってBoxは分かりやすくていい名前だと思うぞ
Boxing/Unboxingは他の言語でも普通に使われてるよね?
旧名のOwned<T>や代替案のHeap<T>に比べると確実にいい
Cell/RefCellと違ってBoxは分かりやすくていい名前だと思うぞ
Boxing/Unboxingは他の言語でも普通に使われてるよね?
旧名のOwned<T>や代替案のHeap<T>に比べると確実にいい
644デフォルトの名無しさん
2022/01/20(木) 14:45:20.72ID:nm3lJD8v Boxing/UnboxingはC#やJavaにもあるからBoxには全く違和感なかったけど
よく考えるとソースコード上にBoxという文字列が出現するのはRustだけかも?
よく考えるとソースコード上にBoxという文字列が出現するのはRustだけかも?
645デフォルトの名無しさん
2022/01/20(木) 14:54:02.35ID:3oKX7/s6 Scheme でも次の規格に Box が入ることになっている。
(既に導入している処理系も結構ある。)
(既に導入している処理系も結構ある。)
646デフォルトの名無しさん
2022/01/20(木) 15:32:21.48ID:hnvUf8sg 通常の型TやBox<T>などがSend+Syncである一方
Cell<T>とRefCell<T>は!Send+!Syncであることと引き換えに内部可変性を得ている
つまりmutではない参照の内部にあったとしても
「Cell<T>」は「mut T」のように成れて直接書き換え可能
「RefCell<T>」は「&mut T」を得られて参照書き換え可能
ここでCellとRefCellの違いは「&」すなわち「Ref」だからこの命名自体は分かりやすいと思う
Cell<T>とRefCell<T>は!Send+!Syncであることと引き換えに内部可変性を得ている
つまりmutではない参照の内部にあったとしても
「Cell<T>」は「mut T」のように成れて直接書き換え可能
「RefCell<T>」は「&mut T」を得られて参照書き換え可能
ここでCellとRefCellの違いは「&」すなわち「Ref」だからこの命名自体は分かりやすいと思う
647デフォルトの名無しさん
2022/01/20(木) 16:52:16.46ID:O3OMKZ6x648デフォルトの名無しさん
2022/01/20(木) 23:14:12.74ID:c3YxPrqk まあBox と名前を合わせてBoxCellとか逆にBoxをRefにするかした方が統一的な名前づけだったとは思う。
649デフォルトの名無しさん
2022/01/21(金) 07:08:34.56ID:zwVIa7Oi >>648
Box<T>はヒープ上にTの場所を確保してそこを指し示します
Cell<T>はヒープ上かどうかは無関係で例えば>>636の使用例では全てスタック上
したがって「Boxと名前を合わせてBoxCellとか」はおかしいです
TとCell<T>はメモリ上の格納場所も実体も同じです
つまりCellとは内部可変性という特性を与え示していると考えたほうがわかりやすいでしょう
RefCell<T>も同様ですがこちらは参照借用規則の実行時チェックのためのborrowフラグが余分に確保されます
もうひとつの「BoxをRefにするかした方が統一的な名前づけだったとは思う」もおかしいです
refは参照(reference)の略としてあちこちで使われておりヒープ上かどうかは無関係ですが
Box<T>はあくまでもTがヒープ上にあることが主眼です
余談ですがこの関係でRefといえばstd::cell::Refという構造体があり
これはRefCell::borrow()が返す型として直接意識することはなく使われています
ちなみにRefCell::borrow_mut()が返す型はstd::cell::RefMutです
Box<T>はヒープ上にTの場所を確保してそこを指し示します
Cell<T>はヒープ上かどうかは無関係で例えば>>636の使用例では全てスタック上
したがって「Boxと名前を合わせてBoxCellとか」はおかしいです
TとCell<T>はメモリ上の格納場所も実体も同じです
つまりCellとは内部可変性という特性を与え示していると考えたほうがわかりやすいでしょう
RefCell<T>も同様ですがこちらは参照借用規則の実行時チェックのためのborrowフラグが余分に確保されます
もうひとつの「BoxをRefにするかした方が統一的な名前づけだったとは思う」もおかしいです
refは参照(reference)の略としてあちこちで使われておりヒープ上かどうかは無関係ですが
Box<T>はあくまでもTがヒープ上にあることが主眼です
余談ですがこの関係でRefといえばstd::cell::Refという構造体があり
これはRefCell::borrow()が返す型として直接意識することはなく使われています
ちなみにRefCell::borrow_mut()が返す型はstd::cell::RefMutです
650デフォルトの名無しさん
2022/01/21(金) 10:40:22.86ID:a7B69/kD 何も分かってねーなこいつ。
なぜBoxにするか、なぜRefCellにするかってのは要するに構造体のサイズを決定できない場合を想定してるわけよ。
スタックにそういういう動的にサイズが異なる実体をおくことも最近のコンパイラではないこともないが、通常はヒープに置くわ。
文字通りしか考えないで実際の使い方なんか一切考えないやつってのが丸わかりになるって意味では
分かってなさそうなやつにこの辺りについて問いただすってのは割と良いかも。
なぜBoxにするか、なぜRefCellにするかってのは要するに構造体のサイズを決定できない場合を想定してるわけよ。
スタックにそういういう動的にサイズが異なる実体をおくことも最近のコンパイラではないこともないが、通常はヒープに置くわ。
文字通りしか考えないで実際の使い方なんか一切考えないやつってのが丸わかりになるって意味では
分かってなさそうなやつにこの辺りについて問いただすってのは割と良いかも。
651デフォルトの名無しさん
2022/01/21(金) 11:50:08.61ID:ePel1TKs 皆の言ってることがよくわからん
そもそもBoxとRefCellって対比させるようなものか?
そもそもBoxとRefCellって対比させるようなものか?
652デフォルトの名無しさん
2022/01/21(金) 12:13:07.97ID:a7B69/kD T -- Box<T>
Cell<T> -- RefCell<T>
って普通に考えれば対比させると思うけど。
Cell<T> -- RefCell<T>
って普通に考えれば対比させると思うけど。
653デフォルトの名無しさん
2022/01/21(金) 13:03:50.49ID:ePel1TKs RefCell<T>はTへのrefが作れるCell (実行時にborrow checkする)
TとBox<T>はborrowに関しては同じ振る舞いでデータの場所がヒープか否かの違い
全然関係性違うと思うんだけど
TとBox<T>はborrowに関しては同じ振る舞いでデータの場所がヒープか否かの違い
全然関係性違うと思うんだけど
654デフォルトの名無しさん
2022/01/21(金) 16:26:46.26ID:HthXViD+655デフォルトの名無しさん
2022/01/21(金) 16:43:50.31ID:9uS/kBRP 「所有権の複製」がおかしいってことは納得言ってくれたん?w
656デフォルトの名無しさん
2022/01/21(金) 23:30:48.05ID:HnzI5Wog 表現の問題だけど別にいいんじゃね?
657デフォルトの名無しさん
2022/01/22(土) 00:49:37.07ID:FWRR5JB/ ダメです
明らかにおかしい
ポインタ渡しと参照渡しを間違えてるくらいにはおかしい
明らかにおかしい
ポインタ渡しと参照渡しを間違えてるくらいにはおかしい
658デフォルトの名無しさん
2022/01/22(土) 01:05:08.77ID:7E1QrPk4 それは解釈のレイヤの問題。
JIS の情報処理用語の定義では参照呼び (参照渡しという言葉は定義がないが実質的に同じだろう) はオブジェクトの場所を渡すことと定義されていて、
ポインタという形で場所を渡すのも参照呼びの一種ということになる。
言語仕様の話をしているところで異なるレイヤが混ざるのはおかしくはあるが、
実例を示そうとしたり、逆に抽象的に説明しようとしたりすると境界が曖昧になることはある。
JIS の情報処理用語の定義では参照呼び (参照渡しという言葉は定義がないが実質的に同じだろう) はオブジェクトの場所を渡すことと定義されていて、
ポインタという形で場所を渡すのも参照呼びの一種ということになる。
言語仕様の話をしているところで異なるレイヤが混ざるのはおかしくはあるが、
実例を示そうとしたり、逆に抽象的に説明しようとしたりすると境界が曖昧になることはある。
659デフォルトの名無しさん
2022/01/22(土) 19:22:08.25ID:1QIe2ldW じゃああなたはポインタ渡しと参照渡しを間違えてもいいよ
660デフォルトの名無しさん
2022/01/22(土) 19:59:43.90ID:n0owABsu >>658
ポインタ渡しと参照渡しが同じなら、nullptrを渡すのと同じことを参照渡しでどうやるか教えてくれ。
ポインタ渡しと参照渡しが同じなら、nullptrを渡すのと同じことを参照渡しでどうやるか教えてくれ。
661デフォルトの名無しさん
2022/01/22(土) 20:05:58.29ID:DSkywrpw >>657
参照渡しじゃなくてダブルポインタの方だろ。
参照渡しじゃなくてダブルポインタの方だろ。
662デフォルトの名無しさん
2022/01/22(土) 20:32:06.98ID:9yXjOkuN ポインタ渡しっていう用語も使わないでほしい
ポインタ型の時に特別なもんでもなんでもなく
他の場合と同じcall by valueなのだから
ポインタ型の時に特別なもんでもなんでもなく
他の場合と同じcall by valueなのだから
663デフォルトの名無しさん
2022/01/22(土) 20:53:17.10ID:vfyV6CZn rustにおいて参照渡しと言ったらどういう意味になるんだろうか
664デフォルトの名無しさん
2022/01/22(土) 22:32:38.62ID:g0imoAcW665デフォルトの名無しさん
2022/01/22(土) 23:03:41.04ID:bh/4ELt7 >>663
&Tを渡すこと
&Tを渡すこと
666デフォルトの名無しさん
2022/01/22(土) 23:09:33.04ID:j/zdYx9z >>654
>BoxとRefCellには共通点も類似性も関係性も何もない
そうそう、何の共通点も類似性も関係性もないのに
The BookではBoxとRefCellを対比させてどういうケースにどっちを使うかわざわざ解説してるんだよなぁ
何の共通点も類似性も関係性も無いにも関わらずw
>BoxとRefCellには共通点も類似性も関係性も何もない
そうそう、何の共通点も類似性も関係性もないのに
The BookではBoxとRefCellを対比させてどういうケースにどっちを使うかわざわざ解説してるんだよなぁ
何の共通点も類似性も関係性も無いにも関わらずw
667デフォルトの名無しさん
2022/01/22(土) 23:45:04.56ID:YZScTEQ/668デフォルトの名無しさん
2022/01/23(日) 00:16:51.00ID:GGOFm3A0669デフォルトの名無しさん
2022/01/23(日) 01:50:05.66ID:N2HN4NXS clippy様がvoldemort typeを説明せよと仰せなのだが
もしかして、名前を言ってはいけないあの人のことをご存じない?
>>668
そこはinterior mutabilityの前提としてborrowing rulesを
おさらいするためにBoxを出してるだけだから違うだろ。
多義的なオレオレ用語が多くて質は悪いけど
the bookに意味もなくBoxとRefCellを登場させてる章なんてなかったと思う。
もしかして、名前を言ってはいけないあの人のことをご存じない?
>>668
そこはinterior mutabilityの前提としてborrowing rulesを
おさらいするためにBoxを出してるだけだから違うだろ。
多義的なオレオレ用語が多くて質は悪いけど
the bookに意味もなくBoxとRefCellを登場させてる章なんてなかったと思う。
670デフォルトの名無しさん
2022/01/23(日) 09:58:49.85ID:I/0ReqFd なんでわざわざ自演するのかね?
671デフォルトの名無しさん
2022/01/23(日) 10:23:00.27ID:pcY9kzKW それが仲介おじの悪癖なんよ
672デフォルトの名無しさん
2022/01/23(日) 14:04:42.46ID:Tw7cio1+ 病気だな
病名は知らんけど
病名は知らんけど
673デフォルトの名無しさん
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];
どっちか一方を禁止する方法とかあるのですか?
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];
どっちか一方を禁止する方法とかあるのですか?
674デフォルトの名無しさん
2022/01/23(日) 17:38:28.44ID:v0FQj8Ao C上がりのヤツって意味のないところにconst付けがち
関数の引数にconst DWORD vとか
関数の引数にconst DWORD vとか
675デフォルトの名無しさん
2022/01/23(日) 19:54:52.69ID:GGOFm3A0676デフォルトの名無しさん
2022/01/23(日) 20:02:24.55ID:N2HN4NXS 末尾oとかWとかで荒らしてるやつ回線なんだ?亡霊か?
677デフォルトの名無しさん
2022/01/23(日) 20:58:37.79ID:sgP3cX+L えっ、一人二役まだ続けるのか
678デフォルトの名無しさん
2022/01/23(日) 22:45:59.41ID:N2HN4NXS お前Lはないだろ
679デフォルトの名無しさん
2022/01/23(日) 23:46:00.51ID:QpDxG2zZ ちなみにRustでのconstとはコンパイル時点で定数(どんな複雑な型でもよい)であること
プログラミング言語によってはconstなのに実行時に決まる値(がその後変化しないこと、つまり単なるimmutable)を意味しているので意味の差に注意
プログラミング言語によってはconstなのに実行時に決まる値(がその後変化しないこと、つまり単なるimmutable)を意味しているので意味の差に注意
680デフォルトの名無しさん
2022/01/23(日) 23:59:31.12ID:2V1gRdrY681デフォルトの名無しさん
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はそうなりますが。
ありがとうございます。
やりたいことは、だいたい同じですけど、少し違って
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
うちではこんなのならないんだけど・・・・やり方わかる人いたら教えてくれんかな?
たまたま海外勢の動画見たら、同じReplitのはずなのに波線の指摘とかコード補完とか効いててびっくりしたわ
https://www.youtube.com/watch?v=MsocPEZBd-M
うちではこんなのならないんだけど・・・・やり方わかる人いたら教えてくれんかな?
683デフォルトの名無しさん
2022/01/26(水) 22:40:12.84ID:e2k0MxNT Repl.itは、リンターやデバッガーからサードパーティのパッケージ、ホスティング、デプロイまで、
すべてを備えた、ブラウザー内の完全な共同クラウド開発環境です
すべてを備えた、ブラウザー内の完全な共同クラウド開発環境です
684デフォルトの名無しさん
2022/01/27(木) 14:52:35.89ID:kmz9k/kc プログラミングRustの第2版の訳書出たんだな
685デフォルトの名無しさん
2022/01/27(木) 17:03:59.04ID:O/Xb3RdK t
686デフォルトの名無しさん
2022/01/30(日) 18:39:19.14ID:Np8aVX2s Rustはゼロ除算はコンパイルエラーになるの?
687デフォルトの名無しさん
2022/01/30(日) 18:46:47.93ID:iWlFH2We const文脈ならコンパイルエラーになったはず
688デフォルトの名無しさん
2022/01/30(日) 19:13:28.33ID:9ei8l7Ku コンパイル時に判明しないゼロ除算やオーバーフロー除算 ex. -128_i8 / -1_i8 はpanicとなるので
それが困る場合はchecked_div()を使えばOption型が返りNoneとなる
それが困る場合はchecked_div()を使えばOption型が返りNoneとなる
689デフォルトの名無しさん
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
ほんとだ、定数式じゃなくてもエラーになるんだね
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
690デフォルトの名無しさん
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
x / y
}
let x = divide(1, 0); //panic
const y: i32 = divide(1, 0); //compile error
691デフォルトの名無しさん
2022/01/31(月) 00:45:03.08ID:wgfsi16C >>690
定数式の文脈でゼロ除算起きるとコンパイルエラーになるのはある意味当然だと思うんだけど
そうじゃないところでエラーになるのが意外だった
デバッグビルドでもMIRの最適化とかで定数畳み込みみたいなことやってるのかな
定数式の文脈でゼロ除算起きるとコンパイルエラーになるのはある意味当然だと思うんだけど
そうじゃないところでエラーになるのが意外だった
デバッグビルドでもMIRの最適化とかで定数畳み込みみたいなことやってるのかな
692デフォルトの名無しさん
2022/01/31(月) 07:35:21.99ID:qlFEomu1693デフォルトの名無しさん
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 内でそのフラグを検査するという形にしています。
可能ならコンパイル時に発見できるようにしたいです。
一定形式のレコードが連続で書き込まれて最後には終端レコードが書き込まれるという単純な形式です。
Rust 上でもレコードを追加するのと終端処理のふたつのメソッドがあるだけです。
要は ↓ のように使えるライブラリだということです。
let mut file = File::create("file.hoge").unwrap();
Hoge::new(&mut file).add_entry("string1")?.add_entry("string2")?.finish();
このとき
・ 終端処理は必ずしたい
・ 終端処理はエラーの可能性もあり、それは捕捉したい (ので drop でさせられない)
という制約を静的に表現できるでしょうか?
現状では終端処理のメソッドが実行されたときにフラグを立てておいて
drop 内でそのフラグを検査するという形にしています。
可能ならコンパイル時に発見できるようにしたいです。
694デフォルトの名無しさん
2022/01/31(月) 11:02:40.38ID:qlFEomu1 エラーを捕捉したいことをデストラクタに任せない
つまりそのような終端処理はdropされる前に終える
例えばBufWriter利用時も終える時は明示的にflushを呼ぶ
そしてflushはResultを返しエラーが判明する
つまりそのような終端処理はdropされる前に終える
例えばBufWriter利用時も終える時は明示的にflushを呼ぶ
そしてflushはResultを返しエラーが判明する
695デフォルトの名無しさん
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呼び出しを書いておいて、リンクエラーとして捕捉する方法が提案されているね
add_entryの戻り値型の暗黙のdropを防げばいいけど、そういった機能はまだない(RFCにはあるけど進んではない)
https://users.rust-lang.org/t/prevent-drop-at-compile-time/20508
このスレッドではdropの実装に存在しないC FFI呼び出しを書いておいて、リンクエラーとして捕捉する方法が提案されているね
696デフォルトの名無しさん
2022/01/31(月) 11:35:46.57ID:y6tOo2ii697デフォルトの名無しさん
2022/01/31(月) 11:53:47.47ID:y6tOo2ii >>695
それは残念。
言語の機能として用意されてないまわりくどい方法を使うと
エラーメッセージがよくわからん (本来の問題とは違う内容が出てくる) ことになりがちだし、
使うときに unsafe や forget をいちいち書いてもらわなきゃならないのは
ライブラリとして提供するときにはちょっと汚すぎるなぁ。
それは残念。
言語の機能として用意されてないまわりくどい方法を使うと
エラーメッセージがよくわからん (本来の問題とは違う内容が出てくる) ことになりがちだし、
使うときに unsafe や forget をいちいち書いてもらわなきゃならないのは
ライブラリとして提供するときにはちょっと汚すぎるなぁ。
698デフォルトの名無しさん
2022/01/31(月) 12:37:43.75ID:pXNCEmdM PhantomType的な?
699デフォルトの名無しさん
2022/01/31(月) 12:39:21.72ID:pXNCEmdM エラーメッセージがよくわからん事になりがちだからNGか
700デフォルトの名無しさん
2022/01/31(月) 12:47:03.61ID:qlFEomu1 >>696
なるほど
コンパイラは解析してdropさせるべき位置を把握しているから
そこへ至る全ての経路上で例えばFinalize trait実装型はそのメソッドfinalize()を呼んでいないとコンパイルエラーとなる
というような制約をするFinalize trait
が存在していれば要望を満たす?
なるほど
コンパイラは解析してdropさせるべき位置を把握しているから
そこへ至る全ての経路上で例えばFinalize trait実装型はそのメソッドfinalize()を呼んでいないとコンパイルエラーとなる
というような制約をするFinalize trait
が存在していれば要望を満たす?
701デフォルトの名無しさん
2022/01/31(月) 13:15:16.14ID:wgfsi16C >>692
非const fnについての話なんだけど
非const fnについての話なんだけど
702デフォルトの名無しさん
2022/02/01(火) 18:21:42.44ID:EUosKgIx amazon primeの記事経由でegui見てみたが結構いいな
ネイティブで試してみたが充分実用レベル
ネイティブで試してみたが充分実用レベル
703デフォルトの名無しさん
2022/02/01(火) 21:04:57.74ID:YxH4csZd GCは標準からは消えたけどライブラリでやればいいってかつてこのスレで言われたことがあるのだが、GCライブラリのデファクトスタンダードってどれだ
704デフォルトの名無しさん
2022/02/01(火) 21:52:48.48ID:noSg7Gj9705デフォルトの名無しさん
2022/02/01(火) 22:04:01.37ID:YxH4csZd >>704
いや一部だけGC欲しい時は普通にあるからそれは言い過ぎ
いや一部だけGC欲しい時は普通にあるからそれは言い過ぎ
706デフォルトの名無しさん
2022/02/01(火) 22:51:54.30ID:l+/c7OlD クッソ身につまされる記事があったので共有する
https://dystroy.org/blog/how-not-to-learn-rust
https://dystroy.org/blog/how-not-to-learn-rust
707デフォルトの名無しさん
2022/02/01(火) 23:11:34.83ID:rVnoodM/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あたりの全メソッドは一通り認識しておくといいかな
eguiは毎回60fpsで全画面を描き直すことで差分描き直しを避けて簡単にしてるようだけど
省力化したい方針と合わないや
ゲーム向き?
>>705
GC使ってもRustのRAIIを無くせるわけじゃないから
そういう時はVecに入れて使って
あとは任意のタイミングで未使用の要素の区画を再利用という感じにしてる
>>706
Rustは各種bookを読んであとはstd docとreference見ながら
コンパイルエラーの通り直すだけで何とかなるから書かれている通りだね
付け加えると基本要素については覚えていないメソッドのために回り道しがちなので
Option Result slice str Iteratorあたりの全メソッドは一通り認識しておくといいかな
709デフォルトの名無しさん
2022/02/02(水) 10:20:38.88ID:OC/eznuR 複製おじは自分では何とかなってると思ってるのか
710デフォルトの名無しさん
2022/02/02(水) 11:48:12.13ID:yXsdGz3O 🐜蟻型蜂🐝はポジティブシンギング🤯だから
711デフォルトの名無しさん
2022/02/02(水) 18:24:25.46ID:LUGaOk8s >>706
>Mistake 3 : Start by implementing a graph based algorithm
その通りだとは思うけどRustと相性の良いアルゴリズム集的なのは欲しいとも思う
>Mistake 3 : Start by implementing a graph based algorithm
その通りだとは思うけどRustと相性の良いアルゴリズム集的なのは欲しいとも思う
712デフォルトの名無しさん
2022/02/02(水) 19:18:50.51ID:aYiI+nmg713デフォルトの名無しさん
2022/02/02(水) 20:06:31.96ID:9W9+AwqU dynや lifetime heavyは失敗しながら学ぶのでいいと思う
普通の人はしばらくやってれば気づくから
普通の人はしばらくやってれば気づくから
714デフォルトの名無しさん
2022/02/02(水) 20:34:19.12ID:ljjcfSf9 deny(rust_2018_idioms)はガチのマジでオススメです
715デフォルトの名無しさん
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を使えばよかったんだけど、
いつも抜け道があるとは思えない。辛い。
自分で作らなけりゃいいんだな!ってslab_tree使って
「ある条件に合致した子ノードから、ルートまでの値をリストで取り出す」
みたいな処理を書こうとしたら怒られるんだよな。
node_ref.parent() : &Self<T> -> Option<NodeRef<T>
っていう型なもんだから、次々に親をたどるために
while Some(parent) = node.parent() { node = parent; ...}
みたいな処理書くと、当然怒られる。
何とか抜け道無いかって探したら、node自身じゃなくてそのIDを使えばよかったんだけど、
いつも抜け道があるとは思えない。辛い。
716デフォルトの名無しさん
2022/02/02(水) 22:39:17.87ID:O+j3A95O Rustで普通にやってるとスレッドセーフを強いられるから制約がキツくなるんだよね
717デフォルトの名無しさん
2022/02/02(水) 22:41:53.47ID:J71gX0gE 大昔からの単純なポインタ相互参照だと
ダングリングポインタ・多重解放・解放忘れなどが全く存在しないことを検証すべき範囲が一般的には広くなりすぎる
もし狭い範囲に閉じ込められるケースならば閉じ込めた中でunsafeを用いたとしても効率的な型を提供すればよい
標準ライブラリにあるヒープを用いる型は全てそのようにして作られている
ダングリングポインタ・多重解放・解放忘れなどが全く存在しないことを検証すべき範囲が一般的には広くなりすぎる
もし狭い範囲に閉じ込められるケースならば閉じ込めた中でunsafeを用いたとしても効率的な型を提供すればよい
標準ライブラリにあるヒープを用いる型は全てそのようにして作られている
718デフォルトの名無しさん
2022/02/03(木) 23:00:23.96ID:KgH5nhZs719デフォルトの名無しさん
2022/02/03(木) 23:17:16.89ID:VxNIdQ9k Craterについて教えてください
720デフォルトの名無しさん
2022/02/04(金) 00:50:00.86ID:Ueb60Gjp >>718
もしかしてThe Bookの勝手訳の質と比べてる?
もしかしてThe Bookの勝手訳の質と比べてる?
721デフォルトの名無しさん
2022/02/04(金) 21:15:13.65ID:fCF+Tqbd >>720
勝手訳というのがなにを指すのか不明だけどオリジナルのThe Bookからリンクされている日本語訳のことであればそれと比べている
勝手訳というのがなにを指すのか不明だけどオリジナルのThe Bookからリンクされている日本語訳のことであればそれと比べている
722デフォルトの名無しさん
2022/02/04(金) 21:21:32.40ID:b3SZZj/4 そんなのを見るのは極初期だけで些細な話
その後はdoc.rust-lang.orgとdocs.rsしか見ないのだから
その後はdoc.rust-lang.orgとdocs.rsしか見ないのだから
723デフォルトの名無しさん
2022/02/05(土) 13:22:14.88ID:XET6D0Ck その極初期の人が見る和訳の質の話をしてるんだろ
724デフォルトの名無しさん
2022/02/05(土) 14:41:30.63ID:e42LAXmg あれは害悪レベルの訳だから初期でも見ない方がいいよ
ここでよくおかしなレスしてる人もあれの影響なんじゃないか?
ここでよくおかしなレスしてる人もあれの影響なんじゃないか?
725デフォルトの名無しさん
2022/02/05(土) 15:12:20.92ID:WBcMnxrA どうせ>>722のドキュメント見ないと先へ進めないしほとんどは中学生でもわかる平易な英語
日本語訳の質にこだわるような低レベルのやつはほっとけばいい
日本語訳の質にこだわるような低レベルのやつはほっとけばいい
726デフォルトの名無しさん
2022/02/05(土) 15:52:33.91ID:2hiBx8fY Mistake 2 : Dive in without looking at the book
727デフォルトの名無しさん
2022/02/05(土) 15:59:05.92ID:WBcMnxrA728デフォルトの名無しさん
2022/02/05(土) 16:02:12.98ID:2hiBx8fY >>727
言ってること変わってますけど
言ってること変わってますけど
729デフォルトの名無しさん
2022/02/05(土) 16:03:52.79ID:WBcMnxrA 一貫してるぞ
日本語訳の質にこだわるような低レベルのやつはほっとけばいい
これしか主張していない
日本語訳の質にこだわるような低レベルのやつはほっとけばいい
これしか主張していない
730デフォルトの名無しさん
2022/02/05(土) 16:09:07.88ID:2hiBx8fY そこ以外の文章はポエムか何かだったの?
731デフォルトの名無しさん
2022/02/05(土) 16:22:12.93ID:XET6D0Ck じゃあ和訳の質を話題にしている低レベルの人同士の会話はほっとけばいいのにw
732デフォルトの名無しさん
2022/02/05(土) 17:02:52.76ID:VkrSTqtm 日本語イラネ言っている人は技術資料が英語でも
日本語でも生産性が変わらない人なんだよね?
アメリカの仕事でもした方が稼げるんじゃない?
日本語でも生産性が変わらない人なんだよね?
アメリカの仕事でもした方が稼げるんじゃない?
733デフォルトの名無しさん
2022/02/05(土) 17:05:29.47ID:nog/R4+C 和訳の質にこだわってる人たちも唯一役に立つチャンスがあるよ
それは和訳の改善案を提案して質の向上に貢献すること
しかし和訳の質にこだわってるここの人たちは批判だけで提案がないから残念な人たち
それは和訳の改善案を提案して質の向上に貢献すること
しかし和訳の質にこだわってるここの人たちは批判だけで提案がないから残念な人たち
734デフォルトの名無しさん
2022/02/05(土) 17:15:34.64ID:9gZgvarh 和訳の質にこだわっている人たちの質にこだわっている人は何の役にたつの?
735デフォルトの名無しさん
2022/02/05(土) 17:36:04.99ID:XET6D0Ck どこの食堂が美味いか話しているところに割り込んで、
不味い方を立て直してこいと言うくらいナンセンス。
不味い方を立て直してこいと言うくらいナンセンス。
736デフォルトの名無しさん
2022/02/05(土) 17:36:55.75ID:Z82/7dFa >>725
その結果、所有権を複製しちゃったんでしょw
その結果、所有権を複製しちゃったんでしょw
737デフォルトの名無しさん
2022/02/05(土) 17:58:18.58ID:oHTbhGZf とはいえ元の話は
無料の炊き出しがレストランより不味い
みたいな話なのでそりゃそうだろうとしか
誰もがオライリーを気軽に買えるわけでもないし
それぞれ意味はあるだろう
無料の炊き出しがレストランより不味い
みたいな話なのでそりゃそうだろうとしか
誰もがオライリーを気軽に買えるわけでもないし
それぞれ意味はあるだろう
738デフォルトの名無しさん
2022/02/05(土) 18:14:45.46ID:9gZgvarh ざんねんながら悪文どころか誤訳だらけで無料の炊き出しよりひどいのがままあるのが技術書の世界
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 中国国連大使「日本が中国に武力行使すると脅しをかけたのは初めて」 国連事務総長に書簡★4 [♪♪♪★]
- 【芸能】44歳・池脇千鶴、激変ぶりにネット衝撃 「まるで別人…」「変化が凄い!!」の声 [冬月記者★]
- なぜ立花孝志氏の言葉は信じられたのか…"異例の逮捕"が浮き彫りにした「SNSの危険な病理」 [ぐれ★]
- 台湾有事での集団的自衛権行使に「賛成」が48.8%、「反対」が44.2% ★9 [♪♪♪★]
- 中国「国連安保理の許可なしに日本攻撃可能」 Xで旧敵国条項に言及… ★15 [BFU★]
- 竹中平蔵氏、万博は大成功だったと持論 批判していた人々にチクリ「反省の弁の一つも聞きたい」 [バイト歴50年★]
- 女を力で言いなりにさせたいよな
- スクワットしても前ももしか筋肉痛にならないんだけど間違ってる?
- (*´ω`*)🔫(´・ω・`)終わりだ
- 中国政府「私たちが怒っているのは日本国民じゃない」
- (っ◞‸◟c)
- 【愛国者悲報】サナエ、カードゲームで敗北... [856698234]
