Rust part19

レス数が1000を超えています。これ以上書き込みはできません。
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/
923デフォルトの名無しさん
垢版 |
2023/02/25(土) 13:54:21.62ID:sdtPy+yt
>>922
普通の値の入った変数は他へ移動しない限りブロックの最後まで所有権があることが保証され最後まで自由に使うことができる
参照の入った変数はその参照が使われなくなったら無効となる使い捨てなのでブロックの最後まで所有権がある保証はない
例えばlet a = &T; f(a); let b = &mut T; g(b); let c = &T; の時点でもうaとbは使い捨てされており無効となり使えない
このように参照の場合は普通の値の場合と全く異なる
そして参照は使い捨てされてもdropで何か特別な処理があるわけではないため参照の所有権を考える意味がない
2023/02/25(土) 14:11:50.12ID:ArOrHDqj
>>923
>所有権があることが保証され最後まで自由に使うことができる
>無効となる使い捨てなのでブロックの最後まで所有権がある保証はない
>無効となり使えない

・ブロックの最後まで使えるかどうか
・drop時に特別な処理があるかどうか

どちらも所有権の話じゃないね
ownership とは「値の owner がスコープから外れたら値はdropされる」というルールです
そのdrop処理に特別な処理が追加されているかとか、ブロックが終わる前に無効になるとか関係ないです
2023/02/25(土) 14:45:07.44ID:bPVO/nT3
参照に限らずCopy型はownership意識する機会が少ないからな
関数に参照の参照(&&T)を渡すみたいな例を考えないと参照値がborrowされた状態を作れない

>>923
「ブロックの最後まで所有権がある保証はない」ってあるけど
仮にブロックの最後で所有権がなくなってるような状況でブロックの最後にその参照を使う処理を追加したときに怒られるのは
ブロックの最後で参照を使った追加箇所じゃなく途中で参照先の値を横取りしようとした部分でしょ
これは「ブロックの最後まで所有権があって最後まで自由に使うことができる」ことにならないかな
2023/02/25(土) 14:48:33.46ID:ArOrHDqj
参照をフィールドに含む構造体が入った変数はブロックの最後まで自由に使えることは保証されてないけど所有権あるよね^^;
927デフォルトの名無しさん
垢版 |
2023/02/25(土) 14:58:04.64ID:sdtPy+yt
>>924
理解できてるけど意固地になっているだけか
参照の場合はNLLでスコープがブロックではない見えないスコープとなり得て使い捨てできるから参照ルールを満たしてる限り前段は自由となるし
後段のdropは何も特別処理がないし
わざわざ参照の所有権を持ち出してくる意味がないことを理解できてるようだな

>>925
そこは明記が不十分で誤解させたようでごめん
参照先の値の所有権ではなく参照自体の話だよ
例えばそこの変数aのこと
2023/02/25(土) 15:05:29.21ID:a4UZTu4a
https://doc.rust-lang.org/reference/destructors.html
スコープの定義を探してこのページに来たが、ブロックの途中でmoveされた変数のスコープの終わりはどこなのか
ふつうに解釈するとブロックの終わりのようだが

"When an initialized variable or temporary goes out of scope, its destructor is run, or it is dropped."
これは「スコープを抜けたらdropする」じゃなくて「スコープを抜けたらdropされていなくてはならない」という制約の表現という解釈が正しいのかな
じゃないと二重解放にすることになっちゃう
2023/02/25(土) 15:06:07.82ID:ArOrHDqj
>>927
お前が言ってる
・drop時に特別な処理がない
・ライフタイムの制約があり、ブロックの最後まで使える保証がない
は参照だけじゃなくて「参照をフィールドに含むCopy構造体」についても同じ挙動なんだけどね
930デフォルトの名無しさん
垢版 |
2023/02/25(土) 15:09:11.46ID:sdtPy+yt
>>926
なんだちゃんと基本を理解できていないのか
構造体のフィールドに参照を持たせる場合は構造体にライフタイムパラメータが必要となる
したがって参照をその構造体に入れた後にその参照が使い捨てされた場合(例えば後から可変参照を使う場合)はその使い捨て参照と構造体は運命を共にする
ブロックの最後まで所有権がないことはその構造体にimpl Dropした時だけコンパイルエラーなることから分かる
2023/02/25(土) 15:10:49.55ID:ArOrHDqj
>>930
参照をフィールドに含む構造体については普通に所有権を考える意味があるし、
それとまったく同じ挙動である参照についても所有権を考える意味があるね
終わりだね
2023/02/25(土) 15:25:48.48ID:a4UZTu4a
>>928
いや、この解釈もだめだ
ローカル変数をmoveで捕捉したクロージャを返す関数は関数のブロックスコープを抜けてもまだdropしちゃいけない
933デフォルトの名無しさん
垢版 |
2023/02/25(土) 15:27:46.31ID:sdtPy+yt
>>931
え?
参照を所有しても使い捨てになるから参照の所有権を考える意味がない話だぞ
2023/02/25(土) 15:34:30.90ID:ArOrHDqj
>>933
スコープを抜けた時に束縛されたdropする責務があることを「所有権を持つ」って言うから
所有権の話にその値が使い捨てかどうかとかライフタイムの制約があるかとか考える意味があるかとか関係ないよ

