公式
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 part36
https://mevius.5ch.io/test/read.cgi/tech/1779974768/
ワッチョイスレ
プログラミング言語 Rust 4【ワッチョイ】
https://mevius.5ch.io/test/read.cgi/tech/1514107621/
Rust part37
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2026/07/17(金) 19:12:31.24ID:yl11920u446デフォルトの名無しさん
2026/07/19(日) 22:07:14.39ID:MJtW4T88 300レスもこれで荒らし続けてるのか
ID:GVCMKu1fは嘘吐きの代名詞だなw
ID:GVCMKu1fは嘘吐きの代名詞だなw
447デフォルトの名無しさん
2026/07/19(日) 22:07:52.50ID:MJtW4T88448デフォルトの名無しさん
2026/07/19(日) 22:08:38.04ID:Djh5FEvH >>447
そりゃ「unsafeは別だから!」だろw
そりゃ「unsafeは別だから!」だろw
449デフォルトの名無しさん
2026/07/19(日) 22:09:20.59ID:NI8kFB3Y 「どんな寿命の参照でも」「どんな値でも」「他の関数から返ってきたものでも」「関数から必ず返せる」 (>>159)
「任意のライフタイムで必ず成立する」(>>183)
「Rustでは付加条件なく必ず成り立ちます」(>>214)
↓
thread::spawn() はクロージャ越しに受け取ってるから引数だけど違うよね……やっぱなし!
クロージャが返してるからセーフ……これもなし!
↓
実は関数の引数で受け取るコードがコンパイル通ったらってことでした! ほら、rustcでコンパイルが通ったら成り立ってるでしょ!
あ、あとunsafeは別だから!
↓
やっぱり標準ライブラリの関数が勝手に「使えるけど使えなくしまーす」って意地悪で言ってるんです!
↓
そんなことないです! 固有の事情! そう、固有の事情です!
これの納得いく説明を早くしてくれよww
「任意のライフタイムで必ず成立する」(>>183)
「Rustでは付加条件なく必ず成り立ちます」(>>214)
↓
thread::spawn() はクロージャ越しに受け取ってるから引数だけど違うよね……やっぱなし!
クロージャが返してるからセーフ……これもなし!
↓
実は関数の引数で受け取るコードがコンパイル通ったらってことでした! ほら、rustcでコンパイルが通ったら成り立ってるでしょ!
あ、あとunsafeは別だから!
↓
やっぱり標準ライブラリの関数が勝手に「使えるけど使えなくしまーす」って意地悪で言ってるんです!
↓
そんなことないです! 固有の事情! そう、固有の事情です!
これの納得いく説明を早くしてくれよww
450デフォルトの名無しさん
2026/07/19(日) 22:09:54.58ID:1BBaabLV >>449
ひでえなあw
ひでえなあw
451デフォルトの名無しさん
2026/07/19(日) 22:10:17.20ID:GVCMKu1f452デフォルトの名無しさん
2026/07/19(日) 22:11:11.81ID:zr2PrtJM 「どんな寿命の参照でも」「どんな値でも」「他の関数から返ってきたものでも」「関数から必ず返せる」 (>>159)
「任意のライフタイムで必ず成立する」(>>183)
「Rustでは付加条件なく必ず成り立ちます」(>>214)
↓
thread::spawn() はクロージャ越しに受け取ってるから引数だけど違うよね……やっぱなし!
クロージャが返してるからセーフ……これもなし!
↓
実は関数の引数で受け取るコードがコンパイル通ったらってことでした! ほら、rustcでコンパイルが通ったら成り立ってるでしょ!
あ、あとunsafeは別だから!
↓
やっぱり標準ライブラリの関数が勝手に「使えるけど使えなくしまーす」って意地悪で言ってるんです!
コンパイル通ったらッて条件も残ってます!
↓
そんなことないです! 固有の事情があるんです! そう、固有の事情です!
ちょっときれいに整理してみた
「任意のライフタイムで必ず成立する」(>>183)
「Rustでは付加条件なく必ず成り立ちます」(>>214)
↓
thread::spawn() はクロージャ越しに受け取ってるから引数だけど違うよね……やっぱなし!
クロージャが返してるからセーフ……これもなし!
↓
実は関数の引数で受け取るコードがコンパイル通ったらってことでした! ほら、rustcでコンパイルが通ったら成り立ってるでしょ!
あ、あとunsafeは別だから!
↓
やっぱり標準ライブラリの関数が勝手に「使えるけど使えなくしまーす」って意地悪で言ってるんです!
コンパイル通ったらッて条件も残ってます!
↓
そんなことないです! 固有の事情があるんです! そう、固有の事情です!
ちょっときれいに整理してみた
453デフォルトの名無しさん
2026/07/19(日) 22:11:44.61ID:zr2PrtJM454デフォルトの名無しさん
2026/07/19(日) 22:12:08.90ID:GVCMKu1f >>452
捏造しだしたら君の負け
捏造しだしたら君の負け
455デフォルトの名無しさん
2026/07/19(日) 22:12:24.24ID:GVCMKu1f >>453
どれですか?
どれですか?
456デフォルトの名無しさん
2026/07/19(日) 22:12:53.75ID:K5dJ0PBv457デフォルトの名無しさん
2026/07/19(日) 22:13:27.57ID:Hr73tPpm458デフォルトの名無しさん
2026/07/19(日) 22:14:00.95ID:3qV+/qVC 「どんな寿命の参照でも」「どんな値でも」「他の関数から返ってきたものでも」「関数から必ず返せる」 (>>159)
「任意のライフタイムで必ず成立する」(>>183)
「Rustでは付加条件なく必ず成り立ちます」(>>214)
↓
thread::spawn() はクロージャ越しに受け取ってるから引数だけど違うよね……やっぱなし!
クロージャが返してるからセーフ……これもなし!
↓
実は関数の引数で受け取るコードがコンパイル通ったらってことでした! ほら、rustcでコンパイルが通ったら成り立ってるでしょ!
あ、あとunsafeは別だから!
↓
やっぱり標準ライブラリの関数が勝手に「使えるけど使えなくしまーす」って意地悪で言ってるんです!
コンパイル通ったらッて条件も残ってます!
↓
そんなことないです! 固有の事情があるんです! そう、固有の事情です!
早くこれに納得いく説明をしてくれよww
「任意のライフタイムで必ず成立する」(>>183)
「Rustでは付加条件なく必ず成り立ちます」(>>214)
↓
thread::spawn() はクロージャ越しに受け取ってるから引数だけど違うよね……やっぱなし!
クロージャが返してるからセーフ……これもなし!
↓
実は関数の引数で受け取るコードがコンパイル通ったらってことでした! ほら、rustcでコンパイルが通ったら成り立ってるでしょ!
あ、あとunsafeは別だから!
↓
やっぱり標準ライブラリの関数が勝手に「使えるけど使えなくしまーす」って意地悪で言ってるんです!
コンパイル通ったらッて条件も残ってます!
↓
そんなことないです! 固有の事情があるんです! そう、固有の事情です!
早くこれに納得いく説明をしてくれよww
459デフォルトの名無しさん
2026/07/19(日) 22:14:42.08ID:GVCMKu1f460デフォルトの名無しさん
2026/07/19(日) 22:14:50.31ID:3qV+/qVC >>451
複おじ理論「thread::spawn() を使う奴はRustアンチ!」
複おじ理論「thread::spawn() を使う奴はRustアンチ!」
461デフォルトの名無しさん
2026/07/19(日) 22:15:16.97ID:jnkqq9MC >>459
「実は関数の引数で受け取るコードがコンパイル通ったらってことでした! ほら、rustcでコンパイルが通ったら成り立ってるでしょ!」w
「実は関数の引数で受け取るコードがコンパイル通ったらってことでした! ほら、rustcでコンパイルが通ったら成り立ってるでしょ!」w
462デフォルトの名無しさん
2026/07/19(日) 22:15:25.36ID:GVCMKu1f >>457
thread::spawn()も受け取った参照を返せます
thread::spawn()も受け取った参照を返せます
463デフォルトの名無しさん
2026/07/19(日) 22:15:43.38ID:+Fv0Z1+W >>459
「どんな寿命の参照でも」「どんな値でも」「他の関数から返ってきたものでも」「関数から必ず返せる」 (>>159)
「任意のライフタイムで必ず成立する」(>>183)
「Rustでは付加条件なく必ず成り立ちます」(>>214)
↓
thread::spawn() はクロージャ越しに受け取ってるから引数だけど違うよね……やっぱなし!
クロージャが返してるからセーフ……これもなし!
↓
実は関数の引数で受け取るコードがコンパイル通ったらってことでした! ほら、rustcでコンパイルが通ったら成り立ってるでしょ!
あ、あとunsafeは別だから!
↓
やっぱり標準ライブラリの関数が勝手に「使えるけど使えなくしまーす」って意地悪で言ってるんです!
コンパイル通ったらッて条件も残ってます!
↓
そんなことないです! 固有の事情があるんです! そう、固有の事情です!
早くこれに納得いく説明をしてくれよwww
「どんな寿命の参照でも」「どんな値でも」「他の関数から返ってきたものでも」「関数から必ず返せる」 (>>159)
「任意のライフタイムで必ず成立する」(>>183)
「Rustでは付加条件なく必ず成り立ちます」(>>214)
↓
thread::spawn() はクロージャ越しに受け取ってるから引数だけど違うよね……やっぱなし!
クロージャが返してるからセーフ……これもなし!
↓
実は関数の引数で受け取るコードがコンパイル通ったらってことでした! ほら、rustcでコンパイルが通ったら成り立ってるでしょ!
あ、あとunsafeは別だから!
↓
やっぱり標準ライブラリの関数が勝手に「使えるけど使えなくしまーす」って意地悪で言ってるんです!
コンパイル通ったらッて条件も残ってます!
↓
そんなことないです! 固有の事情があるんです! そう、固有の事情です!
早くこれに納得いく説明をしてくれよwww
464デフォルトの名無しさん
2026/07/19(日) 22:16:26.77ID:+Fv0Z1+W465デフォルトの名無しさん
2026/07/19(日) 22:17:54.28ID:5Y4SYvdz 「付加条件なく必ず成り立ちます」w
466デフォルトの名無しさん
2026/07/19(日) 22:19:58.42ID:GVCMKu1f467デフォルトの名無しさん
2026/07/19(日) 22:20:02.56ID:c6ZpTEik468デフォルトの名無しさん
2026/07/19(日) 22:20:42.70ID:c6ZpTEik >>466
「どんな寿命の参照でも」「どんな値でも」「他の関数から返ってきたものでも」「任意のライフタイムで必ず成立する」「付加条件なく必ず成り立ちます」
この条件で返せるって証明してくれよ
お前が言ったんだからさ、「受け取る参照を制限していますが」なんて逃げはいらないんだわ
「どんな寿命の参照でも」「どんな値でも」「他の関数から返ってきたものでも」「任意のライフタイムで必ず成立する」「付加条件なく必ず成り立ちます」
この条件で返せるって証明してくれよ
お前が言ったんだからさ、「受け取る参照を制限していますが」なんて逃げはいらないんだわ
469デフォルトの名無しさん
2026/07/19(日) 22:21:35.77ID:XResoogo 「どんな寿命の参照でも」「どんな値でも」「他の関数から返ってきたものでも」「関数から必ず返せる」 (>>159)
「任意のライフタイムで必ず成立する」(>>183)
「Rustでは付加条件なく必ず成り立ちます」(>>214)
↓
thread::spawn() はクロージャ越しに受け取ってるから引数だけど違うよね……やっぱなし!
クロージャが返してるからセーフ……これもなし!
↓
実は関数の引数で受け取るコードがコンパイル通ったらってことでした! ほら、rustcでコンパイルが通ったら成り立ってるでしょ!
あ、あとunsafeは別だから!
↓
やっぱり標準ライブラリの関数が勝手に「使えるけど使えなくしまーす」って意地悪で言ってるんです!
コンパイル通ったらって条件も残ってます!
↓
そんなことないです! 固有の事情があるんです! そう、固有の事情です!
受け取る参照を制限しているから、受け取ったら返せるんです!
早くこれに納得いく説明をしてくれよwww
「任意のライフタイムで必ず成立する」(>>183)
「Rustでは付加条件なく必ず成り立ちます」(>>214)
↓
thread::spawn() はクロージャ越しに受け取ってるから引数だけど違うよね……やっぱなし!
クロージャが返してるからセーフ……これもなし!
↓
実は関数の引数で受け取るコードがコンパイル通ったらってことでした! ほら、rustcでコンパイルが通ったら成り立ってるでしょ!
あ、あとunsafeは別だから!
↓
やっぱり標準ライブラリの関数が勝手に「使えるけど使えなくしまーす」って意地悪で言ってるんです!
コンパイル通ったらって条件も残ってます!
↓
そんなことないです! 固有の事情があるんです! そう、固有の事情です!
受け取る参照を制限しているから、受け取ったら返せるんです!
早くこれに納得いく説明をしてくれよwww
470デフォルトの名無しさん
2026/07/19(日) 22:21:39.57ID:GVCMKu1f 早く反例コードを出してくださいよ
471デフォルトの名無しさん
2026/07/19(日) 22:23:05.98ID:r4QFGOjn472デフォルトの名無しさん
2026/07/19(日) 22:23:43.09ID:r4QFGOjn473デフォルトの名無しさん
2026/07/19(日) 22:24:28.65ID:GVCMKu1f474デフォルトの名無しさん
2026/07/19(日) 22:25:04.76ID:lSihsm4A 「どんな寿命の参照でも」「どんな値でも」「他の関数から返ってきたものでも」「関数から必ず返せる」 (>>159)
「任意のライフタイムで必ず成立する」(>>183)
「Rustでは付加条件なく必ず成り立ちます」(>>214)
↓
thread::spawn() はクロージャ越しに受け取ってるから引数だけど違うよね……やっぱなし!
クロージャが返してるからセーフ……これもなし!
↓
実は関数の引数で受け取るコードがコンパイル通ったらってことでした! ほら、rustcでコンパイルが通ったら成り立ってるでしょ!
あ、あとunsafeは別だから!
↓
やっぱり標準ライブラリの関数が勝手に「使えるけど使えなくしまーす」って意地悪で言ってるんです!
コンパイル通ったらって条件も残ってます!
↓
そんなことないです! 固有の事情があるんです! そう、固有の事情です!
受け取る参照を制限しているから、受け取ったら返せるんです!
早くこれに納得いく説明をしてくれよww
下2つは std::thread::Builder::spawn_unchecked() では成り立たないぞwww
「任意のライフタイムで必ず成立する」(>>183)
「Rustでは付加条件なく必ず成り立ちます」(>>214)
↓
thread::spawn() はクロージャ越しに受け取ってるから引数だけど違うよね……やっぱなし!
クロージャが返してるからセーフ……これもなし!
↓
実は関数の引数で受け取るコードがコンパイル通ったらってことでした! ほら、rustcでコンパイルが通ったら成り立ってるでしょ!
あ、あとunsafeは別だから!
↓
やっぱり標準ライブラリの関数が勝手に「使えるけど使えなくしまーす」って意地悪で言ってるんです!
コンパイル通ったらって条件も残ってます!
↓
そんなことないです! 固有の事情があるんです! そう、固有の事情です!
受け取る参照を制限しているから、受け取ったら返せるんです!
早くこれに納得いく説明をしてくれよww
下2つは std::thread::Builder::spawn_unchecked() では成り立たないぞwww
475デフォルトの名無しさん
2026/07/19(日) 22:25:52.00ID:GVCMKu1f476デフォルトの名無しさん
2026/07/19(日) 22:26:01.71ID:HI6IurVy477デフォルトの名無しさん
2026/07/19(日) 22:26:27.39ID:BHraHSW4 >>475
どう見ても満たしとるわマヌケ
どう見ても満たしとるわマヌケ
478デフォルトの名無しさん
2026/07/19(日) 22:27:25.01ID:GVCMKu1f479デフォルトの名無しさん
2026/07/19(日) 22:27:55.87ID:F0MnotzK >>473
std::thread::Builder::spawn_unchecked() で任意の参照を受け取って返せるって言うなら、当然それを受け取って返して読めるコードができるってことだよな
これやってみようぜww
動かなかったらID:GVCMKu1fは嘘吐きな
std::thread::Builder::spawn_unchecked() で任意の参照を受け取って返せるって言うなら、当然それを受け取って返して読めるコードができるってことだよな
これやってみようぜww
動かなかったらID:GVCMKu1fは嘘吐きな
480デフォルトの名無しさん
2026/07/19(日) 22:28:23.95ID:GVCMKu1f >>477
前提条件「それを関数の引数で受け取ったら」を満たしてない
前提条件「それを関数の引数で受け取ったら」を満たしてない
481デフォルトの名無しさん
2026/07/19(日) 22:28:44.70ID:7X0+qiIb >>478
嘘吐きは何とやらと言うけど、ここまで堂々とバレてる嘘を吐けるのは逆に才能だなw
嘘吐きは何とやらと言うけど、ここまで堂々とバレてる嘘を吐けるのは逆に才能だなw
482デフォルトの名無しさん
2026/07/19(日) 22:29:32.31ID:7X0+qiIb >>480
thread::spawn() はクロージャ越しに受け取ってるから引数だけど違うって言い訳して逃げようとした時点でその解釈は成り立たないんだわ
thread::spawn() はクロージャ越しに受け取ってるから引数だけど違うって言い訳して逃げようとした時点でその解釈は成り立たないんだわ
483デフォルトの名無しさん
2026/07/19(日) 22:29:54.38ID:GVCMKu1f484デフォルトの名無しさん
2026/07/19(日) 22:30:30.82ID:GVCMKu1f >>482
そんな発言していない
そんな発言していない
485デフォルトの名無しさん
2026/07/19(日) 22:32:55.52ID:XbKlswJJ まぁ詰まるところは言い回しの問題なんだろうけどさ
486デフォルトの名無しさん
2026/07/19(日) 22:35:37.37ID:BeY+J4Fb >>484
嘘吐いてもバレるのに……
嘘吐いてもバレるのに……
487デフォルトの名無しさん
2026/07/19(日) 22:36:11.37ID:GVCMKu1f >>486
その書き込みを持ってこいよ
その書き込みを持ってこいよ
488デフォルトの名無しさん
2026/07/19(日) 22:36:50.30ID:7jkxblcL ちなみに>>184で書いた「弱参照を受け取って通常の参照にして返す関数」も普通に書けるからね
「必ず返せる」はもちろん成立しないけれど
unsafe fn get_ref<T>(weak: &Weak<T>) -> &T {
unsafe { &*weak.as_ptr() }
}
「必ず返せる」はもちろん成立しないけれど
unsafe fn get_ref<T>(weak: &Weak<T>) -> &T {
unsafe { &*weak.as_ptr() }
}
489デフォルトの名無しさん
2026/07/19(日) 22:38:12.03ID:BeY+J4Fb >>483
たまたまメモリの領域が生きてただけだろ
たまたまメモリの領域が生きてただけだろ
490デフォルトの名無しさん
2026/07/19(日) 22:39:23.63ID:GVCMKu1f491デフォルトの名無しさん
2026/07/19(日) 22:40:16.24ID:GVCMKu1f >>489
unsafe関数だからそれは許されるのがRust
unsafe関数だからそれは許されるのがRust
492デフォルトの名無しさん
2026/07/19(日) 22:43:01.84ID:+EgGKzCN >>491
おい、お前の言ってる条件満たしてるのに動かねえぞ
use std::thread;
use std::time::Duration;
fn main() {
let handle;
{
let mut local_data = 100;
let mut local_data_ref = &mut local_data;
println!("スレッド内の値: {}", local_data);
unsafe {
handle = thread::Builder::new()
.name("dangerous_thread".to_string())
.spawn_unchecked(move || {
thread::sleep(Duration::from_millis(50));
*local_data_ref = 200;
println!("スレッド内の値: {}", local_data_ref);
})
.unwrap();
}
}
handle.join().unwrap();
}
おい、お前の言ってる条件満たしてるのに動かねえぞ
use std::thread;
use std::time::Duration;
fn main() {
let handle;
{
let mut local_data = 100;
let mut local_data_ref = &mut local_data;
println!("スレッド内の値: {}", local_data);
unsafe {
handle = thread::Builder::new()
.name("dangerous_thread".to_string())
.spawn_unchecked(move || {
thread::sleep(Duration::from_millis(50));
*local_data_ref = 200;
println!("スレッド内の値: {}", local_data_ref);
})
.unwrap();
}
}
handle.join().unwrap();
}
493デフォルトの名無しさん
2026/07/19(日) 22:45:23.06ID:J5fxakd4 まだ参照返してもいないのに条件満たしてかつ動かないのおもろいな
494デフォルトの名無しさん
2026/07/19(日) 22:48:29.00ID:CA6RNpNI495デフォルトの名無しさん
2026/07/19(日) 22:52:26.39ID:Q7jr2sjS 不要なmutがあるし色々雑なコードだけど反例としては十分だな
496デフォルトの名無しさん
2026/07/19(日) 22:53:19.34ID:GVCMKu1f497デフォルトの名無しさん
2026/07/19(日) 22:57:26.40ID:Q7jr2sjS >>496 ごめんごめん、手打ちしたのが良くなかったな
use std::thread;
use std::time::Duration;
fn main() {
let handle;
{
let mut local_data = 100;
println!("スレッド内の値: {}", local_data);
let local_data_ref = &mut local_data;
unsafe {
handle = thread::Builder::new()
.name("dangerous_thread".to_string())
.spawn_unchecked(move || {
thread::sleep(Duration::from_millis(50));
*local_data_ref = 200;
println!("スレッド内の値: {}", local_data_ref);
})
.unwrap();
}
}
handle.join().unwrap();
}
これでクラッシュした理由を教えてくれや
use std::thread;
use std::time::Duration;
fn main() {
let handle;
{
let mut local_data = 100;
println!("スレッド内の値: {}", local_data);
let local_data_ref = &mut local_data;
unsafe {
handle = thread::Builder::new()
.name("dangerous_thread".to_string())
.spawn_unchecked(move || {
thread::sleep(Duration::from_millis(50));
*local_data_ref = 200;
println!("スレッド内の値: {}", local_data_ref);
})
.unwrap();
}
}
handle.join().unwrap();
}
これでクラッシュした理由を教えてくれや
498デフォルトの名無しさん
2026/07/19(日) 23:00:33.97ID:9N1Mvpqx >>497
どう見ても未定義動作です本当にありがとうございます
どう見ても未定義動作です本当にありがとうございます
499デフォルトの名無しさん
2026/07/19(日) 23:02:12.84ID:gOfZIriO500デフォルトの名無しさん
2026/07/19(日) 23:03:42.88ID:d0lr3qJ1 ちゃんとコンパイルは通るな
501デフォルトの名無しさん
2026/07/19(日) 23:05:01.54ID:eHBdU/kr Windowsでは動くな
未定義動作らしくなってきた
未定義動作らしくなってきた
502デフォルトの名無しさん
2026/07/19(日) 23:06:23.23ID:GVCMKu1f >>497
こちらでは以下が表示されて正常終了するが
スレッド内の値: 100
スレッド内の値: 200
動かないこともあるだろうね
unsafe関数を使う時はそのSafety条件を守ることがRustでは必須
こちらでは以下が表示されて正常終了するが
スレッド内の値: 100
スレッド内の値: 200
動かないこともあるだろうね
unsafe関数を使う時はそのSafety条件を守ることがRustでは必須
503デフォルトの名無しさん
2026/07/19(日) 23:08:41.34ID:EPUrWbSR504デフォルトの名無しさん
2026/07/19(日) 23:10:37.48ID:GVCMKu1f505デフォルトの名無しさん
2026/07/19(日) 23:11:11.06ID:+39tuTEu506デフォルトの名無しさん
2026/07/19(日) 23:13:19.88ID:d6fluU/x >>497
地味に無駄mut外されて洗練されてんの笑う
地味に無駄mut外されて洗練されてんの笑う
507デフォルトの名無しさん
2026/07/19(日) 23:14:11.45ID:d6fluU/x ただ、上は「スレッド外の値」やな
508デフォルトの名無しさん
2026/07/19(日) 23:25:15.72ID:R2LtKg8E use std::thread;
use std::time::Duration;
fn main() {
let handle;
let mut local_data = 100;
println!("スレッド外の値: {}", local_data);
let local_data_ref = &mut local_data;
unsafe {
handle = thread::Builder::new()
.name("dangerous_thread".to_string())
.spawn_unchecked(move || {
thread::sleep(Duration::from_millis(500));
println!("スレッド内の値: {}", local_data_ref);
*local_data_ref = 200;
println!("スレッド内の値: {}", local_data_ref);
})
.unwrap();
}
}
println!("local_data消失");
handle.join().unwrap();
}
何が起こってるかわかりやすくした
これで動いてしまった場合でも未定義動作だとわかる
use std::time::Duration;
fn main() {
let handle;
let mut local_data = 100;
println!("スレッド外の値: {}", local_data);
let local_data_ref = &mut local_data;
unsafe {
handle = thread::Builder::new()
.name("dangerous_thread".to_string())
.spawn_unchecked(move || {
thread::sleep(Duration::from_millis(500));
println!("スレッド内の値: {}", local_data_ref);
*local_data_ref = 200;
println!("スレッド内の値: {}", local_data_ref);
})
.unwrap();
}
}
println!("local_data消失");
handle.join().unwrap();
}
何が起こってるかわかりやすくした
これで動いてしまった場合でも未定義動作だとわかる
509デフォルトの名無しさん
2026/07/19(日) 23:25:32.10ID:2iSHfWbm mut汚染は鉄板だけどunsafe使うのは趣旨に反するよな
Cellとか使うと気持ち悪くできそうだけど複雑になる
fn foo<'a, T, F>(f: F, x: &'a mut T, y: &'a mut T) -> &'a mut T
where
F: FnOnce(&'a mut T, &'a mut T) -> bool
{
if f(x, y) { x } else { y }
}
Cellとか使うと気持ち悪くできそうだけど複雑になる
fn foo<'a, T, F>(f: F, x: &'a mut T, y: &'a mut T) -> &'a mut T
where
F: FnOnce(&'a mut T, &'a mut T) -> bool
{
if f(x, y) { x } else { y }
}
510デフォルトの名無しさん
2026/07/19(日) 23:26:27.45ID:GVCMKu1f >>497が反例になってない証拠は
簡略化したこのコードをみるとわかる
fn main() {
let handle;
{
let mut local_data = 100;
println!("スレッド内の値: {}", local_data);
let local_data_ref = &mut local_data;
{
handle = Some(local_data_ref);
}
}
handle.unwrap();
}
スコープルールに反しているだけにすぎない
簡略化したこのコードをみるとわかる
fn main() {
let handle;
{
let mut local_data = 100;
println!("スレッド内の値: {}", local_data);
let local_data_ref = &mut local_data;
{
handle = Some(local_data_ref);
}
}
handle.unwrap();
}
スコープルールに反しているだけにすぎない
511デフォルトの名無しさん
2026/07/19(日) 23:27:18.23ID:bxzaHrV9 条件決めた奴が spawn_unchecked() でも成り立つと明言している以上趣旨には反してない
512デフォルトの名無しさん
2026/07/19(日) 23:28:30.71ID:GsL396XN >>510
スレッド立ててない時点で簡略化できてないぞ
スレッド立ててない時点で簡略化できてないぞ
513デフォルトの名無しさん
2026/07/19(日) 23:28:33.09ID:GVCMKu1f514デフォルトの名無しさん
2026/07/19(日) 23:29:11.11ID:MI3knhkj515デフォルトの名無しさん
2026/07/19(日) 23:29:32.14ID:MI3knhkj >>513
また新しい嘘が始まったな
また新しい嘘が始まったな
516デフォルトの名無しさん
2026/07/19(日) 23:29:43.26ID:GVCMKu1f517デフォルトの名無しさん
2026/07/19(日) 23:30:23.43ID:MI3knhkj >>516
お前の書いたコードじゃなくて元のコードの話してるんだけど
お前の書いたコードじゃなくて元のコードの話してるんだけど
518デフォルトの名無しさん
2026/07/19(日) 23:30:57.41ID:GVCMKu1f519デフォルトの名無しさん
2026/07/19(日) 23:30:58.78ID:UGHA3+tz 勝手に名前だけ似せた関係ないコードにすり替えて話してるのヤバすぎるだろ
520デフォルトの名無しさん
2026/07/19(日) 23:31:39.85ID:UGHA3+tz >>518
お前の書いた妄想コードはhandle = Some(local_data_ref);がある部分のスコープが元のコードと一致してない
お前の書いた妄想コードはhandle = Some(local_data_ref);がある部分のスコープが元のコードと一致してない
521デフォルトの名無しさん
2026/07/19(日) 23:31:44.43ID:GVCMKu1f >>517
元のコードもhandleとlocal_dataのスコープが食い違っている
元のコードもhandleとlocal_dataのスコープが食い違っている
522デフォルトの名無しさん
2026/07/19(日) 23:33:29.24ID:uxNzkEWb >>510のコードはthread::scopeを使った場合にしか起きないスコープになってる
523デフォルトの名無しさん
2026/07/19(日) 23:33:59.63ID:L0YtsTIP >>521
スレッドとスコープの見わけもつかんのかたわけ
スレッドとスコープの見わけもつかんのかたわけ
524デフォルトの名無しさん
2026/07/19(日) 23:39:08.66ID:GVCMKu1f 本質部分だけ取り出すと理解できない人のために
>>497から一番外側の不要な鍵カッコ2つを取り外すして参照を返すとこうなる
use std::thread;
use std::time::Duration;
fn main() {
let handle;
let mut local_data = 100;
println!("スレッド内の値: {}", local_data);
let local_data_ref = &mut local_data;
unsafe {
handle = thread::Builder::new()
.name("dangerous_thread".to_string())
.spawn_unchecked(move || {
thread::sleep(Duration::from_millis(50));
*local_data_ref = 200;
println!("スレッド内の値: {}", local_data_ref);
local_data_ref
})
.unwrap();
}
let result = handle.join().unwrap();
println!("result: {result}");
}
こうなる
result: 200
>>497から一番外側の不要な鍵カッコ2つを取り外すして参照を返すとこうなる
use std::thread;
use std::time::Duration;
fn main() {
let handle;
let mut local_data = 100;
println!("スレッド内の値: {}", local_data);
let local_data_ref = &mut local_data;
unsafe {
handle = thread::Builder::new()
.name("dangerous_thread".to_string())
.spawn_unchecked(move || {
thread::sleep(Duration::from_millis(50));
*local_data_ref = 200;
println!("スレッド内の値: {}", local_data_ref);
local_data_ref
})
.unwrap();
}
let result = handle.join().unwrap();
println!("result: {result}");
}
こうなる
result: 200
525デフォルトの名無しさん
2026/07/19(日) 23:39:35.33ID:Je9ZT3pN どれだけ曲解したところで handle = Some(local_data_ref); がある部分のスコープが local_data より先に終わってる時点でスレッドを理解してないとしか言えない
526デフォルトの名無しさん
2026/07/19(日) 23:40:36.64ID:xeU/443Z527デフォルトの名無しさん
2026/07/19(日) 23:41:25.28ID:pTqrx0Og >>524
お前は一度くらい嘘を吐かずに話せないのか
お前は一度くらい嘘を吐かずに話せないのか
528デフォルトの名無しさん
2026/07/19(日) 23:42:07.87ID:pTqrx0Og >>524
複オジ理論「不要なスコープを取り除いたらスコープが壊れてるんだ!」
複オジ理論「不要なスコープを取り除いたらスコープが壊れてるんだ!」
529デフォルトの名無しさん
2026/07/19(日) 23:42:38.37ID:GVCMKu1f530デフォルトの名無しさん
2026/07/19(日) 23:43:28.52ID:GVCMKu1f >>526
スコープ外に参照を持ち出せないのはRustの常識
スコープ外に参照を持ち出せないのはRustの常識
531デフォルトの名無しさん
2026/07/19(日) 23:43:33.36ID:lrKY9Hhf532デフォルトの名無しさん
2026/07/19(日) 23:44:10.12ID:9U0PzD1P533デフォルトの名無しさん
2026/07/19(日) 23:44:45.44ID:VYuhTwcT >>530
じゃあRustのコンパイラは無能だからスコープが壊れててもコンパイルを通すと?w
じゃあRustのコンパイラは無能だからスコープが壊れててもコンパイルを通すと?w
534デフォルトの名無しさん
2026/07/19(日) 23:45:13.52ID:Do2V15MU 複オジなんてどうせ隠れアンチだからな
535デフォルトの名無しさん
2026/07/19(日) 23:45:58.75ID:jmKhuzp4536デフォルトの名無しさん
2026/07/19(日) 23:47:10.55ID:GVCMKu1f537デフォルトの名無しさん
2026/07/19(日) 23:47:11.26ID:2YvNcuM/ >>530
どう見てもスコープ内で渡されてますねえ
use std::thread;
use std::time::Duration;
fn main() {
let handle;
{
let mut local_data = 100;
println!("スレッド外の値: {}", local_data);
let local_data_ref = &mut local_data;
unsafe {
handle = thread::Builder::new()
.name("dangerous_thread".to_string())
.spawn_unchecked(move || {
thread::sleep(Duration::from_millis(500));
println!("スレッド内の値: {}", local_data_ref);
*local_data_ref = 200;
println!("スレッド内の値: {}", local_data_ref);
})
.unwrap();
}
}
println!("local_data消失");
handle.join().unwrap();
}
どう見てもスコープ内で渡されてますねえ
use std::thread;
use std::time::Duration;
fn main() {
let handle;
{
let mut local_data = 100;
println!("スレッド外の値: {}", local_data);
let local_data_ref = &mut local_data;
unsafe {
handle = thread::Builder::new()
.name("dangerous_thread".to_string())
.spawn_unchecked(move || {
thread::sleep(Duration::from_millis(500));
println!("スレッド内の値: {}", local_data_ref);
*local_data_ref = 200;
println!("スレッド内の値: {}", local_data_ref);
})
.unwrap();
}
}
println!("local_data消失");
handle.join().unwrap();
}
538デフォルトの名無しさん
2026/07/19(日) 23:48:41.40ID:A/rr6nbt >>536
「どんな寿命の参照でも」「どんな値でも」「他の関数から返ってきたものでも」「関数から必ず返せる」 (>>159)
「任意のライフタイムで必ず成立する」(>>183)
「Rustでは付加条件なく必ず成り立ちます」(>>214)
↓
thread::spawn() はクロージャ越しに受け取ってるから引数だけど違うよね……やっぱなし!
クロージャが返してるからセーフ……これもなし!
↓
実は関数の引数で受け取るコードがコンパイル通ったらってことでした! ほら、rustcでコンパイルが通ったら成り立ってるでしょ!
あ、あとunsafeは別だから!
↓
やっぱり標準ライブラリの関数が勝手に「使えるけど使えなくしまーす」って意地悪で言ってるんです!
コンパイル通ったらって条件も残ってます!
↓
そんなことないです! 固有の事情があるんです! そう、固有の事情です!
受け取る参照を制限しているから、受け取ったら返せるんです!
↓
やっぱり違う! 俺の書いた見た目の似たコードではスコープから外れてるから違うんだ!
早くこれに納得いく説明をしてくれよww
「どんな寿命の参照でも」「どんな値でも」「他の関数から返ってきたものでも」「関数から必ず返せる」 (>>159)
「任意のライフタイムで必ず成立する」(>>183)
「Rustでは付加条件なく必ず成り立ちます」(>>214)
↓
thread::spawn() はクロージャ越しに受け取ってるから引数だけど違うよね……やっぱなし!
クロージャが返してるからセーフ……これもなし!
↓
実は関数の引数で受け取るコードがコンパイル通ったらってことでした! ほら、rustcでコンパイルが通ったら成り立ってるでしょ!
あ、あとunsafeは別だから!
↓
やっぱり標準ライブラリの関数が勝手に「使えるけど使えなくしまーす」って意地悪で言ってるんです!
コンパイル通ったらって条件も残ってます!
↓
そんなことないです! 固有の事情があるんです! そう、固有の事情です!
受け取る参照を制限しているから、受け取ったら返せるんです!
↓
やっぱり違う! 俺の書いた見た目の似たコードではスコープから外れてるから違うんだ!
早くこれに納得いく説明をしてくれよww
539デフォルトの名無しさん
2026/07/19(日) 23:48:47.51ID:im9d/ITc >>536
「どんな寿命の参照でも」「どんな値でも」「他の関数から返ってきたものでも」「関数から必ず返せる」 (>>159)
「任意のライフタイムで必ず成立する」(>>183)
「Rustでは付加条件なく必ず成り立ちます」(>>214)
↓
thread::spawn() はクロージャ越しに受け取ってるから引数だけど違うよね……やっぱなし!
クロージャが返してるからセーフ……これもなし!
↓
実は関数の引数で受け取るコードがコンパイル通ったらってことでした! ほら、rustcでコンパイルが通ったら成り立ってるでしょ!
あ、あとunsafeは別だから!
↓
やっぱり標準ライブラリの関数が勝手に「使えるけど使えなくしまーす」って意地悪で言ってるんです!
コンパイル通ったらって条件も残ってます!
↓
そんなことないです! 固有の事情があるんです! そう、固有の事情です!
受け取る参照を制限しているから、受け取ったら返せるんです!
↓
やっぱり違う! 俺の書いた見た目の似たコードではスコープから外れてるから違うんだ!
早くこれに納得いく説明をしてくれよww
「どんな寿命の参照でも」「どんな値でも」「他の関数から返ってきたものでも」「関数から必ず返せる」 (>>159)
「任意のライフタイムで必ず成立する」(>>183)
「Rustでは付加条件なく必ず成り立ちます」(>>214)
↓
thread::spawn() はクロージャ越しに受け取ってるから引数だけど違うよね……やっぱなし!
クロージャが返してるからセーフ……これもなし!
↓
実は関数の引数で受け取るコードがコンパイル通ったらってことでした! ほら、rustcでコンパイルが通ったら成り立ってるでしょ!
あ、あとunsafeは別だから!
↓
やっぱり標準ライブラリの関数が勝手に「使えるけど使えなくしまーす」って意地悪で言ってるんです!
コンパイル通ったらって条件も残ってます!
↓
そんなことないです! 固有の事情があるんです! そう、固有の事情です!
受け取る参照を制限しているから、受け取ったら返せるんです!
↓
やっぱり違う! 俺の書いた見た目の似たコードではスコープから外れてるから違うんだ!
早くこれに納得いく説明をしてくれよww
540デフォルトの名無しさん
2026/07/19(日) 23:49:03.84ID:GVCMKu1f541デフォルトの名無しさん
2026/07/19(日) 23:49:22.03ID:RywEX15a >>536
「どんな寿命の参照でも」「どんな値でも」「他の関数から返ってきたものでも」「関数から必ず返せる」 (>>159)
「任意のライフタイムで必ず成立する」(>>183)
「Rustでは付加条件なく必ず成り立ちます」(>>214)
↓
thread::spawn() はクロージャ越しに受け取ってるから引数だけど違うよね……やっぱなし!
クロージャが返してるからセーフ……これもなし!
↓
実は関数の引数で受け取るコードがコンパイル通ったらってことでした! ほら、rustcでコンパイルが通ったら成り立ってるでしょ!
あ、あとunsafeは別だから!
↓
やっぱり標準ライブラリの関数が勝手に「使えるけど使えなくしまーす」って意地悪で言ってるんです!
コンパイル通ったらって条件も残ってます!
↓
そんなことないです! 固有の事情があるんです! そう、固有の事情です!
受け取る参照を制限しているから、受け取ったら返せるんです!
↓
やっぱり違う! 俺の書いた見た目の似たコードではスコープから外れてるから違うんだ!
早くこれに納得いく説明をしてくれよww
「どんな寿命の参照でも」「どんな値でも」「他の関数から返ってきたものでも」「関数から必ず返せる」 (>>159)
「任意のライフタイムで必ず成立する」(>>183)
「Rustでは付加条件なく必ず成り立ちます」(>>214)
↓
thread::spawn() はクロージャ越しに受け取ってるから引数だけど違うよね……やっぱなし!
クロージャが返してるからセーフ……これもなし!
↓
実は関数の引数で受け取るコードがコンパイル通ったらってことでした! ほら、rustcでコンパイルが通ったら成り立ってるでしょ!
あ、あとunsafeは別だから!
↓
やっぱり標準ライブラリの関数が勝手に「使えるけど使えなくしまーす」って意地悪で言ってるんです!
コンパイル通ったらって条件も残ってます!
↓
そんなことないです! 固有の事情があるんです! そう、固有の事情です!
受け取る参照を制限しているから、受け取ったら返せるんです!
↓
やっぱり違う! 俺の書いた見た目の似たコードではスコープから外れてるから違うんだ!
早くこれに納得いく説明をしてくれよww
542デフォルトの名無しさん
2026/07/19(日) 23:49:45.50ID:RywEX15a >>540
RAIIとスコープについて学んでおいでw
RAIIとスコープについて学んでおいでw
543デフォルトの名無しさん
2026/07/19(日) 23:50:23.19ID:RywEX15a 540 デフォルトの名無しさん 2026/07/19(日) 23:49:03.84 ID:GVCMKu1f
>>537
println!("local_data消失");の意味がわからない
消失してないから表示されるぞ
複おじの知能ではスコープはわからない
>>537
println!("local_data消失");の意味がわからない
消失してないから表示されるぞ
複おじの知能ではスコープはわからない
544デフォルトの名無しさん
2026/07/19(日) 23:51:23.22ID:9D3is3z1 煽りコピペがうざいので減らしてくれ
荒らしはID:GVCMKu1fだけで足りてる
荒らしはID:GVCMKu1fだけで足りてる
545デフォルトの名無しさん
2026/07/19(日) 23:51:50.05ID:GVCMKu1f■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 👧「子どもいるんですけど。ほかの席じゃだめですか?」予約した窓側の指定席に座る親子 [パンナ・コッタ★]
- 「年収500万円でもゼロ」若者がブルーカラーを敬遠する理由…AI時代に求められる“かっこよさ”とキャリアの転換 ★4 [首都圏の虎★]
- 【自民】林芳正氏が閣外追放で反撃始動、若手と“決起集会”へ…2027年総裁選に向け「高市VS反高市」本格化か [煮卵★]
- 佐藤二朗「うんこ」Xに投稿 [Ailuropoda melanoleuca★]
- 【フリーアナ】50歳・山本モナ、「NEWS23」降板から20年 雰囲気ガラリ 近影に驚きの声「わ~」「昔のお顔忘れた」 [少考さん★]
- 米、ICC本体へ制裁か 圧力強化、機能不全恐れ [蚤の市★]
- 【実況】博衣こよりのえちえち空の軌跡1st最終回🧪★3
- 【祝🎉】安倍晋三が72歳の誕生日を迎える [748563222]
- わいもとうすこ🏡たててええか?😖
- 【実況】博衣こよりのえちえち空の軌跡2st最終回🧪★2
- 【悲報】「40になるとゲームがきつくなる」 マジだった… RPGやTPSはもう無理、のんびりとした箱庭ゲームしか無理 [452836546]
- (´・ω・`)明日は晴れるらしい