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/09(日) 21:41:43.59ID:QVmVQA75
Cでポインタ型の値を渡してるだけのことを
参照渡しと言っちゃう害悪がネットにチラホラ残ってて悲しい
ポインタ渡しとかいうすっとんきょうな用語も必要性を感じない
Javaで単に参照型変数の値を渡してるだけのことを
参照渡しと言っちゃうのも割りとあって悲しい
2022/01/09(日) 21:57:11.88ID:DflwLcIO
>>501
そう捉えるのが普通だよな
2022/01/09(日) 22:12:54.92ID:tE6q+RNQ
>>501
値が複製された場合なら問題ないんでないの?
2022/01/09(日) 22:21:03.82ID:uOSYnK8a
Rustは非常にシンプルで
Copy traitが実装されていない型は値と所有権がmoveされる
Cooy traitが実装されている型は値がcopyされてその値に新たな所有権が生じる

もちろんそれを所有権と値が複製されたとみてもよい
ちなみにRcは所有権の複製ではなく所有権の共有
2022/01/09(日) 22:28:10.17ID:ec1b4GYb
「所有権とは、文字通り変数が値を所有できる権利のことです。」
ふむふむ

「スカラー型の変数は、変数間の代入において所有権は基本的に複製されます。これを「所有権の複製(コピー)」といいます。」
ふむふむ・・・

「変数間の代入などにおいて所有権は複製されるので、値の所有者は常に1個でなければならないというルールは守られます。」
・・・は?
元の値を所有できる権利を複製したんじゃなかったの?
2022/01/09(日) 22:37:27.87ID:uOSYnK8a
>>511
所有権と値は必ずセットで複製される
当たり前だが片方だけが複製されることはありえない
必ず1対1の関係になる
ちなみにRcの場合は所有権は複製されずに所有権の共有となる
2022/01/09(日) 22:41:22.81ID:zMIZ+Krn
>>511
>変数が値を所有できる権利のこと
"所有できる権利"という捉え方が良くないね
2022/01/09(日) 23:30:44.08ID:enp/nJFU
>>489
所有権だけが複製されるわけじゃないし、たしかに不自然だな
2022/01/10(月) 00:03:57.12ID:x5u3TTyT
>>509
複製された(結果的に値は同じだけどメモリ上の位置は異なる)新たな値に対する新たな所有権を「所有権が複製される」って表現するのはおかしいべ?


>>510
そこよく勘違いされてるけど値自体はCopyトレイトと関係なく常に複製されてるよ(最適化で除かれるとかは別として)

https://doc.rust-lang.org/std/marker/trait.Copy.htmlに全部書いてあるけど
Copyな型は「プリミティブ型みたいに単純にメモリの内容を複製するだけでオッケー=copy」
非Copyな型は「ポインタとか含まれてたりして単純にメモリの内容を複製するだけだとNGな可能性があるから古い方は使えなくするよ=move」
ってだけ
2022/01/10(月) 11:29:11.88ID:0oVbzL+8
>>515
ルールを守れるか守れないかという話。
表現としておかしいかどうかは結論なんて出せないんじゃね?公式ドキュメントででも謳ってない限り。
2022/01/10(月) 20:14:15.89ID:tVKp4zEB
著者のバックグラウンド見る限りC/C++の経験があるオレならRustも分かっちゃうよ?みたいな連載だから表現が慣れてなくても気にしない
監修もRustの人っぽくなさそうだし…多分、関数型の語彙が無いんじゃないかね
2022/01/10(月) 20:29:16.07ID:DRRBVfd3
うんこ言語を好意的に連載してる記事をこき下ろす性格の悪いRusterが集まる駄スレ
2022/01/11(火) 03:16:23.27ID:DWOD4ihn
>>515
> そこよく勘違いされてるけど値自体はCopyトレイトと関係なく常に複製されてるよ(最適化で除かれるとかは別として)
>
> https://doc.rust-lang.org/std/marker/trait.Copy.htmlに全部書いてあるけど

へー、なるほど、いろいろ納得したわ
2022/01/11(火) 11:05:54.30ID:U35zy9ok
>>518
だよなぁ。
誰か筆者に指摘した?