参照を束縛した変数も、参照を保持する構造体を束縛した変数も、プリミティブ値を束縛した変数も、
drop時に特別な処理があってもなくても、ライフタイムの制約があってもなくても
いずれについても「スコープを抜けた時に束縛されたdropする責務がある」ので所有権はあるよ
意味があるとかないとかどうでもいいよ

参照を束縛した変数も、参照を保持する構造体を束縛した変数も、プリミティブ値を束縛した変数も、
いずれについても「スコープを抜けた時に束縛されたdropする責務がある」ので所有権はあるよ
2023/02/25(土) 15:34:46.31ID:ArOrHDqj
束縛された値、ね
2023/02/25(土) 16:01:35.52ID:a4UZTu4a
>>928
https://doc.rust-lang.org/reference/glossary.html#initialized
> Initialized
> A variable is initialized if it has been assigned a value and hasn't since been moved from.

一番最初に重要なことが書いてあったやつだすまぬ
つまりmoveされたらその時点でdrop scopeがなくなる=drop責務から解放される=所有権を失うと言えるわけね
2023/02/25(土) 16:26:42.35ID:SzGKc5ny
意味ないニキ(ID:sdtPy+yt)はもう
自分で何言ってんのか分かってなさそう
2023/02/25(土) 21:23:46.93ID:qdHk+tio
>>930
ホントにそんなこと起きるのか疑問なので試してみたらマジにそうなった
誰かこうなる仕組みを教えて~

参照をメンバーに持つ構造体で実験
struct Foo<'a> {
x: &'a String,
}

fn main() {
let mut s = String::from("abc");
let mut foo = Foo { x: &String::new() };
foo.x = &s;
println!("{}", foo.x.len());
s.push('0');
println!("{s}");
}
ここまではコンパイルも通り動いた
参照を構造体メンバーに格納した後に
可変参照を利用となるpushをして普通に動いた

そこで書かれてる通りに構造体にDropを実装
impl<'a> Drop for Foo<'a> {
fn drop(&mut self) {}
}
するとコンパイルエラーとなった
つまり参照の所有権は使い捨て(?)とやらで意味がなく(??)
それを持つ構造体はブロックスコープの最後まで生きていないため(???)ということ??
Dropの有無でエラーとなる仕組みがさっぱり分からない
2023/02/25(土) 21:45:59.77ID:CalPMh2Z
>>938
dropが実行されるときにxが利用される可能性があるから
s.pushの時点ではfoo.x = &sのimmutable borrowがまだ有効なのでmutable borrowはできませんよ
ということ

Dropがなければs.pushの時点でfoo.x = &sが使われる可能性はもうないから
immutable borrowの期間は終わってるものとして扱える
2023/02/25(土) 21:56:28.48ID:CalPMh2Z
>>934
>参照を束縛した変数も、参照を保持する構造体を束縛した変数も、プリミティブ値を束縛した変数も、
>いずれについても「スコープを抜けた時に束縛されたdropする責務がある」ので所有権はあるよ

