探検


Rust part38

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2026/07/24(金) 20:04:25.76ID:24e2kQId
公式
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/
(コミュニティによる日本語翻訳版もあります: https://doc.rust-jp.rs/book-ja/)

※Rustを学ぶ際に犯しがちな12の過ち
https://dystroy.org/blog/how-not-to-learn-rust

※Rustのasyncについて知りたければ「async-book」は必読
https://rust-lang.github.io/async-book/

※次スレは原則>>980が立てること

前スレ
Rust part37
https://mevius.5ch.io/test/read.cgi/tech/1784283151/

ワッチョイスレ
プログラミング言語 Rust 4【ワッチョイ】
https://mevius.5ch.io/test/read.cgi/tech/1514107621/
792sage
垢版 |
2026/09/19(土) 23:42:26.15ID:hDUFdP6a
そんなもんが必要ならAIに書かせとけ
2026/09/20(日) 12:50:06.54ID:r+SWRFAW
AIがこういう間違い記事を学習してしまうと
正しく「staticライフタイムなオブジェクトを作れます。」という記事がない限り正せない?

https://qiita.com/terukazu/items/efd9dc2ca334cfe90c05
Rustではプリミティブ型やリテラルだけが static 定義できます。
つまり、オブジェクトは static ライフタイムが使えません。
Singletonパターンを使ってグローバルステートを実装することはできますが、staticライフタイムなオブジェクトは作れません。
2026/09/20(日) 12:51:36.39ID:qvZ3EA97
実際に作って見せれば謝って来るさw
2026/09/20(日) 12:59:26.79ID:z/Z/4nFE
それはその場では謝るけど全体への学習しないパターンではないかい
ソース記事がない状況でユーザに言われるがまま訂正学習していったらヤバいじゃん
2026/09/20(日) 16:19:17.63ID:IOF+gfQZ
>>793
大丈夫、既にその記事の著者や我々なんかよりAIは遥かにRustを正しく理解しているから
2026/09/20(日) 16:33:40.22ID:45Iurzgz
今のフロンティアモデルは人間が>>793のような誤りを冒すに至る認知構造まで含めて余裕で理解してるでしょ
むしろこういう記事のほうがAIにとって価値がありそう
798デフォルトの名無しさん
垢版 |
2026/09/20(日) 18:03:16.19ID:3gFE3rTD
Python遅いけど、C++だと訳わからんくて完全AI任せになってしまうと思ってrustにしたら意外とc++よりはなんか分かりやすくていいね
nimも試したけどライブラリが古いのとラッパーばっかだったし程よい感じ。
799デフォルトの名無しさん
垢版 |
2026/09/20(日) 18:03:52.42ID:3gFE3rTD
バイブコーダーなのは変わらんけど、完全に置いてけぼりにはならなくなった
2026/09/20(日) 18:48:52.66ID:TGvlEQzb
>>793
qiita.comやzenn.devは絶対に参照するな
とシステムプロンプトに書いておけばok
2026/09/20(日) 22:08:35.06ID:/SPJ5dBm
例としてstd::env::args()を&'static [&'static str]にする方法をAIたちに尋ねてみると
まずみんなleakメソッドを使いたがる
leakメソッド禁止など指示していくと正解にたどり着けるAIもいれば無理だとお手上げのAIもいる
ということは人間プログラマも正解にたどり着ける人間とお手上げの人間がいそうな気がする
802デフォルトの名無しさん
垢版 |
2026/09/21(月) 05:12:58.13ID:SvG49y4t
所有権を理解していない初心者には難しいだろう
2026/09/21(月) 08:37:24.77ID:78hFi8Mi
コンテキスト次第だろう
所有権の問題あるいは実用的な問いと考えるなら不可能だし、無意味なパズルだとするなら方法はあるわな
AIはその手の問いに対して「実用上意味がある答えを」という暗黙の前提を置きがちで、
別途staticなフィールドを外で持って値だけコピーするような方法はleak案が否定された時点で実用上無意味な方法であるとして除外されやすい
つまりお前より頭いいからそうなるんだよ
2026/09/21(月) 09:02:44.18ID:09sz93T0
こちらのAIはstatic変数に持つのがむしろ良い方法だと言ってるよ 

> Box::leakのように意図しないメモリ管理の放棄や生ポインタの手動操作を伴わず、安全なカプセル化(Safeな抽象化)として実現できます。
> once_cell または std::sync::OnceLock(Rust 1.70以降で標準化)を使用してstatic変数にデータをグローバル保持する方法が最も一般的かつ安全です。