あと、「所有権の複製(コピー)」はRustだと実際は何て言ってるの?
2022/01/11(火) 12:25:22.53ID:yQgVkZD8
「所有権の複製」でググってもほぼ誰も使って無い用語で草
2022/01/11(火) 12:27:41.85ID:zYBpR5AJ
所有権だけをすることなんてないだろうし、そんな言葉なくね
そもそも意味わからん

処理系を実装してる人にとっては考えることかもしれんが
2022/01/11(火) 12:28:11.69ID:zYBpR5AJ
所有権だけを複製すること、の間違い
2022/01/11(火) 21:25:05.09ID:On+Ztxm9
まあ無駄にややこしいだけの説明だわな。
これで間違ってない!とか意地張るような輩は俺だったら落とすわ。
2022/01/11(火) 21:31:59.06ID:xKqG3MQU
どっちに解釈しても問題ない話の一方に固執する方がお断りだな。
2022/01/11(火) 22:00:42.75ID:7fHp9GHd
所有権の複製の意味が分からん
不用意に独自用語使うのを野放しにしちゃいけない
専門用語とその定義がなぜあるのかを考えて欲しい
2022/01/11(火) 22:43:07.52ID:2061HgWk
>>519
実際に生ポインタ(アドレス)を見る形で実験したところ
「関数に値渡し(≠参照渡し)する」時は
「Copy trait実装の有無」に関係なく
「必ず値は複製されている(=別アドレスになる)」という
よく考えれば当たり前の挙動となった

つまり話をまとめると
・Copy trait実装の有無と関係なく「値は必ず複製される」
・Copy trait実装がある時は「所有権も複製される」
・Copy trait実装がない時は「所有権は移動する」
これ以外に表現しようがないことがわかった
2022/01/11(火) 23:09:26.60ID:On+Ztxm9
メモリ上の動きと言語上のルールの違いもまともに理解してなさそうな連中だな。
2022/01/11(火) 23:49:06.82ID:t1MM9BO+
mutの時に書き換えると元の値と別の値に出来るのだから新たな所有権が生じているのは事実
あとは、所有権の複製、という表現の問題
間違ってはいないが理解しにくいならば別の良い表現で置き換えればよいが何がいいだろう?
2022/01/12(水) 00:52:45.70ID:1lKX/EK6
値が複製されるのに伴って新たな所有権が生成される
2022/01/12(水) 08:45:55.15ID:zdKxvEH9
ムーブの場合は元の所有権が破棄されて新たな所有権が生成される
2022/01/12(水) 10:38:50.42ID:uD0wFQGQ
値を複製したらメモリの領域が別なのに「所有権の複製」は何を複製すると思ってんだろ
2022/01/12(水) 18:27:19.23ID:5pTy1wN9
>>532
さっぱりわからんよな

>>529
> 間違ってはいないが理解しにくいならば

何言ってんのコイツ?
2022/01/12(水) 21:24:46.00ID:zdKxvEH9
全く同じものを新しく生成するのと複製は外から見て区別しようがないんだから
535デフォルトの名無しさん
垢版 |
2022/01/12(水) 22:30:30.00ID:y9ayzVSo
所有権はコンパイル時のはなし
メモリの動きは実行時のははし
2022/01/12(水) 23:21:45.30ID:mVKgaRWA
セマンティクスの話をしろ
2022/01/12(水) 23:51:37.77ID:DMKGOQqO
現実世界の所有権が複製可能な権利だったのなら
複製されると勘違いする人がいても不思議はないが・・・
2022/01/13(木) 08:49:48.70ID:+PFReeTS
質量保存則に縛られる現実世界の複製との対比には限界があるわな。
2022/01/13(木) 10:12:58.78ID:8S0jzhzB
権利のような無形物は質量保存則には縛られない

