公式
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
550デフォルトの名無しさん
2022/01/13(木) 16:12:14.47ID:VN3LqOp5 ルー語で言うと「ownershipがtransferされることをmoveって呼ぶ」的な?
551デフォルトの名無しさん
2022/01/13(木) 16:19:48.57ID:VN3LqOp5 this is known as a move.
英語のほうだと「ムーブとして知られています」か
実際コンパイラのソースみてもownershipはtransferとかtakeっていう表現でmoveだのcopyとは言ってないね
英語のほうだと「ムーブとして知られています」か
実際コンパイラのソースみてもownershipはtransferとかtakeっていう表現でmoveだのcopyとは言ってないね
552デフォルトの名無しさん
2022/01/13(木) 16:53:50.81ID:qAhzUFbZ553デフォルトの名無しさん
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.
それは変なサイトではなく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.
554デフォルトの名無しさん
2022/01/13(木) 17:27:36.08ID:W1ZKAEcb555デフォルトの名無しさん
2022/01/14(金) 00:21:00.58ID:hAOjwXhX DeepL で翻訳してみた
なぜなら、変数は自身のリソースを解放する役割を担っているからです。
リソースは一人のオーナーしか持つことができません。
これはまた、リソースが複数回解放されるのを防ぐためでもあります。
すべての変数がリソースを所有するわけではないことに注意してください(例:参照)。
代入(let x = y)や関数の引数を値で渡す場合(foo(x))。
リソースの所有権は移転する。
Rustの用語では、これを「移動」と呼びます。
なぜなら、変数は自身のリソースを解放する役割を担っているからです。
リソースは一人のオーナーしか持つことができません。
これはまた、リソースが複数回解放されるのを防ぐためでもあります。
すべての変数がリソースを所有するわけではないことに注意してください(例:参照)。
代入(let x = y)や関数の引数を値で渡す場合(foo(x))。
リソースの所有権は移転する。
Rustの用語では、これを「移動」と呼びます。
556デフォルトの名無しさん
2022/01/14(金) 00:30:32.83ID:hAOjwXhX 「所有権の複製」とか、意味の分からない事を書いている、香具師がいるのか?
557デフォルトの名無しさん
2022/01/14(金) 00:36:35.57ID:kUhlpB/h558デフォルトの名無しさん
2022/01/14(金) 02:45:20.76ID:InXswW/0559556
2022/01/14(金) 03:32:18.88ID:hAOjwXhX 所有権が複製されるという書き方よりも、むしろ、
primitive を含むコピー型変数は、コピーされると、
所有権は移動しないので、元の変数にもアクセスできる、みたいに使う
コピーされると新たに、別のオブジェクト(実体・メモリ領域)と所有権が作られるとか
primitive を含むコピー型変数は、コピーされると、
所有権は移動しないので、元の変数にもアクセスできる、みたいに使う
コピーされると新たに、別のオブジェクト(実体・メモリ領域)と所有権が作られるとか
560デフォルトの名無しさん
2022/01/14(金) 08:35:26.86ID:8BRe3wDd - 所有権ごと複製するという表現がわかりやすいかわかりにくいか⇒人それぞれ
- 所有権を複製するという表現が逆になにか問題を生ずるか⇒今のところ挙げられてない
- 所有権を複製するという表現が逆になにか問題を生ずるか⇒今のところ挙げられてない
561デフォルトの名無しさん
2022/01/14(金) 08:46:30.94ID:y5w5F0v6562デフォルトの名無しさん
2022/01/14(金) 09:28:53.08ID:n8eH8EkW >>558
これだよな
これだよな
563デフォルトの名無しさん
2022/01/14(金) 09:48:26.29ID:20065uel 所有権の複製では意味が通らない事は明らかなので、
誰か >>489 の文をサクッと直してくれていいんだぞ
誰か >>489 の文をサクッと直してくれていいんだぞ
564デフォルトの名無しさん
2022/01/14(金) 09:59:56.29ID:wd6QtXqe 流れ見てると「所有権の複製」は
おかしいから使うな派が半分
おかしいけどまあ好きにすれば派が半分
おかしくない派が約1名
みたいな感じ?
おかしいから使うな派が半分
おかしいけどまあ好きにすれば派が半分
おかしくない派が約1名
みたいな感じ?
565デフォルトの名無しさん
2022/01/14(金) 12:13:02.65ID:8BRe3wDd この生産性のない議論に参加している人の割合と考えればさもありなん。
566デフォルトの名無しさん
2022/01/14(金) 12:25:28.10ID:kUhlpB/h >>564
どうでもいい派が抜けてる
どうでもいい派が抜けてる
567デフォルトの名無しさん
2022/01/14(金) 13:03:41.15ID:bXd4RL2X >>560
全く別の所有権なんだからコピーとか言うとわかりにくいだろ。
全く別の所有権なんだからコピーとか言うとわかりにくいだろ。
568デフォルトの名無しさん
2022/01/14(金) 21:39:59.21ID:+ggCJzG3 所有権というか、ポインタなのか、実体なのかって考えれば所有権もすぐに理解できると思うが
569デフォルトの名無しさん
2022/01/14(金) 22:02:26.42ID:hgiR/8Zn >>568
それは所有権を理解してないのでは?
それは所有権を理解してないのでは?
570デフォルトの名無しさん
2022/01/14(金) 22:22:42.07ID:8BRe3wDd >>:567
1つだったものが2つになることを複製と呼ぶのはべつにわかりにくいとは思わんがなぁ
1つだったものが2つになることを複製と呼ぶのはべつにわかりにくいとは思わんがなぁ
571デフォルトの名無しさん
2022/01/14(金) 22:37:39.46ID:WRwvxAen 現実のものに例えると適する例がないけど
近い分野だとOSでのプロセスのfork()に近いかな
どちらも初期状態は同じでその後は別の道を歩んで値(メモリ)が別の値を取れるようになる
これをプロセスの複製と呼ぶから複製という単語自体はわかりやすいと思う
近い分野だとOSでのプロセスのfork()に近いかな
どちらも初期状態は同じでその後は別の道を歩んで値(メモリ)が別の値を取れるようになる
これをプロセスの複製と呼ぶから複製という単語自体はわかりやすいと思う
572デフォルトの名無しさん
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:k9ZagSOx575デフォルトの名無しさん
2022/01/14(金) 22:59:38.88ID:8BRe3wDd576デフォルトの名無しさん
2022/01/14(金) 23:04:12.94ID:8BRe3wDd577デフォルトの名無しさん
2022/01/14(金) 23:08:16.48ID:wd6QtXqe >>571
プロセスはtask_structとかがあってしかも実際に複製されてるからな
Rustの所有権はそういうふうに実際にstruct Ownership;みたいのが有るわけじゃない
上の方でも言ってるやつがいるけどborrowcheckerとかのルールや制約を所有権って概念で説明してるだけ
だからメモリ上でCopyな(=単純なmemcpyで矛盾が起きない)型が複製されりゃ新しい所有権が作られるし!Copyな(=単純なmemcpyだと矛盾が起きる可能性が有る)型なら所有権もtransferされるってだけ
そこに解釈云々だのの余地はなく複製もクソもない
プロセスはtask_structとかがあってしかも実際に複製されてるからな
Rustの所有権はそういうふうに実際にstruct Ownership;みたいのが有るわけじゃない
上の方でも言ってるやつがいるけどborrowcheckerとかのルールや制約を所有権って概念で説明してるだけ
だからメモリ上でCopyな(=単純なmemcpyで矛盾が起きない)型が複製されりゃ新しい所有権が作られるし!Copyな(=単純なmemcpyだと矛盾が起きる可能性が有る)型なら所有権もtransferされるってだけ
そこに解釈云々だのの余地はなく複製もクソもない
578デフォルトの名無しさん
2022/01/14(金) 23:11:40.41ID:Gij7VB+L579デフォルトの名無しさん
2022/01/14(金) 23:13:06.72ID:hAOjwXhX 複製という用語は、2つの実体が作られたよりも、
その2つの同値性が強調される
例えば、一卵性双生児は同一の遺伝子だから複製だけど、
二卵性双生児は複製じゃない。
単に、別々の2つの実体が発生しただけ
二卵性双生児間には同値性が無いから
ただ、文書を書いた外人は、copy を同値性という意味で使っていない
長文で説明するのが面倒くさいので、copyという短い単語で、
単に、2つの実体が作られたみたいに、気軽に使っているのだろう
だから、copyを翻訳すると複製になってしまう
その2つの同値性が強調される
例えば、一卵性双生児は同一の遺伝子だから複製だけど、
二卵性双生児は複製じゃない。
単に、別々の2つの実体が発生しただけ
二卵性双生児間には同値性が無いから
ただ、文書を書いた外人は、copy を同値性という意味で使っていない
長文で説明するのが面倒くさいので、copyという短い単語で、
単に、2つの実体が作られたみたいに、気軽に使っているのだろう
だから、copyを翻訳すると複製になってしまう
580デフォルトの名無しさん
2022/01/14(金) 23:23:12.29ID:b+sgeTEs 複製という訳の問題じゃないよね
「所有権のコピー」と言っても「copy ownership」と言っても何も変わらない
「所有権のコピー」と言っても「copy ownership」と言っても何も変わらない
581デフォルトの名無しさん
2022/01/14(金) 23:34:11.11ID:b8FVBfqE PIDとか二卵性双生児とか、根拠や脈絡がない例え話が次々に出てくるのが笑える。
なんでそこまで必死なのかと。
なんでそこまで必死なのかと。
582デフォルトの名無しさん
2022/01/14(金) 23:56:50.14ID:ErNyx2qm fork出してきたお前が言うなやw
583デフォルトの名無しさん
2022/01/15(土) 00:13:28.41ID:5R4N3qYj584デフォルトの名無しさん
2022/01/15(土) 01:02:15.31ID:l/1QpEiq585デフォルトの名無しさん
2022/01/15(土) 01:19:56.24ID:KOUnkRnZ C++の例外をちゃんと扱うのは難しい、Rustのほうが簡単やろ
586デフォルトの名無しさん
2022/01/15(土) 01:20:44.09ID:KOUnkRnZ スレ間違えた
まあいいや
まあいいや
587デフォルトの名無しさん
2022/01/15(土) 02:34:21.16ID:LQYSNqi+ >>583
そう感じちゃうのがRustの所有権を理解してない何よりの証拠なんだよなぁ
そう感じちゃうのがRustの所有権を理解してない何よりの証拠なんだよなぁ
588デフォルトの名無しさん
2022/01/15(土) 08:00:13.06ID:SUNY4hKu589デフォルトの名無しさん
2022/01/15(土) 08:48:58.88ID:MrK/oPRe 根拠があるってんなら単にrust公式から定義をひっぱってくればいいのではw
それが無いから単なる珍妙なオレオレ用語で終了なんだよこの話は
こーいう手合いをいちいち構ってると時間足りないぞ人生は短いぞ
それが無いから単なる珍妙なオレオレ用語で終了なんだよこの話は
こーいう手合いをいちいち構ってると時間足りないぞ人生は短いぞ
590デフォルトの名無しさん
2022/01/15(土) 09:24:09.35ID:i5tbAI8Y >>588
複製おじさん必死だなww
複製おじさん必死だなww
591デフォルトの名無しさん
2022/01/15(土) 10:37:04.68ID:SKIF+upB もう誰か本家のissueに「CopyとMoveって何をcopy、moveしてるの?所有権のcopyっておかしい?」って突撃してこいよw
592デフォルトの名無しさん
2022/01/15(土) 10:38:54.35ID:zYbpVr1V スレ追い切れてないけど所有権だけcopy/moveしてるという主張してる人がいるの?
593デフォルトの名無しさん
2022/01/15(土) 11:23:39.22ID:xPHqeDv2594デフォルトの名無しさん
2022/01/15(土) 11:24:43.51ID:ZhZU0a8B >>592
複製おじさんちーっすw
複製おじさんちーっすw
595デフォルトの名無しさん
2022/01/15(土) 12:21:18.07ID:NVDl8gUD 参照の説明に合わせてCopy Typeには所有権は無いという捉え方ならかろうじて理解はできる
596デフォルトの名無しさん
2022/01/15(土) 13:06:56.98ID:SKIF+upB >>593
おれら匿名の有象無象におかしいって指摘されても聞く耳持たねぇみたいだから本家でぶった切られてこいっていう皮肉なw
おれら匿名の有象無象におかしいって指摘されても聞く耳持たねぇみたいだから本家でぶった切られてこいっていう皮肉なw
597デフォルトの名無しさん
2022/01/15(土) 16:47:14.84ID:MrK/oPRe Cでポインタへのポインタをダブルポインタと言い張ったり
Cで関数へポインタで値渡ししてるだけのことを参照渡しと言い張ったり
酷いと思わんかね?
思わん人も居ることのほうが問題
Cで関数へポインタで値渡ししてるだけのことを参照渡しと言い張ったり
酷いと思わんかね?
思わん人も居ることのほうが問題
598デフォルトの名無しさん
2022/01/15(土) 17:52:02.36ID:gzKdcX6j >Cでポインタへのポインタをダブルポインタと言い張ったり
>Cで関数へポインタで値渡ししてるだけのことを参照渡しと言い張ったり
c++でポインタ渡しを参照渡し言うならそりゃ誤解は出てくるが、そんなに問題にならんわ。
てか extern C で参照渡しは普通にポインタ扱いになるしな。
rustで所有権のコピー言うのは明確に意味がおかしい。
>Cで関数へポインタで値渡ししてるだけのことを参照渡しと言い張ったり
c++でポインタ渡しを参照渡し言うならそりゃ誤解は出てくるが、そんなに問題にならんわ。
てか extern C で参照渡しは普通にポインタ扱いになるしな。
rustで所有権のコピー言うのは明確に意味がおかしい。
599デフォルトの名無しさん
2022/01/15(土) 18:25:43.70ID:V6fKEShR もうええやろこの話題は…こんな枝葉の問題でギャーギャー騒いでたら何も身につかんで…
Rust棒を使って気に食わないやつを殴りたいだけなんか…?
Rust棒を使って気に食わないやつを殴りたいだけなんか…?
600デフォルトの名無しさん
2022/01/15(土) 18:25:58.18ID:T5sD8sXT 所有権 → リソースの解放義務
コピーしたらアカン
コピーしたらアカン
601デフォルトの名無しさん
2022/01/15(土) 19:00:19.86ID:Pt/mdzot c++23以降で契約プログラミングのサポートが入るらしいけど、rustって言語レベルで契約プログラミングサポートしてる?
602デフォルトの名無しさん
2022/01/15(土) 19:35:04.98ID:Ipn+w0vn 1週間以上も議論が続いている原因はおそらく
copyとmoveの対象の非対称性にあると思う
Copy trait非実装の型は「所有権がmoveされる」
Copy trait実装の型は「値がcopyされる」そして「新たな所有権が生じる」
copyとmoveの対象の非対称性にあると思う
Copy trait非実装の型は「所有権がmoveされる」
Copy trait実装の型は「値がcopyされる」そして「新たな所有権が生じる」
603デフォルトの名無しさん
2022/01/15(土) 20:06:03.10ID:gzKdcX6j そんな複雑な理屈じゃなくてただのバカが意固地になってるだけだろ。。
604デフォルトの名無しさん
2022/01/15(土) 21:12:26.97ID:U8m/+TaT >>602
議論が続いてる気になってるんだw
議論が続いてる気になってるんだw
605デフォルトの名無しさん
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の記事はそこも間違ってる
moveの対象も値だぞ
the bookのownershipの解説ページに1つでもmoveの対象がownershipになってる箇所あるか?
https://doc.rust-lang.org/book/ch04-01-what-is-ownership.html
@ITの記事はそこも間違ってる
606デフォルトの名無しさん
2022/01/15(土) 21:37:55.34ID:5CQZXOEN607デフォルトの名無しさん
2022/01/15(土) 21:44:00.10ID:+D8ShBal 俺は中立派なので
「Copyトレイト実装型は値と所有権が複製される」
でも構わないし9割以上の人々にはこれで通じるだろう
あとはどこまでこだわるかだけだ
これ以上その表現は容認できないと続けるならばスレ荒らしと変わらない
「Copyトレイト実装型は値と所有権が複製される」
でも構わないし9割以上の人々にはこれで通じるだろう
あとはどこまでこだわるかだけだ
これ以上その表現は容認できないと続けるならばスレ荒らしと変わらない
608デフォルトの名無しさん
2022/01/15(土) 21:52:50.82ID:MrK/oPRe609デフォルトの名無しさん
2022/01/15(土) 22:04:56.72ID:Ipn+w0vn 一般的に「批判や反対だけならバカでもできる」と言われるので
ここは代替案、修正案、改善案を示してはどうだろうか?
ここは代替案、修正案、改善案を示してはどうだろうか?
610デフォルトの名無しさん
2022/01/15(土) 22:09:17.84ID:im+Hgbd+ 匿名掲示板のやりとりで意見を変える人なんていないしとっとと次の話題に移るに限る
611デフォルトの名無しさん
2022/01/15(土) 22:17:16.04ID:xn0tLhqJ 複製おじさんが必死過ぎて草www
自分の間違いに気づいてもなお苦し紛れの言い訳テラワロスw
自分の間違いに気づいてもなお苦し紛れの言い訳テラワロスw
612デフォルトの名無しさん
2022/01/15(土) 22:29:40.11ID:SUNY4hKu >>597
参照渡しという用語は定義があるからCのポインタ値渡しに使うのは明らかに間違いなわけだが
ダブルポインタの方は正式に仕様で規定されているわけではないが俗語として通用しているな。
俗語だから前提無しに誰にでも通じるわけじゃないというところ注意が必要だが。
参照渡しという用語は定義があるからCのポインタ値渡しに使うのは明らかに間違いなわけだが
ダブルポインタの方は正式に仕様で規定されているわけではないが俗語として通用しているな。
俗語だから前提無しに誰にでも通じるわけじゃないというところ注意が必要だが。
613デフォルトの名無しさん
2022/01/15(土) 22:30:43.34ID:daomKUdj 複製おじさんは自演して複数人を装ういつもの人
いつも間違いを指摘されるが全く反省せず
嘘を書き続けて強弁しつつ自演擁護するのが趣味
C++じいさんと一緒にここに隔離されてる
いつも間違いを指摘されるが全く反省せず
嘘を書き続けて強弁しつつ自演擁護するのが趣味
C++じいさんと一緒にここに隔離されてる
614デフォルトの名無しさん
2022/01/15(土) 22:33:34.89ID:im+Hgbd+ 所有権も複製されるとするとrustの所有権システム破綻するの?
そういう話ではなくて用語の用法に違和感があるという議論だよね?
理解合ってる?
そういう話ではなくて用語の用法に違和感があるという議論だよね?
理解合ってる?
615デフォルトの名無しさん
2022/01/15(土) 22:44:35.60ID:Ipn+w0vn >>614
その通り
俺は既に書いたように
『Copy trait実装の型は「値がcopyされる」そして「新たな所有権が生じる」』だが
これを『値と所有権が複製される』と表現する人がいても特に困らないしRustの理解で破綻することもない
現実にある所有権に照らし合わせると『所有権の複製』という用法に違和感があるだろうという話
その通り
俺は既に書いたように
『Copy trait実装の型は「値がcopyされる」そして「新たな所有権が生じる」』だが
これを『値と所有権が複製される』と表現する人がいても特に困らないしRustの理解で破綻することもない
現実にある所有権に照らし合わせると『所有権の複製』という用法に違和感があるだろうという話
616デフォルトの名無しさん
2022/01/15(土) 23:04:44.12ID:psZvEbv8 >>613
今日いきなり「複製おじさん」とかいう特異な単語を使う人が立て続けに現れたんですがw
今日いきなり「複製おじさん」とかいう特異な単語を使う人が立て続けに現れたんですがw
617デフォルトの名無しさん
2022/01/15(土) 23:42:27.61ID:IhXEZL2k618デフォルトの名無しさん
2022/01/16(日) 10:16:15.91ID:FbMoDLfJ619デフォルトの名無しさん
2022/01/16(日) 10:41:29.77ID:78YeqR3t 一週間バカにされ続けても自ら学ぼうとしないメンタルすごいよな
記事書いたやつも複製おじさんも所有権を変数単位のフラグみたいに認識してるんだよ
Copyなら変数の値をコピーして所有権フラグの値もコピーするイメージ(何か問題でも?w)
現実の所有権のように各所有権が個別リソースに紐づくと考えてないから「所有権を複製」しても問題ないと思っちゃう
所有権のメタファー台無し
記事書いたやつも複製おじさんも所有権を変数単位のフラグみたいに認識してるんだよ
Copyなら変数の値をコピーして所有権フラグの値もコピーするイメージ(何か問題でも?w)
現実の所有権のように各所有権が個別リソースに紐づくと考えてないから「所有権を複製」しても問題ないと思っちゃう
所有権のメタファー台無し
620デフォルトの名無しさん
2022/01/16(日) 10:49:19.61ID:78YeqR3t >>617
>所有権を何だと思ってんの?
この質問に答えられるようなら1週間前に終わってる話
自信がなくバカにされるのが怖くて答えられない
だから自演して印象操作に走ってしまう
それで余計にバカにされちゃう悪循環
>所有権を何だと思ってんの?
この質問に答えられるようなら1週間前に終わってる話
自信がなくバカにされるのが怖くて答えられない
だから自演して印象操作に走ってしまう
それで余計にバカにされちゃう悪循環
621デフォルトの名無しさん
2022/01/16(日) 10:53:40.34ID:zLzfdhk5 Rustスレは
仲介イテレータおじさん
所有権の複製おじさん
算数100点おじさん
の提供でお送りします
仲介イテレータおじさん
所有権の複製おじさん
算数100点おじさん
の提供でお送りします
622デフォルトの名無しさん
2022/01/16(日) 10:57:58.12ID:Ew12sdpw みんなサビサビや!
623デフォルトの名無しさん
2022/01/16(日) 12:33:17.26ID:hGTA6e5C 仲介おじさんと複製おじさんは同一人物でしょ
624デフォルトの名無しさん
2022/01/16(日) 14:09:05.15ID:KLhMVNjz しょーゆー拳!の複製とは・・・所有してない事では・・・?それとも共有?創造イテレーターおじさん。。。
625デフォルトの名無しさん
2022/01/17(月) 22:59:06.94ID:Y2e2eRad Rust 1.58で使えるようになったね
let var = 123.45;
assert_eq!(" 123.450", format!("{var: >10.3}"));
let vec = (5..=9).collect::<Vec<i32>>();
assert_eq!("[5, 6, 7, 8, 9]", format!("{vec:?}"));
let var = 123.45;
assert_eq!(" 123.450", format!("{var: >10.3}"));
let vec = (5..=9).collect::<Vec<i32>>();
assert_eq!("[5, 6, 7, 8, 9]", format!("{vec:?}"));
626デフォルトの名無しさん
2022/01/19(水) 19:54:17.44ID:E5BGSNnr rust学習してるんだけど
コンパイル時検査で並列処理の安全性(可変参照が1つである事)を証明できるんだろうか?
実行時に借用チェックが行われてるという説明があったけどそれは必要なの?
コンパイル時検査で並列処理の安全性(可変参照が1つである事)を証明できるんだろうか?
実行時に借用チェックが行われてるという説明があったけどそれは必要なの?
627デフォルトの名無しさん
2022/01/19(水) 19:59:57.13ID:E5BGSNnr 勘違いかも
この記事実行時にチェックしてるという意味じゃないかもしれない
この記事実行時にチェックしてるという意味じゃないかもしれない
628デフォルトの名無しさん
2022/01/19(水) 21:18:54.23ID:gQYkvdGO629デフォルトの名無しさん
2022/01/19(水) 21:23:52.62ID:tIKoVln/ Rc<RefCell<T>>のように所有権が共有されてる値を変更する場合なんかは実行時チェックしかできない
interior mutability patternと呼ばれるやつはみんなそう
interior mutability patternと呼ばれるやつはみんなそう
630デフォルトの名無しさん
2022/01/19(水) 21:24:20.06ID:tIKoVln/ ガブリンチョ
631デフォルトの名無しさん
2022/01/20(木) 10:26:42.45ID:O3OMKZ6x 実行時に動的に借用のチェックをさせたいという動機は分かるんだが
RefCellっていう名前でそれが表現できてると思えないし
一方で内部可変性を表現してるとも思えないし
そもそも内部可変性と実行時借用規則強制と二つのことが一つの名前になってるし
じゃあどうすべきだったということも思いつかないけど
なんかモヤモヤしてる
RefCellっていう名前でそれが表現できてると思えないし
一方で内部可変性を表現してるとも思えないし
そもそも内部可変性と実行時借用規則強制と二つのことが一つの名前になってるし
じゃあどうすべきだったということも思いつかないけど
なんかモヤモヤしてる
632デフォルトの名無しさん
2022/01/20(木) 12:30:05.06ID:Rdmkjysn Cell<T> は Mutable<T>
RefCell<T> は DynamicMutable<T>
Cellが何かを一度イメージできるようになると
今のネーミングでも困らないから名前が変わることはないと思う
interior mutabilityという名前も最初は分かりにくかった
こっちはまだ変わる可能性あると思う
RefCell<T> は DynamicMutable<T>
Cellが何かを一度イメージできるようになると
今のネーミングでも困らないから名前が変わることはないと思う
interior mutabilityという名前も最初は分かりにくかった
こっちはまだ変わる可能性あると思う
633デフォルトの名無しさん
2022/01/20(木) 12:40:28.40ID:z2ZQEaJV https://internals.rust-lang.org/t/pre-rfc-rename-refcell-to-give-it-a-descriptive-name/533
議論はあったが決定的な代替案があったわけでもないみたいね
議論はあったが決定的な代替案があったわけでもないみたいね
634デフォルトの名無しさん
2022/01/20(木) 12:41:15.85ID:lj0NmUaq あー、なるほど、名前が分かりづらいのはおれが日本人のせいなのかな、とか思ってたけど、やっぱり慣れてないと分かりづらいネーミングだったか
635デフォルトの名無しさん
2022/01/20(木) 13:06:17.45ID:wvPJOB1p そもそもBoxってなんやねん!😡
636デフォルトの名無しさん
2022/01/20(木) 13:18:31.58ID:hnvUf8sg >>631
中身を書き換えられる『セル』という分かりやすい名前
Cellは内部可変がOK
RefCellは内部可変参照がOK
違いが分かりやすいように3種類を持つ構造体を用意
struct S {
a: [i32; 3],
c: Cell<[i32; 3]>,
r: RefCell<[i32; 3]>,
}
let s = S {
a: [1, 2, 3],
c: Cell::new([1, 2, 3]),
r: RefCell::new([1, 2, 3]),
};
// s.a = [4, 5, 6]; // コンパイルエラー (sがmutじゃないため)
// s.a[1] = 5; // コンパイルエラー (sがmutじゃないため)
s.c.set([4, 5, 6]); // OK 内部可変
{
let mut p = s.r.borrow_mut(); // OK 内部可変参照
p[1] = 5;
// このブロックを抜けるとborrow自動返却
}
assert_eq!([1, 2, 3], s.a);
assert_eq!([4, 5, 6], s.c.get());
assert_eq!([1, 5, 3], *s.r.borrow());
中身を書き換えられる『セル』という分かりやすい名前
Cellは内部可変がOK
RefCellは内部可変参照がOK
違いが分かりやすいように3種類を持つ構造体を用意
struct S {
a: [i32; 3],
c: Cell<[i32; 3]>,
r: RefCell<[i32; 3]>,
}
let s = S {
a: [1, 2, 3],
c: Cell::new([1, 2, 3]),
r: RefCell::new([1, 2, 3]),
};
// s.a = [4, 5, 6]; // コンパイルエラー (sがmutじゃないため)
// s.a[1] = 5; // コンパイルエラー (sがmutじゃないため)
s.c.set([4, 5, 6]); // OK 内部可変
{
let mut p = s.r.borrow_mut(); // OK 内部可変参照
p[1] = 5;
// このブロックを抜けるとborrow自動返却
}
assert_eq!([1, 2, 3], s.a);
assert_eq!([4, 5, 6], s.c.get());
assert_eq!([1, 5, 3], *s.r.borrow());
637デフォルトの名無しさん
2022/01/20(木) 13:20:34.04ID:O3OMKZ6x メソッド名が動的←→静的と対称的であったりもしないし・・・
Cell: get, get_mut, set
RefCell: get_mut, borrow, borrow_mut
ただしget_mutはそれぞれ
https://doc.rust-lang.org/std/cell/struct.Cell.html#method.get_mut
> this method expects self to be mutable, which is generally not the case when using a Cell.
https://doc.rust-lang.org/std/cell/struct.RefCell.html#method.get_mut
> this method expects self to be mutable, which is generally not the case when using a RefCell.
とあり通常の用途とやらで考えると
Cell: get, set
RefCell: borrow, borrow_mut
共に"Cell"で内部可変性を表現しつつ
用途はメソッド名で十分わかるしまぁもういいのかこれで
Cell: get, get_mut, set
RefCell: get_mut, borrow, borrow_mut
ただしget_mutはそれぞれ
https://doc.rust-lang.org/std/cell/struct.Cell.html#method.get_mut
> this method expects self to be mutable, which is generally not the case when using a Cell.
https://doc.rust-lang.org/std/cell/struct.RefCell.html#method.get_mut
> this method expects self to be mutable, which is generally not the case when using a RefCell.
とあり通常の用途とやらで考えると
Cell: get, set
RefCell: borrow, borrow_mut
共に"Cell"で内部可変性を表現しつつ
用途はメソッド名で十分わかるしまぁもういいのかこれで
638デフォルトの名無しさん
2022/01/20(木) 13:27:05.24ID:O3OMKZ6x639デフォルトの名無しさん
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にするかってのは要するに構造体のサイズを決定できない場合を想定してるわけよ。
スタックにそういういう動的にサイズが異なる実体をおくことも最近のコンパイラではないこともないが、通常はヒープに置くわ。
文字通りしか考えないで実際の使い方なんか一切考えないやつってのが丸わかりになるって意味では
分かってなさそうなやつにこの辺りについて問いただすってのは割と良いかも。
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 中国国連大使「日本が中国に武力行使すると脅しをかけたのは初めて」 国連事務総長に書簡★4 [♪♪♪★]
- 【芸能】44歳・池脇千鶴、激変ぶりにネット衝撃 「まるで別人…」「変化が凄い!!」の声 [冬月記者★]
- なぜ立花孝志氏の言葉は信じられたのか…"異例の逮捕"が浮き彫りにした「SNSの危険な病理」 [ぐれ★]
- 中国「国連安保理の許可なしに日本攻撃可能」 Xで旧敵国条項に言及… ★15 [BFU★]
- 竹中平蔵氏、万博は大成功だったと持論 批判していた人々にチクリ「反省の弁の一つも聞きたい」 [バイト歴50年★]
- 【MLB】大谷翔平、山本由伸、佐々木朗希WBC出場辞退が確実に! トランプ大統領「ロス五輪最優先」指令 どうなる侍ジャパン [牛丼★]
- 人消えろ
- 風呂入ったあとうんこしたら損した気分になるよな
- 中国政府「私たちが怒っているのは日本国民じゃない」
- (っ◞‸◟c)
- 【愛国者悲報】サナエ、カードゲームで敗北... [856698234]
- 中国「ごめん、色々やりすぎた謝るから和解してほしい」高市首相「舐めてんの?」 [834922174]