2023年6月安定化のOnceLockは出て来たけど
2025年7月安定化のLazyLockはないね
2026/09/21(月) 09:09:02.57ID:XoaY1bMn
>>804
大切なのはleakとOnceLockのどちらが優れているかではなく、この問いにおいて一方が否定された時点でもう一方に意味があるかどうか
まともなAIであれば単なるトンチに過ぎず無意味であると判断する
2026/09/21(月) 09:26:12.65ID:QyR36taW
>>803
Singletonパターンを知らないのか?
staticなフィールドを持ってそれを返すのはRustプログラミングの常套手段
2026/09/21(月) 10:50:33.72ID:a1rtISKh
>>801
>例としてstd::env::args()を&'static [&'static str]にする方法をAIたちに尋ねてみると
>まずみんなleakメソッドを使いたがる
尋ね方の問題だろうな
808デフォルトの名無しさん
垢版 |
2026/09/21(月) 11:10:16.37ID:ZzOmsOkb
>>803
static変数に入れることは実用上意味があって便利だぜ
他のスレッドたちへ文字列を受け渡す場合
以下が可能ならばどれがいい?
①StringをCopyして渡す
②StringをArcで包んでCloneして渡す
③Stringをstatic変数に入れて&'static strを共有
2026/09/21(月) 11:36:54.89ID:TsfRMUJ+
constで
2026/09/21(月) 11:46:14.15ID:LEbdPNEq
Rustのconstはコンパイル時に確定する値しか扱えないよ
staticは実行時に確定する値も扱えるね
2026/09/21(月) 13:09:53.44ID:YzHNkURJ
複おじってOnceLock/LazyLockネタ好きだよね
2026/09/21(月) 13:10:56.53ID:eDapVINV
プログラム実行中に決まる値だけどその後はプログラム終了後まで変わらない値はよくあるけど
それを関数呼び出しするたびに引数として渡して持ち回る方法と
static変数に入れてしまう方法
どちらが便利でコストも低いかという話だよな
2026/09/21(月) 13:16:30.70ID:xBV1TS81
起動引数程度ならどっちでもいいよ
問題はコンパイル通すためにstaticにしたがるやつ
2026/09/21(月) 13:26:12.40ID:dJbgy1B2
不変staticは安全で良い方法だが、staticに親でも殺されたかのように嫌ってる人がいる
2026/09/21(月) 13:30:54.81ID:TsfRMUJ+
Rustって、ROM化出来るん?
2026/09/21(月) 14:03:28.72ID:OHUe+syF
できる
むしろRustができない理由が存在しない
817デフォルトの名無しさん
垢版 |
2026/09/21(月) 14:35:01.23ID:+5XKJfPw
opencode重すぎだからgooseに頑張ってほC
2026/09/21(月) 14:35:55.53ID:H9KETvz/
>>813
起動引数や設定ファイルのデータだけでなく
他のサーバから読み込んだデータなどあらゆる含む
巨大なデータまで全てが対象

・プログラム実行中に必要とするデータ
・プログラム実行中は変化しないデータ
この2点を満たすならばstatic変数に格納することで利便性が高まることが多い
コンパイルを通すために関数の引数として全てを毎回渡して引きずり回すと不利になりがち
2026/09/21(月) 17:09:13.62ID:CklClm5E
>>808
⓪Stringを&strとして共有

これが第一選択肢
2026/09/21(月) 17:21:27.82ID:S88AQXnW
>>819
それは不可能
2026/09/21(月) 18:38:55.58ID:8A7K5noZ
>>819
それはString側のスレッドが先に終わって解放されちゃったり誰にも解放されないままになったり事故多発物件で禁忌だけど
Rustはコンパイルエラーにしてくれる
2026/09/21(月) 19:26:08.22ID:ViIoR4CZ
しょうがないにゃあ
https://crates.io/crates/argv
2026/09/21(月) 19:46:34.91ID:jPdCazQ8
>>822
こっちはちゃんとメモリリークと明記しているのが好感もてる
2026/09/21(月) 20:16:08.52ID:K9rKMqSY
量が分かってるメモリリークは別に問題ないだろ