現実にはスタックポインタをインクリメント/デクリメントするだけなので
挙げられてるような種類の変数にdropする責務や所有権があるかどうかは
初めての人への説明としてわかりやすいかどうかという主観の問題だよね
2023/02/25(土) 22:03:39.90ID:qdHk+tio
>>939
ふむむ
参照の所有権は自動的に打ち切られてしまい参照の所有権を考えても意味がないというのは正しいのですか?
impl Drop実装しなければdrop処理は無いと理解していいのですか?
2023/02/25(土) 23:40:57.64ID:sdtPy+yt
そうだろ
もちろん>>924の言う通り所有権は「値のownerがスコープから外れたら値はdropされる」というルールは常に適用できる
しかし参照については使い捨てができるためブロックスコープではなくルールを成り立たせるために見えない仮想的なスコープを用意してそこを外れたと考える本末転倒
そしてdropについても何もなされない
だからわざわざ参照の所有権を持ち出して来て考える意味がない
参照で重要なのは所有権ではなくmultiple readers xor single writerルール
2023/02/25(土) 23:53:35.45ID:alhcSVqs
しかし、役に立たないことを知りたがる人間の方が
ある知識が役に立つ証拠が不十分と思ったら勉強やめる人間よりも安定しているかもしれない
2023/02/26(日) 00:21:28.76ID:RymrPGNU
それはないな
2023/02/26(日) 03:13:20.95ID:7bMwo3Dx
所有権とライフタイムとDropトレイトを全部ごちゃ混ぜにして覚えちゃってる困ったちゃん
2023/02/26(日) 10:19:55.47ID:PXNtu1ca
初心者になるのも大変だからなw
大体はそれ以前に転がされて終わるw
2023/02/26(日) 10:47:51.71ID:PXNtu1ca
実用レベルの達する前に学習者の9割が脱落してしまう言語
言語がRustだけになるとIT業界は終わる模様
2023/02/26(日) 11:06:18.81ID:GuAg4x+U
複オジも仮オジも無意味オジもみんなRustの被害者だった?
2023/02/26(日) 11:13:58.37ID:PXNtu1ca
誤解して入門を終えて実用的なプログラムを書けないで四苦八苦するのは個人の問題だからいい
でも間違った知識のままそれを主張するのは非常に迷惑

ポインターのミスでヒープをぶち壊してるような感覚
950デフォルトの名無しさん
垢版 |
2023/02/26(日) 11:27:18.64ID:fGMmkE/4
>>947
その時はIT業界とRust業界に分かれるから大丈夫
2023/02/26(日) 11:53:47.03ID:/LcclasN
「所有権はdropする責務」の出典だけ分かればすべて腑に落ちる
2023/02/26(日) 12:46:50.46ID:bBmvUj++
それでようやく理解できた
参照はdropで何もしないから責務がなくて使い捨てしても構わなくて所有権を考える必要ないと
2023/02/26(日) 13:12:35.62ID:GuAg4x+U
こいつもう地縛霊やろ…
2023/02/26(日) 13:29:31.28ID:sdcrACTy
次スレってワッチョイつけたりしないの?
意図せずともID変わりがちな人もいるし追い辛いからつけてほしい
2023/02/26(日) 14:25:35.83ID:dBtzQT39
参照についてだけ""わざわざ""、""特段に""、所有権について ""敢えて意識して""、""所有権について考えないようにする""必要性がない
2023/02/26(日) 14:40:14.97ID:/LcclasN
付けてもいいけどたぶんそれだと困る人はワッチョイなしでスレを立てる
そしてそっちが伸びれば誰もワッチョイありスレを使わない
そうしてできた残骸がすでに3スレある

立てたければ勝手にすればいいけど、ワッチョイありスレだけを使い荒らしに反応しない強い意志が求められている
2023/02/26(日) 17:46:02.01ID:RD2OSQ4A
>>954
>>956
次スレはワッチョイありを再利用すればいいよ。
ゴミスレ残したままなのは迷惑だし。

