公式
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
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にするかってのは要するに構造体のサイズを決定できない場合を想定してるわけよ。
スタックにそういういう動的にサイズが異なる実体をおくことも最近のコンパイラではないこともないが、通常はヒープに置くわ。
文字通りしか考えないで実際の使い方なんか一切考えないやつってのが丸わかりになるって意味では
分かってなさそうなやつにこの辺りについて問いただすってのは割と良いかも。
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 をいちいち書いてもらわなきゃならないのは
ライブラリとして提供するときにはちょっと汚すぎるなぁ。
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 首相官邸前で「戦争あおるな」 台湾有事巡る答弁に抗議 [蚤の市★]
- 高市首相告白「『なめられない服』を選ぶことに数時間を費やしました」「外交交渉でマウント取れる服、買わなくてはいかんかもなぁ」 [ぐれ★]
- 【高市リスク】立民・小西洋之参院議員「高市総理がとんでもない安全保障オンチで外交オンチ」 [ぐれ★]
- 『DOWNTOWN+』会員数50万人突破で見えてきた 松本人志の“月収4ケタ万円”驚愕収入 [阿弥陀ヶ峰★]
- 【赤坂ライブハウス刺傷】逃走していた自衛官の男(43)を殺人未遂の疑いで逮捕 警視庁 被害女性とは知人関係 [Ailuropoda melanoleuca★]
- 【芸能】永遠の童顔′ウ「光GENJI」53歳になった山本淳一の近影に「若いな?」「元気パワーもらえるよっ」 [湛然★]
- 日本人「憲法9条があれば侵略されないって叫んでた売国左翼のゴミどもは今どんな気分?😂wwwwww」 [441660812]
- 婚活女子(43)「アラフォーのおっさんが『同世代の女はおばさんに見える。10歳くらい歳の離れた女性がいい』と言っててドン引きしてる… [257926174]
- 【悲報】ドンキのドンチキとかいう激安チキン、バズりすぎてガチで売ってないwwwwwwwwwwwwwwwwww
- 安倍晋三「日本よ、世界の真ん中で咲き誇れ」高市早苗「日本外交を咲き誇らせてまいります」 [696684471]
- 女死ね
- 【悲報】東京都民さん、20過ぎてるのに自転車に乗っててて大炎上wwwwwwwwwwww女「いい歳した男で自転車に乗るのは知的障がい者だけだよ? [483447288]