昔の、main()を抜ける前にfree()すべき論争みたい
2026/09/21(月) 20:30:31.56ID:ma4ce9+I
>>823
勘違いしてるようだがそのクレイトはargvデータを利用できる環境で直接そのデータを利用することでリークなんか一切せずに&'staticを提供するクレイトだぞ
ただしunsafeだらけ
2026/09/21(月) 20:42:35.20ID:ViIoR4CZ
ただしとは?
2026/09/21(月) 20:53:42.98ID:tMMC3trf
ほんとだ
static mutまで使ってやがる
2026/09/21(月) 21:04:24.20ID:AqfCcW0e
大した需要が無い事が判明したね
ダウンロード数からして
2026/09/21(月) 21:08:52.30ID:3ovHO8wn
普通にstd::env使えばunsafe使わずに3行で書けるからなあ
2026/09/21(月) 21:22:23.35ID:6jL4N2Yz
Box::leakで取った参照ってBox::from_rawで戻していいのかな
&strとかスライスだと無理そうだけど&Stringなら大丈夫そうな気がする
2026/09/21(月) 21:26:27.88ID:w2fYUVEb
どのAIも本質的に同じコードを出してくる
once_cell使ったり細かな違いしかない

fn args() -> &'static[&'static str] {
static ARGS_STRING: LazyLock<Vec<String>> = LazyLock::new(|| std::env::args().collect());
static ARGS_STR: LazyLock<Vec<&'static str>> = LazyLock::new(|| ARGS_STRING.iter().map(|s| &**s).collect());
return &**ARGS_STR
}
2026/09/21(月) 21:35:09.56ID:AjhCgfEP
>>825
>>831だとヒープ領域にメモリ確保してリークしてるけど
2026/09/21(月) 21:42:13.71ID:P02CzQjz
メモリリークとはプログラムを動かし続けていると使っていない使用メモリが増え続けていくことだよ
増え続けないものをメモリリークとは言わない
2026/09/21(月) 21:49:47.19ID:ViIoR4CZ
メモリリークの定義はいろいろあります
2026/09/21(月) 22:01:36.60ID:bs8gwQEk
確保したままなのに使われていないメモリ領域が増えていくとメモリリーク
これ以外に定義はない
2026/09/21(月) 22:05:35.92ID:K+qAF0YS
増えていくなんて条件はプログラミング素人過ぎないか?
2026/09/21(月) 22:07:24.58ID:ViIoR4CZ
信仰告白みたいでかっこいいですね

https://valgrind.org/docs/manual/mc-manual.html#mc-manual.leaks
2026/09/21(月) 22:18:29.62ID:828MNJlE
>>820>>821
草w草w
2026/09/21(月) 22:21:40.28ID:JadhMs23
>>837
それは狂信的なので完全に無視していい
少なくともRustの方針とは真逆
Rustは「プログラム終了時にすべてのヒープメモリを返す」という無駄なことをしない方針をとっている
そしてIT大手各社そのRustの方針に賛同しているため現状がある
2026/09/21(月) 22:27:16.47ID:ViIoR4CZ
はあ? 狂信的? 方針? 何の話?
841デフォルトの名無しさん
垢版 |
2026/09/21(月) 22:35:21.70ID:VhTjeoQU
>>824の話だよな
Rustは「main()を抜ける前に全てfree()すべき」というキチガイをガン無視
2026/09/21(月) 22:55:44.23ID:ViIoR4CZ
単にRustがメモリリークについて大した方針も用語定義も持っていないだけでは?