次スレ
https://mevius.5ch.net/test/read.cgi/tech/1514107621/
2023/02/26(日) 18:37:40.46ID:32xuZUXu
ワッチョイ有無どちらのスレに書き込むかは各自の自由
ワッチョイ無しスレは立てたい人がいればこのスレの後に自由にすればよいが
ワッチョイ有りスレは既に3つもあるため4つ目を立てることは控えた方がよい
2023/02/26(日) 19:27:42.62ID:qHcJFulr
IDコロコロ野郎に荒らされるよりはワッチョイでいいやろ
2023/02/26(日) 20:16:02.76ID:b1C1t60u
ワッチョイあるスレは十中八九ネガティブ禁止の盲目信者専用になる
2023/02/26(日) 20:39:47.94ID:IWkF2kZ0
ワッチョイありが盛り上がってたらそっちに行くって言ってるのに誰も向こうに書かないじゃん
2023/02/26(日) 21:10:15.97ID:5AwzMq5X
マイナンバーにたとえるとお金バラまかないと無理なのでは
2023/02/26(日) 21:13:21.05ID:5bxi2XZj
自演対立や架空キャラ自演がやりにくくなるからこのままがいい
2023/02/27(月) 08:54:14.39ID:a5aJsnij
次スレをワッチョイにして統合すればいいんじゃないの?
965デフォルトの名無しさん
垢版 |
2023/02/27(月) 19:38:38.14ID:knW1Dm2b
すまんが、The Bookと比較してオライリー本ってどんな内容になってるの?
2023/02/27(月) 21:25:36.59ID:4hfcaKna
The Bookと比較すると
- 図や説明がわかりやすい
- カバーしてる範囲がやや広く説明も詳しめ
- C++との比較がやや多い
- IteratorやStringのメソッドの多くを一つ一つ説明しておりややくどい
- Rust特有のコードの読み方も書いてあって助かった (‘aはティックエーと読む等)

個人的には1点目がすごく大きかった
特にOwnershipとReferenceの章
967デフォルトの名無しさん
垢版 |
2023/02/27(月) 21:31:00.76ID:qRKv85Qa
オライリー本はRust始めた時に買ったけど一生積んでる
2023/02/27(月) 21:36:07.85ID:4hfcaKna
ここで少し中身を見てみれば? amazonのlook insideより多く見れる
https://books.google.com/books/about/Programming_Rust.html?id=qlkzEAAAQBAJ
2023/02/27(月) 22:07:50.00ID:mGWqDr1m
>>966
最後わかる〜
970デフォルトの名無しさん
垢版 |
2023/03/01(水) 09:54:37.52ID:Nh0mXjrz
Rcって値を所有してるの?
参照だから複数存在できる感じ?
規則と矛盾してて全く分からない
2023/03/01(水) 12:37:59.53ID:Avl8k8mO
>>970
同じ値を複数のRCで共有している。

Rustの場合、RCの「参照」は、参照と借用とか参照外しとかの「参照」とは別物と考えたほうが良い。
2023/03/01(水) 13:03:01.05ID:450i2TJh
>>970
共同所有

Rc::cloneで新しい共同所有者を追加する
共同所有者がスコープアウトすると共同所有者リスト的なものから削除される
最後の所有者がスコープアウトする際に所有してるポイント先もdropされる
2023/03/01(水) 23:42:12.75ID:+2HtVlqv
これを?オペレータ使った書き方するにはどうすればいいですか?
if let [first, second, third] = vec {
...
}
これでは上手く行きませんでした
let [first, second, third] = vec?;
2023/03/02(木) 06:24:51.44ID:lQMCQ2j6
>>973
マッチしなかった場合どうしたいのか?
そのコードが含まれる関数の戻り値の型は?
2023/03/02(木) 08:11:39.46ID:iXGuMNZc
Rustに限った話じゃないけど低レイヤーに関する情報ってなかなか入手できない
Rustなら一応Embedded Rustがあるけど実践的にはいろいろ足りてない
2023/03/02(木) 12:26:14.43ID:OJtdP8PO
↓この人、美しいクレイピングを書ける!
2023/03/02(木) 19:10:50.25ID:OHJUJNoL
>>973
このスレでErr値を使わない時にif letやlet elseを使う、とあったのと同じで
Err値がない場合も同じようにこうする
let [first, second, third] = vec else {
return Err(...); // or None
};

>>975
話が曖昧すぎるので具体的に

>>976
クレイピングは知らん
scraper crateを使っている
2023/03/02(木) 22:00:06.30ID:C1WbSTgL
相変わらず複オジの会話の噛み合わなさとオレオレ用語の使い方は異常だな
2023/03/02(木) 22:03:06.97ID:Op0Ow0AD
どこにオレオレ用語があるのか教えて
2023/03/03(金) 00:39:13.95ID:2c4ti5P+
>let [first, second, third] = vec else {
> return Err(...); // or None
>};
vecを直接マッチさせることはできないからsliceにする必要がある