Borrow Checkerが課すルールをわかりやすく説明するためのメタファーとして
現実世界の所有権という概念を借りてきてるのに
そのメタファーを分かりにくくするエクストリームなルールを勝手に追加して広めるのはやめよう
2022/01/13(木) 10:57:22.74ID:VN3LqOp5
https://users.rust-lang.org/t/what-is-the-formal-definition-of-ownership/41984
なんか同じようなやり取りして同じように最終的にグダグダなまま閉じてて草
2022/01/13(木) 11:03:58.63ID:4F526BmN
というかRustの実装のところ見ればいいんじゃね?
仕組みのコードはあるだろうし
2022/01/13(木) 11:11:48.72ID:0M0jmEeK
見るまでもないだろw
2022/01/13(木) 12:20:30.48ID:k/BdCeDW
https://doc.rust-lang.org/rust-by-example/scope/move.html
ここでは所有権が移動される(the ownership of the resources is transferred)とあるから
ここからの類推で所有権の複製という言葉が出てきたのかな
2022/01/13(木) 12:30:05.91ID:H8cLP4dt
Ownershipを所有権と訳したから
「所有権とは、文字通り変数が値を所有できる権利のことです」
という間違った解釈がされて
さらには「所有権の複製」なんていうトンデモ説が出現しちゃう
2022/01/13(木) 14:09:36.75ID:O06YpWsI
>>543
ownershipが所有権ならtransferは譲渡
move(移動)とは明確に使い分けられてる
2022/01/13(木) 14:28:13.33ID:LRlvXHH5
結局はどこにも原典がないオレオレ用語でワロタ
技術は研鑽していかないといけないのに
ポエムと独自解釈と拡大解釈によって逆方向に突き進むボンクラ
547デフォルトの名無しさん
垢版 |
2022/01/13(木) 15:21:48.48ID:4OU2rK55
まぁ、オープンソースですらねぇし専門家の目すら通ってない様なサイトだし
それっぽい事書いときゃいいんだよってのが大抵のweb界隈