ところで、某「IT大手各社」が言うメモリリークも「増え続ける」なんて条件はない
https://learn.microsoft.com/en-us/cpp/c-runtime-library/find-memory-leaks-using-the-crt-library
2026/09/21(月) 23:03:53.06ID:e5c+uMkQ
>>842
それはダメ言語用
ちゃんと明記されてる
2026/09/21(月) 23:30:10.79ID:ViIoR4CZ
RustプログラムでもCRTはリンクするんじゃないの?
というか言語ごとにメモリリークの定義が違うとかないし関係ないでしょ
2026/09/21(月) 23:34:20.26ID:TsfRMUJ+
メモリー解放やってくれる言語でメモリーリークってあるの?
2026/09/21(月) 23:43:06.97ID:oY6DZ07F
CRTってどの話
公開鍵暗号証明書のCRTか
AWSの共通ランタイムか
2026/09/22(火) 00:35:22.45ID:cK0j03T+
>>845
コンテナに詰めたまま今後使われることも無く放置されるオブジェクトというのは、言語機能も手が出せないからメモリリークということになる
2026/09/22(火) 10:09:10.96ID:bNLehxTt
>>819
他のスレッドへ渡すことができる参照は&'staticだけです
2026/09/22(火) 10:27:39.48ID:4pxM2A40
>>848
嘘おじ乙
2026/09/22(火) 11:39:45.83ID:q5Do/obS
なぜ他のスレッドへ&'static参照しか渡せないのかというと
渡した元のスレッドが先に終了したら参照が指している実体が亡くなってしまうためだよ
&'static以外の参照を渡せるようにするためには他のスレッドが動作中は元のスレッドをブロックして終了しないように制限するしかない
2026/09/22(火) 11:53:56.01ID:MTP/56Du
共有メモリでやりとりするんじゃ無くて?
2026/09/22(火) 12:00:50.22ID:TAf3sznx
お手軽な参照渡しは>>850
所有者はArcに包んで共同所有者になればcloneで共同所有者を増やすことができて他のスレッドへ渡せる
2026/09/22(火) 12:03:50.00ID:6FDtA0Sv
>>848
このレベルの嘘はしょぼいAIでもすぐに看破できるから
嘘つき複製おじさん注意報がなくてもみんなもう大丈夫だよね?
2026/09/22(火) 12:09:22.44ID:xOIplrwn
>>851
スレッドは全メモリ空間を共有するため全てが共有メモリ
だから共有メモリという概念は意味がなくて他から渡されたアドレス領域が参照なのか共同所有なのかという点のみ区別される
2026/09/22(火) 12:11:27.47ID:WqQc5uVE
std::thread::scope
2026/09/22(火) 12:14:30.45ID:lvVWXgg1
>>855
それは自分がブロックされて動作停止になることと引き換えに参照を渡す仕組み
自分が自由に動く場合は&'staticしか渡せない
2026/09/22(火) 12:17:28.17ID:izQVrR2Y
相手のバッファに突っ込んでしまえばいいだけでは?
2026/09/22(火) 12:20:46.33ID:/aCQSoPr
>>857
それはコピー
最もコストが高い
static変数に入れて&'static参照を共有するとコストが安い
2026/09/22(火) 12:22:14.62ID:MTP/56Du
コストより、相手のライフ状態気にしなくてし済む自由
2026/09/22(火) 12:23:02.48ID:DaZhbE7H
AIともこんな調子でバトってるのかな
2026/09/22(火) 12:26:22.07ID:C2KoahVf
>>859
その通り
互いのライフを気にせず共有できる&'staticが自由でいいよ
2026/09/22(火) 12:40:46.70ID:0nX3vX8d
> 問題はコンパイル通すためにstaticにしたがるやつ >>861
2026/09/22(火) 12:49:22.11ID:yoeWEF+y
static変数はスレッド間で共有するために存在してるんだよ
だからこそstatic mutはunsafeでしか扱えないようにしてある
staticで可変にしたい場合は内部可変性を使うことでsafeに使えるよ
2026/09/22(火) 13:00:51.63ID:IGaT0qGE
&'staticを得られるから自由に他スレッドに渡せるだけでなくシングルスレッドの利用でも利点が多い
ライフタイム気にしなくてよくなる
865デフォルトの名無しさん
垢版 |
2026/09/22(火) 13:04:32.19ID:cr0HifoN
>>846
Cathode Ray Tube
2026/09/22(火) 14:50:04.06ID:rR3JhzUW
>>862
ウケた
まさにこれだよな
2026/09/22(火) 14:51:29.96ID:nQd/xlrB
関数の引数として渡すときにもstatic化は効果絶大だよ
直接もしくは連れ回す構造体に格納するとき
1. 所有型(VecやString)を使うと構造体のサイズが割り増しになる
2. 通常の参照を使うと構造体にライフタイム<'a>が付いて扱いが煩雑になる
3. 'static参照を使うと構造体がシンプルで済む
便利で効率も良いのはstatic化した時の 3. だよね
2026/09/22(火) 15:04:40.05ID:6O2cWAgA
結局スレッド云々は全く関係がないんだよな
グローバル変数にして個別に受け渡しせず使いたいならstaticにする
それだけ

グローバル変数は
依存性が隠れやすい/テストしにくいなどのダウンサイドもあるので
用法用量には注意しましょうということ