それはいいとしてもvecを固定長のarrayにマッチさせて各要素を異なる名前の変数に入れるかエラーにするやり方はcode smellに感じる
vecが外部入力で変更しようがないのかもしれないがそれでも素直に長さチェックしたほうが良い
2023/03/03(金) 00:48:28.99ID:a3+dFKh3
一応次スレ立てた
Rust part20
https://mevius.5ch.net/test/read.cgi/tech/1677771928/

ワッチョイスレならこっち
プログラミング言語 Rust 4【ワッチョイ】
https://mevius.5ch.net/test/read.cgi/tech/1514107621/
2023/03/03(金) 01:01:26.40ID:5jfhiVlm
>>980
スライスパターンとそのマッチングはRust公式リファレンスにも載っている普通の便利な用法
わざわざ長さチェックしていたらスライスパターンマッチングを知らない初心者かなと思ってしまう
さらに..パターンも併せて例えば
if let [.., ラス前, _] = s
これも公式に例として出ていて同様に長さチェックは不要
2023/03/03(金) 17:46:26.59ID:s0En6Xz7
>>973
moveしたいんなら
let [first, second, third]: [_; 3] = vec.try_into().map_err(|_| MyError::InvalidNumberOfHoge)?;
Vecを[T; N]にtry_intoした場合
Errの型がVecなのでmap_errしないと?が使えない
2023/03/03(金) 18:25:09.48ID:hYRwId4B
referenceでも同じ
let [first, second, third]: &[_; 3] = vec[..].try_into().map_err(|_| MyError::InvalidNumberOfHoge)?;
2023/03/04(土) 00:46:15.62ID:ksgM7HUQ
結局?を無理に使うよりこの方が短く可読性もいいな
let [first, second, third] = vec[..] else {
return Err(MyError::InvalidNumberOfHoge);
};
2023/03/04(土) 20:27:33.18ID:ym5vMWPk
そんな使い方が許されるのは個人プロジェクトか使い捨てのコードだけだね
2023/03/04(土) 21:28:46.68ID:VYEasP1j
ログファイルの各行をsplitして特定の項目(例:日時とIPとURL)だけを拾う処理とかで使えそう
Rustでは書いたことないけど
2023/03/04(土) 21:42:49.00ID:aBxEUUGf
>>986
Rustのリファレンス書の例>>986を許さない人こそ偏ってね?
そういう偏執者は代わりのコードどう書くんだ?
2023/03/04(土) 23:13:10.54ID:Oy3wPidb
>>986はいつもの荒らしだから無視しろ
荒らしは文句をつけるだけで修正案を出さない(出せない)から見分けられる
2023/03/06(月) 11:51:11.89ID:tj78G6sJ
>>987
使い捨てのコードじゃなければそういうのはcsv parserやargument parserを使って構造体に変換するからパターンマッチでは書かないよ
2023/03/06(月) 12:45:03.92ID:I6GlZboG
それは用途によりけり
構造体にDeserializeする場合もあれば構造体を用意しない場合もある
パース用途以外でマッチングならパーサーが出て来る余地すらない
2023/03/11(土) 12:38:09.48ID:1tP1A91g
誰も埋めてくれない...
2023/03/11(土) 12:38:57.76ID:1tP1A91g
うーめ
2023/03/11(土) 12:40:01.79ID:1tP1A91g
うめうめ
2023/03/11(土) 12:41:44.36ID:1tP1A91g
うめーん
2023/03/11(土) 12:43:10.68ID:1tP1A91g
梅太郎
2023/03/11(土) 12:44:21.54ID:1tP1A91g
うめめめめめ
2023/03/11(土) 12:46:24.71ID:1tP1A91g
うーめ
2023/03/11(土) 12:47:53.90ID:1tP1A91g
めーう
2023/03/11(土) 12:50:01.78ID:1tP1A91g
彡 ⌒ ミ
(´・ω・`)
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 53日 0時間 8分 30秒
レス数が1000を超えています。これ以上書き込みはできません。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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