itで何か知りたいなら手っ取り早い話公式ドキュメント当たれって事だろ(´・ω・`)
2022/01/13(木) 15:31:14.25ID:iHsQmzfW
それでわかりやすくなるんなら別にいいけど、余計わかりにくくしてるってさぁ。。
2022/01/13(木) 15:55:36.32ID:k/BdCeDW
>>545
https://doc.rust-jp.rs/rust-by-example-ja/scope/move.html
修正のpull req出しておいて
2022/01/13(木) 16:12:14.47ID:VN3LqOp5
ルー語で言うと「ownershipがtransferされることをmoveって呼ぶ」的な?
2022/01/13(木) 16:19:48.57ID:VN3LqOp5
this is known as a move.
英語のほうだと「ムーブとして知られています」か

実際コンパイラのソースみてもownershipはtransferとかtakeっていう表現でmoveだのcopyとは言ってないね
2022/01/13(木) 16:53:50.81ID:qAhzUFbZ
>>549
公式リファレンスくらいは英語で読もうよ
そんな変なサイト見てるからOwnershipの意味すら取れなくなるんだぞ
553デフォルトの名無しさん
垢版 |
2022/01/13(木) 17:08:41.31ID:2BXAobev
>>552
それは変なサイトではなくRust公式ページの日本語訳。
元のRust公式ページでも同様。

Ownership and moves
https://doc.rust-lang.org/rust-by-example/scope/move.html

Because variables are in charge of freeing their own resources,
resources can only have one owner.
This also prevents resources from being freed more than once.
Note that not all variables own resources (e.g. references)

When doing assignments (let x = y) or passing function arguments by value (foo(x)),
the ownership of the resources is transferred.
In Rust-speak, this is known as a move.
2022/01/13(木) 17:27:36.08ID:W1ZKAEcb
>>553
Google翻訳にかけてごらんw
主語も目的語も受動態の意味もわかってないような翻訳はゴミ
2022/01/14(金) 00:21:00.58ID:hAOjwXhX
DeepL で翻訳してみた

なぜなら、変数は自身のリソースを解放する役割を担っているからです。
リソースは一人のオーナーしか持つことができません。
これはまた、リソースが複数回解放されるのを防ぐためでもあります。
すべての変数がリソースを所有するわけではないことに注意してください(例:参照)。

代入(let x = y)や関数の引数を値で渡す場合(foo(x))。
リソースの所有権は移転する。
Rustの用語では、これを「移動」と呼びます。
2022/01/14(金) 00:30:32.83ID:hAOjwXhX
「所有権の複製」とか、意味の分からない事を書いている、香具師がいるのか?
2022/01/14(金) 00:36:35.57ID:kUhlpB/h
>>556
!Copyの場合は所有権がtransferされるのであれば
Copyの場合はどう表現すべきかという話
2022/01/14(金) 02:45:20.76ID:InXswW/0
>>557
元の値の所有権はそのまま、複製された新しい値の所有権が新しく発生する。
元の値の所有権について何も操作は行われておらず、表現すべきことも無い。
559556
垢版 |
2022/01/14(金) 03:32:18.88ID:hAOjwXhX
所有権が複製されるという書き方よりも、むしろ、

primitive を含むコピー型変数は、コピーされると、
所有権は移動しないので、元の変数にもアクセスできる、みたいに使う

コピーされると新たに、別のオブジェクト(実体・メモリ領域)と所有権が作られるとか
2022/01/14(金) 08:35:26.86ID:8BRe3wDd
- 所有権ごと複製するという表現がわかりやすいかわかりにくいか⇒人それぞれ
- 所有権を複製するという表現が逆になにか問題を生ずるか⇒今のところ挙げられてない
2022/01/14(金) 08:46:30.94ID:y5w5F0v6
>>556
そう
「水素の音」みたいなもん
「水素の音」って言いたい人がいるだけ
562デフォルトの名無しさん
垢版 |
2022/01/14(金) 09:28:53.08ID:n8eH8EkW
>>558
これだよな
2022/01/14(金) 09:48:26.29ID:20065uel
所有権の複製では意味が通らない事は明らかなので、
誰か >>489 の文をサクッと直してくれていいんだぞ
2022/01/14(金) 09:59:56.29ID:wd6QtXqe
流れ見てると「所有権の複製」は

おかしいから使うな派が半分
おかしいけどまあ好きにすれば派が半分
おかしくない派が約1名

みたいな感じ?
2022/01/14(金) 12:13:02.65ID:8BRe3wDd
この生産性のない議論に参加している人の割合と考えればさもありなん。
2022/01/14(金) 12:25:28.10ID:kUhlpB/h
>>564
どうでもいい派が抜けてる
2022/01/14(金) 13:03:41.15ID:bXd4RL2X
>>560
全く別の所有権なんだからコピーとか言うとわかりにくいだろ。
2022/01/14(金) 21:39:59.21ID:+ggCJzG3
所有権というか、ポインタなのか、実体なのかって考えれば所有権もすぐに理解できると思うが
569デフォルトの名無しさん
垢版 |
2022/01/14(金) 22:02:26.42ID:hgiR/8Zn
>>568
それは所有権を理解してないのでは?
2022/01/14(金) 22:22:42.07ID:8BRe3wDd
>>:567
1つだったものが2つになることを複製と呼ぶのはべつにわかりにくいとは思わんがなぁ
2022/01/14(金) 22:37:39.46ID:WRwvxAen
現実のものに例えると適する例がないけど
近い分野だとOSでのプロセスのfork()に近いかな
どちらも初期状態は同じでその後は別の道を歩んで値(メモリ)が別の値を取れるようになる
これをプロセスの複製と呼ぶから複製という単語自体はわかりやすいと思う
2022/01/14(金) 22:45:21.62ID:bXd4RL2X
>>570
だから「所有権」に関しては全く別物だろうがよ。。いつまでアホなこと言ってんだか。
573デフォルトの名無しさん
垢版 |
2022/01/14(金) 22:49:30.67ID:IfPg31YF
ジエンさんも複製されてるねw
574デフォルトの名無しさん
垢版 |
2022/01/14(金) 22:54:57.45ID:k9ZagSOx
>>570
所有権は複製はできないが分割は可能
共有名義の不動産持分みたいなやつ
Rustに当てはめるとRcにあたる
2022/01/14(金) 22:59:38.88ID:8BRe3wDd
>>572
>だから「所有権」に関しては全く別物だろうがよ

「全く別物」という理由は?2つになるのは変わるまい。
2022/01/14(金) 23:04:12.94ID:8BRe3wDd
>>574
人それぞれだと思うが俺は所有権の分割って方がわかりにくいと思うがな。
Rcと紛らわしいから「複製」は使うなというのは納得できるが。
2022/01/14(金) 23:08:16.48ID:wd6QtXqe
>>571
プロセスはtask_structとかがあってしかも実際に複製されてるからな

Rustの所有権はそういうふうに実際にstruct Ownership;みたいのが有るわけじゃない
上の方でも言ってるやつがいるけどborrowcheckerとかのルールや制約を所有権って概念で説明してるだけ

だからメモリ上でCopyな(=単純なmemcpyで矛盾が起きない)型が複製されりゃ新しい所有権が作られるし!Copyな(=単純なmemcpyだと矛盾が起きる可能性が有る)型なら所有権もtransferされるってだけ
そこに解釈云々だのの余地はなく複製もクソもない
578デフォルトの名無しさん
垢版 |
2022/01/14(金) 23:11:40.41ID:Gij7VB+L
>>571
そこで言う複製は値の複製
forkしてもPIDは複製されないのと同じで所有権も複製されない
2022/01/14(金) 23:13:06.72ID:hAOjwXhX
複製という用語は、2つの実体が作られたよりも、
その2つの同値性が強調される

例えば、一卵性双生児は同一の遺伝子だから複製だけど、
二卵性双生児は複製じゃない。
単に、別々の2つの実体が発生しただけ

二卵性双生児間には同値性が無いから

ただ、文書を書いた外人は、copy を同値性という意味で使っていない

長文で説明するのが面倒くさいので、copyという短い単語で、
単に、2つの実体が作られたみたいに、気軽に使っているのだろう

だから、copyを翻訳すると複製になってしまう
580デフォルトの名無しさん
垢版 |
2022/01/14(金) 23:23:12.29ID:b+sgeTEs
複製という訳の問題じゃないよね
「所有権のコピー」と言っても「copy ownership」と言っても何も変わらない
2022/01/14(金) 23:34:11.11ID:b8FVBfqE
PIDとか二卵性双生児とか、根拠や脈絡がない例え話が次々に出てくるのが笑える。
なんでそこまで必死なのかと。
582デフォルトの名無しさん
垢版 |
2022/01/14(金) 23:56:50.14ID:ErNyx2qm
fork出してきたお前が言うなやw
2022/01/15(土) 00:13:28.41ID:5R4N3qYj
>>571は曲がりなりにも根拠らしきものを挙げているけど
>>578のPIDはまったくの根拠レスじゃん、
forkで複製されないものを探したらPIDが出てきたとかじゃね?
584デフォルトの名無しさん
垢版 |
2022/01/15(土) 01:02:15.31ID:l/1QpEiq
>>570
値はそうかも知れんが所有権は新しくできたものだろ。
新しくできたものを複製ってのは変だろうが。
2022/01/15(土) 01:19:56.24ID:KOUnkRnZ
C++の例外をちゃんと扱うのは難しい、Rustのほうが簡単やろ
2022/01/15(土) 01:20:44.09ID:KOUnkRnZ
スレ間違えた
まあいいや
587デフォルトの名無しさん
垢版 |
2022/01/15(土) 02:34:21.16ID:LQYSNqi+
>>583
そう感じちゃうのがRustの所有権を理解してない何よりの証拠なんだよなぁ
2022/01/15(土) 08:00:13.06ID:SUNY4hKu
>>587
根拠を挙げて主張しているかそうでないかの違い。国語の問題。
所有権を理解しているかどうかは関係ないんだがお前さんの読解力にも問題があるな。
2022/01/15(土) 08:48:58.88ID:MrK/oPRe
根拠があるってんなら単にrust公式から定義をひっぱってくればいいのではw
それが無いから単なる珍妙なオレオレ用語で終了なんだよこの話は
こーいう手合いをいちいち構ってると時間足りないぞ人生は短いぞ
590デフォルトの名無しさん
垢版 |
2022/01/15(土) 09:24:09.35ID:i5tbAI8Y
>>588
複製おじさん必死だなww
2022/01/15(土) 10:37:04.68ID:SKIF+upB
もう誰か本家のissueに「CopyとMoveって何をcopy、moveしてるの?所有権のcopyっておかしい?」って突撃してこいよw
2022/01/15(土) 10:38:54.35ID:zYbpVr1V
スレ追い切れてないけど所有権だけcopy/moveしてるという主張してる人がいるの?
2022/01/15(土) 11:23:39.22ID:xPHqeDv2
>>591
聞くまでもなくおかしいだろwww
何をcopy、moveしてるのかはチュートリアル読めよ
2022/01/15(土) 11:24:43.51ID:ZhZU0a8B
>>592
複製おじさんちーっすw
2022/01/15(土) 12:21:18.07ID:NVDl8gUD
参照の説明に合わせてCopy Typeには所有権は無いという捉え方ならかろうじて理解はできる
2022/01/15(土) 13:06:56.98ID:SKIF+upB
>>593
おれら匿名の有象無象におかしいって指摘されても聞く耳持たねぇみたいだから本家でぶった切られてこいっていう皮肉なw
2022/01/15(土) 16:47:14.84ID:MrK/oPRe
Cでポインタへのポインタをダブルポインタと言い張ったり
Cで関数へポインタで値渡ししてるだけのことを参照渡しと言い張ったり
酷いと思わんかね?
思わん人も居ることのほうが問題
598デフォルトの名無しさん
垢版 |
2022/01/15(土) 17:52:02.36ID:gzKdcX6j
>Cでポインタへのポインタをダブルポインタと言い張ったり
>Cで関数へポインタで値渡ししてるだけのことを参照渡しと言い張ったり
c++でポインタ渡しを参照渡し言うならそりゃ誤解は出てくるが、そんなに問題にならんわ。
てか extern C で参照渡しは普通にポインタ扱いになるしな。
rustで所有権のコピー言うのは明確に意味がおかしい。
2022/01/15(土) 18:25:43.70ID:V6fKEShR
もうええやろこの話題は…こんな枝葉の問題でギャーギャー騒いでたら何も身につかんで…
Rust棒を使って気に食わないやつを殴りたいだけなんか…?
2022/01/15(土) 18:25:58.18ID:T5sD8sXT
所有権 → リソースの解放義務
コピーしたらアカン
601デフォルトの名無しさん
垢版 |
2022/01/15(土) 19:00:19.86ID:Pt/mdzot
c++23以降で契約プログラミングのサポートが入るらしいけど、rustって言語レベルで契約プログラミングサポートしてる?
2022/01/15(土) 19:35:04.98ID:Ipn+w0vn
1週間以上も議論が続いている原因はおそらく
copyとmoveの対象の非対称性にあると思う

Copy trait非実装の型は「所有権がmoveされる」
Copy trait実装の型は「値がcopyされる」そして「新たな所有権が生じる」
2022/01/15(土) 20:06:03.10ID:gzKdcX6j
そんな複雑な理屈じゃなくてただのバカが意固地になってるだけだろ。。
2022/01/15(土) 21:12:26.97ID:U8m/+TaT
>>602
議論が続いてる気になってるんだw
2022/01/15(土) 21:34:33.77ID:5CQZXOEN
>>602
moveの対象も値だぞ
the bookのownershipの解説ページに1つでもmoveの対象がownershipになってる箇所あるか?
https://doc.rust-lang.org/book/ch04-01-what-is-ownership.html

@ITの記事はそこも間違ってる
2022/01/15(土) 21:37:55.34ID:5CQZXOEN
>>600
ホントこれ
所有権が何かわかってれば複製なんて考えは絶対出てこない
2022/01/15(土) 21:44:00.10ID:+D8ShBal
俺は中立派なので
「Copyトレイト実装型は値と所有権が複製される」
でも構わないし9割以上の人々にはこれで通じるだろう
あとはどこまでこだわるかだけだ
これ以上その表現は容認できないと続けるならばスレ荒らしと変わらない
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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