複おじ節には耳をかすな
これだけでいい
2026/09/22(火) 15:14:50.45ID:jVMf5Btc
static変数はグローバル変数ではありません
テストがしにくくなることもありません
2026/09/22(火) 15:20:16.77ID:wJ8CVmO0
>>868
基本的な違いをいくつも理解できてないな
まず指摘があるようにstatic変数はグローバル変数ではなくスコープは関数内やモジュール内に閉じて使える
次にstatic変数を直接使う話ではなくてそれが見えない場所からも使える&'static参照の話だろう
2026/09/22(火) 15:21:25.46ID:DaZhbE7H
「バカは'static以外のライフタイム使わないほうがいい」はガチ
2026/09/22(火) 15:41:20.58ID:1FMPzNcm
>>871
ライフタイムが難しいなんてことはないでしょ
ここでもライフタイム注釈付けたり面倒という声はあっても難しいとか見かけない
2026/09/22(火) 16:30:49.95ID:mb5/PVHr
&str の lifetime に納得行かないのなら
&'static str より String 使え
2026/09/22(火) 16:39:33.99ID:Dlcehamx
>>873
参照を渡して共有したい話だから
String直接渡すならcloneになってしまうぞ
&'static strの方が何もかも良い
2026/09/22(火) 17:22:46.10ID:X93HRnuq
すべったね
2026/09/22(火) 17:28:58.82ID:9iufHjYY
しかもスレッドに渡すなら
文字列を渡したいだけなのに
&'static str vs. Arc<String>になってしまうもんな
2026/09/22(火) 18:24:55.02ID:HJSsYxXe
複おじ(2022)「可変性を気にしなくてよくなるからCell使え」
複おじ(2026)「ライフタイム気にしなくてよくなるから&'static使え」

1ミリも進歩してないwww
2026/09/22(火) 18:29:20.00ID:DaZhbE7H
令和最新版staticおじさん
2026/09/22(火) 19:34:33.89ID:JjocWP+j
どんなものでも用いることでコードがシンプルになったり速くなったりするなら使うのが正解
unsafeは除く
2026/09/22(火) 21:06:58.96ID:OwGqJ8SC
なんでもArcにすると扱いが楽!は遅くなるからダメだけど
>>877は問題ないと思う
881デフォルトの名無しさん
垢版 |
2026/09/22(火) 21:46:26.41ID:dZHoI6bq
CPUバウンドな処理をスレッドで回したいだけなら安直にrayonで書く
プロファイラかけてボトルネックだとなったらゼロコピーで書き直す
そうそうない
2026/09/22(火) 21:57:02.17ID:nl5zGx1z
これ書き味悪すぎるだろ
https://github.com/hanabi1224/Programming-Language-Benchmarks/blob/main/bench/algorithm/coro-prime-sieve/3.rs

こんな風に書けないものか
https://godbolt.org/z/dEv1EPKT9
2026/09/22(火) 22:03:22.11ID:Z9tABGZi
分割できるなんらかの計算処理以外にrayon活用無理だろ
2026/09/22(火) 22:18:24.35ID:rLmwJ50F
>>882
非同期で書く課題だから他の言語は非同期を使ってるいるのに1人だけ非同期ではないのは恥ずかしい
2026/09/22(火) 22:26:59.47ID:nl5zGx1z
generatorはコルーチンだよ
2026/09/22(火) 22:29:08.11ID:DaZhbE7H
C++読む気ないのにこれだからなあ
2026/09/22(火) 22:31:19.91ID:nl5zGx1z
>>884
もうちょっと詳しく書くと
>>882のC++コードはこれに対応している
https://github.com/hanabi1224/Programming-Language-Benchmarks/blob/main/bench/algorithm/coro-prime-sieve/2.py
ただしPythonは再帰呼び出しでスタックオバーフローする
2026/09/22(火) 22:35:00.67ID:ql3fUNJl
ざっと見たところPythonもJavaScriptもC#もGoもRustも非同期タスクを使っているようだ
非同期タスクを使う課題なのではないか?
2026/09/22(火) 22:38:54.92ID:1Jvzfdv3
1.pyなど1.*しか見てなかったからasync使うベンチマークかと思ったら2.pyはasync出て来ないのな
出題が悪いのではないか
2026/09/22(火) 22:43:39.10ID:nl5zGx1z
>>888
非同期機構のプリミティブは言語毎に違うけどC++はプロミスで
std::generatorはsingle threaded executorだからJavascriptよりかな

C++コードが登録されてないのはこれが流行ったのが昔だからでは
2026/09/22(火) 22:44:53.33ID:nl5zGx1z
>>889
カラーレスのgoでチャンネルを使ったのがひな型
2026/09/22(火) 22:51:10.96ID:fLfMQzIX
シングルスレッドの生成器でいいなら
C++の1つ目のジェネレータはRustでは「2..」
2つ目は「(2..).filter(|&i| i % prime != 0)」
しかしそのようなコードを期待されているベンチマークではないと思われる
■ このスレッドは過去ログ倉庫に格納されています

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