公式
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 part32
https://mevius.5ch.net/test/read.cgi/tech/1755057787/
Rust part31 https://mevius.5ch.net/test/read.cgi/tech/1751545806/
Rust part30 https://mevius.5ch.net/test/read.cgi/tech/1748392296/
ワッチョイスレ
プログラミング言語 Rust 4【ワッチョイ】
https://mevius.5ch.net/test/read.cgi/tech/1514107621/
探検
Rust part33
1デフォルトの名無しさん
2025/08/15(金) 17:49:30.70ID:N8TIzbWg401デフォルトの名無しさん
2025/10/23(木) 08:26:01.60ID:EvN9HHeU 大した手間ではなく
むしろライフタイム注釈は有った方が読みやすく
参照の流れも理解しやすい
struct Foo<'a, 'b, 'c>も
3系統の参照が入っていると明示され
他の言語よりも理解しやすくなってる
むしろライフタイム注釈は有った方が読みやすく
参照の流れも理解しやすい
struct Foo<'a, 'b, 'c>も
3系統の参照が入っていると明示され
他の言語よりも理解しやすくなってる
402デフォルトの名無しさん
2025/10/23(木) 09:55:41.49ID:T3GhTn1Z なるほど。。。
変数に生存期間があるのはわかるけど「変数の型」にまで生存期間があるってのがようわからんぜよ
変数に生存期間があるのはわかるけど「変数の型」にまで生存期間があるってのがようわからんぜよ
403デフォルトの名無しさん
2025/10/23(木) 10:42:16.86ID:rbYHJ9y2 ライフタイム注釈も型のジェネリックパラメータの一つと考えればよいかと
参照のライフタイムは現行関数を抜けたら即死ぬ参照からもっと祖先の関数まで持ちこたえる参照そして永久不滅の参照まで色々あるけどジェネリックにいずれも入り得る
参照のライフタイムは現行関数を抜けたら即死ぬ参照からもっと祖先の関数まで持ちこたえる参照そして永久不滅の参照まで色々あるけどジェネリックにいずれも入り得る
404デフォルトの名無しさん
2025/10/23(木) 11:33:06.85ID:RL60E7N6405デフォルトの名無しさん
2025/10/23(木) 12:08:09.39ID:uSK82vvB >>401
設計者も手間だと思ってるから引数一つの場合の省略ルールがあるのに何言ってるの
引数が複数のときにライフタイムの明示が必須なのは、シグネチャだけの推論では多くの場合において過剰に強い制約を生じるから
仮にシグネチャだけで安全に推論するなら、戻り値のライフタイムは最もライフタイムの短い引数に合わせるしかないだろ?
そうするとスコープがネストされているような場合に戻り値が短いスコープの方に制約されてしまう
実用上はそれでも問題なく使えるケースは多いはずだが、本来の必要最低限の制約とは食い違うというのが設計者には許せなかったのだろう
設計者も手間だと思ってるから引数一つの場合の省略ルールがあるのに何言ってるの
引数が複数のときにライフタイムの明示が必須なのは、シグネチャだけの推論では多くの場合において過剰に強い制約を生じるから
仮にシグネチャだけで安全に推論するなら、戻り値のライフタイムは最もライフタイムの短い引数に合わせるしかないだろ?
そうするとスコープがネストされているような場合に戻り値が短いスコープの方に制約されてしまう
実用上はそれでも問題なく使えるケースは多いはずだが、本来の必要最低限の制約とは食い違うというのが設計者には許せなかったのだろう
406デフォルトの名無しさん
2025/10/23(木) 12:30:49.98ID:qu5HXOyL だからこそライフタイム注釈の明示的な指定が重要
それがあることでコンパイラもコードレビューも正しい判断ができる
それがあることでコンパイラもコードレビューも正しい判断ができる
407デフォルトの名無しさん
2025/10/23(木) 14:21:00.93ID:fxiWIqfp 注釈はプログラマの意図の表明だ。
意図と違う形で辻褄が合っても問題だろ。
よほど自明の場合だけ省略できるようになってるけども、どのレベルから自明と言えるかは感覚的だからな……
意図と違う形で辻褄が合っても問題だろ。
よほど自明の場合だけ省略できるようになってるけども、どのレベルから自明と言えるかは感覚的だからな……
408デフォルトの名無しさん
2025/10/23(木) 15:22:08.96ID:k6u6s2rE ライフタイムの指定を省略できる場合であっても、省略すると戻り値のライフタイムの制約が必要以上に強くなってしまうケースは普通にあって、
>>405の理屈を厳格に適用するなら引数が一つでもライフタイムの明示は必須だ
食い違いが生じるケースがどれくらいの頻度で発生するかという統計の問題なのよ
>>405の理屈を厳格に適用するなら引数が一つでもライフタイムの明示は必須だ
食い違いが生じるケースがどれくらいの頻度で発生するかという統計の問題なのよ
409デフォルトの名無しさん
2025/10/23(木) 15:27:37.26ID:hDpBG7ml 二つを'a 'aにすると寿命の短い方に揃えられてしまうけど
二つを'a 'bにすると各々の寿命が尊重されて後に出来ることの範囲が広がるって話?
二つを'a 'bにすると各々の寿命が尊重されて後に出来ることの範囲が広がるって話?
410デフォルトの名無しさん
2025/10/24(金) 10:04:48.68ID:PHL/ybvS であるか
411デフォルトの名無しさん
2025/10/25(土) 12:18:04.03ID:dx13CXH8 ライフタイムめんどくせえし全部stringで返すべと思ってたら&strとstringの速度差はだいたい10倍あるみたいなのでやっぱできるだけ&strで返そうとおもた🐼
412デフォルトの名無しさん
2025/10/25(土) 12:27:15.75ID:dvc0RMgV そりゃ先頭ポインタと長さを返すだけで済む&str返しやスライス&[T]返しが圧倒的に速いよ
413デフォルトの名無しさん
2025/10/25(土) 12:30:11.50ID:5GqPIi/l414デフォルトの名無しさん
2025/10/25(土) 12:36:43.77ID:mHIPVewV &str返しができる状況でString返しをしてしまうセンスだと至る所で似たような非効率をしてしまいかねない
415デフォルトの名無しさん
2025/10/25(土) 14:30:41.07ID:tv80YbgW そもそもそのへん無頓着ならPythonとかのスクリプトでよくねっていう気も
416デフォルトの名無しさん
2025/10/25(土) 15:28:17.84ID:Sq0aKQjf たまにはCowのことも思い出してあげて🐮
417デフォルトの名無しさん
2025/10/25(土) 16:30:57.36ID:dHJk9AZa >>411
繰り返し呼ばれない関数で文字列がそれほど長く
速度的なメリットよりもライフタイムを引きずり回すデメリットが大きくなる場合は
&str返しできる状況でもstring返しをする
それ以外は&strで返せるなら&strを選ぶのが基本
繰り返し呼ばれない関数で文字列がそれほど長く
速度的なメリットよりもライフタイムを引きずり回すデメリットが大きくなる場合は
&str返しできる状況でもstring返しをする
それ以外は&strで返せるなら&strを選ぶのが基本
418デフォルトの名無しさん
2025/10/26(日) 12:11:46.95ID:YIXSQNu/ 文字列は用途によってはstring_cacheなど使ってintern化すると一気に扱いやすくなるよ
419デフォルトの名無しさん
2025/10/26(日) 15:33:24.64ID:QFgKHJ6W 「用途によっては」「条件によっては」を付けたらだいたい何でも正しいよ。
つまり無意味だってことだ。
つまり無意味だってことだ。
420デフォルトの名無しさん
2025/10/26(日) 15:48:22.18ID:qLJPEdq/ 何にでも向き不向きがあり万能はないため特徴と用途を比較して適切に選ぶ必要がある
文字列の比較があるならinterningは有利
同じ文字列が出てこないなら機能を発揮しない
それでも64bit ID化される点で参照や所有権を気にすることなく気軽に扱える視点での利点はあるかな
文字列の比較があるならinterningは有利
同じ文字列が出てこないなら機能を発揮しない
それでも64bit ID化される点で参照や所有権を気にすることなく気軽に扱える視点での利点はあるかな
421デフォルトの名無しさん
2025/10/26(日) 22:42:01.01ID:uL5v2PLc https://itest.5ch.net/mevius/test/read.cgi/tech/1757733847/52
> Rustが広まってる理由はC並みの高速実行をゼロコスト抽象化によるコードの可読性・保守性・開発効率の高さで実現したことにあるからね
> 安全性などはついでのオマケ
5chのRust信者は程度が低いなw 安全性への認識がこんなものかww
> Rustが広まってる理由はC並みの高速実行をゼロコスト抽象化によるコードの可読性・保守性・開発効率の高さで実現したことにあるからね
> 安全性などはついでのオマケ
5chのRust信者は程度が低いなw 安全性への認識がこんなものかww
422デフォルトの名無しさん
2025/10/26(日) 22:50:15.71ID:/3Ktl5T9 高い抽象度で使いやすい言語は他にもあるけど速さ省メモリを両立させた言語はRustが初だな
それだけでも十分に価値はあるけどセキュリティ面から今重視されている安全性まで両立させたことが決定打
それだけでも十分に価値はあるけどセキュリティ面から今重視されている安全性まで両立させたことが決定打
423デフォルトの名無しさん
2025/10/26(日) 23:04:51.09ID:v+5C5Bjl > 安全性などはついでのオマケ
安全性に勝るものなどないのに馬鹿丸出しw
安全性に勝るものなどないのに馬鹿丸出しw
424デフォルトの名無しさん
2025/10/26(日) 23:17:12.99ID:X+0qei7I 安全性が使用動機でなくても
他のメリットも他言語に例がなく十分満足できる言語とは言える
他のメリットも他言語に例がなく十分満足できる言語とは言える
425デフォルトの名無しさん
2025/10/26(日) 23:20:44.90ID:B58XHKxc Rustは実際はc++の代用として使われる事例がほとんど
ユーザーは欧米に偏っていて一番IT人材が多いインドではほぼ使われていない
ユーザーは欧米に偏っていて一番IT人材が多いインドではほぼ使われていない
426デフォルトの名無しさん
2025/10/27(月) 00:24:06.81ID:mFVRCEv/ >>425
インドでもRust利用企業が多い
Companies that use Rust in India
https://theirstack.com/en/technology/rust/in
インドでもRust利用企業が多い
Companies that use Rust in India
https://theirstack.com/en/technology/rust/in
427デフォルトの名無しさん
2025/10/27(月) 02:06:07.73ID:LFGbdGCc 下馬評垂れてればプログラマーとしての格が上がるとでも思ってるんだろうか
428デフォルトの名無しさん
2025/10/27(月) 06:13:04.93ID:AST59Cdb429デフォルトの名無しさん
2025/10/27(月) 06:31:46.50ID:bSWiCsX6 rustにも機械学習ライブラリあるしaiもrustでよくね
430デフォルトの名無しさん
2025/10/27(月) 09:29:34.52ID:/CEP+D0A431デフォルトの名無しさん
2025/10/27(月) 09:32:19.04ID:/CEP+D0A >>428
遅くて困っていたツールってほど遅いのは普通に設計ミスじゃ無いの
たとえばspawnせずにシングルスレッドで回してる箇所見落としてるとか
言語による性能差意識できるほどRustがいいとは思えん
わざわざ他の言語で書くより、元のプログラミング言語でリファクタリングの方が楽だと思うけど
遅くて困っていたツールってほど遅いのは普通に設計ミスじゃ無いの
たとえばspawnせずにシングルスレッドで回してる箇所見落としてるとか
言語による性能差意識できるほどRustがいいとは思えん
わざわざ他の言語で書くより、元のプログラミング言語でリファクタリングの方が楽だと思うけど
432デフォルトの名無しさん
2025/10/27(月) 09:34:42.42ID:/CEP+D0A >>426
英語はよくわからんけど、408社ってインドの有名企業のほぼ全て採用ってことか
メジャー企業はインフォシステムとかタタとかしか知らんがそこまで普及したのはここ数年よね
なんか日本より導入進んでね?
英語はよくわからんけど、408社ってインドの有名企業のほぼ全て採用ってことか
メジャー企業はインフォシステムとかタタとかしか知らんがそこまで普及したのはここ数年よね
なんか日本より導入進んでね?
433デフォルトの名無しさん
2025/10/27(月) 09:36:22.75ID:/CEP+D0A >>425
欧米とインドだと案件の内容が全く違うんだよなあ
たとえばフロントエンドをインドに外注とかならRust使わんし
あえてバックエンドをインドで開発??あんま無いよなあ。バックエンド系の新サービスは欧米強いもんなあ
日本も同じこと言えるけど;;;
欧米とインドだと案件の内容が全く違うんだよなあ
たとえばフロントエンドをインドに外注とかならRust使わんし
あえてバックエンドをインドで開発??あんま無いよなあ。バックエンド系の新サービスは欧米強いもんなあ
日本も同じこと言えるけど;;;
434デフォルトの名無しさん
2025/10/27(月) 09:47:02.67ID:MUgrXvxY435デフォルトの名無しさん
2025/10/27(月) 13:52:59.21ID:HMompUGJ TypeScriptのコンパイラは色々あった末結局goで書き直されたな
rustになるかと思ってた
rustになるかと思ってた
436デフォルトの名無しさん
2025/10/27(月) 15:03:44.84ID:qhXNWfqN437デフォルトの名無しさん
2025/10/27(月) 15:22:52.00ID:8ULsq5Jc Rust で書いて速くなるものは C でも C++ でも速くなると思う。
適切に再設計できれば。
ただ、書き直す機会があるときにこの時代にあえて C や C++ を使いたいとは思わないし、
元が C や C++ だったら同じ言語で書きなおすと元の設計に引きずられて同じような駄目なことをまたやってしまう。
Rust が特別に良いとまでは思わないけど「一新する良い機会」ではあった。
Go も良い言語だと思うけど抽象度は高くない。
C の駄目 (というか面倒くさい) なところである文法の不必要な複雑さやメモリ管理を楽にしたという側面が強くて、
大規模なプログラムを整理するのはちょっとしんどい。
出来るという人もいるんだけどそういう人はたぶん C でも出来てしまうタイプの剛腕だから参考にならない。
適切に再設計できれば。
ただ、書き直す機会があるときにこの時代にあえて C や C++ を使いたいとは思わないし、
元が C や C++ だったら同じ言語で書きなおすと元の設計に引きずられて同じような駄目なことをまたやってしまう。
Rust が特別に良いとまでは思わないけど「一新する良い機会」ではあった。
Go も良い言語だと思うけど抽象度は高くない。
C の駄目 (というか面倒くさい) なところである文法の不必要な複雑さやメモリ管理を楽にしたという側面が強くて、
大規模なプログラムを整理するのはちょっとしんどい。
出来るという人もいるんだけどそういう人はたぶん C でも出来てしまうタイプの剛腕だから参考にならない。
438デフォルトの名無しさん
2025/10/27(月) 15:53:13.91ID:qhXNWfqN そうだよな
TypeScriptの件がたまたまGoだけJSと1対1の対応を取れたのも、Goが抽象度高くない言語だったため
TypeScriptの件がたまたまGoだけJSと1対1の対応を取れたのも、Goが抽象度高くない言語だったため
439デフォルトの名無しさん
2025/10/27(月) 17:49:39.72ID:HMompUGJ Rustが欲しいというよりCargoが欲しいんだよ
って思ってたらCabinとかいうの見つけて笑った
って思ってたらCabinとかいうの見つけて笑った
440デフォルトの名無しさん
2025/10/27(月) 18:45:30.45ID:l4eceh5X でもなんでRustは欧米中心で使われててその他で低いんだ?
コミュニテイーの所属者もそんな分布でアジアは低い
1位アメリカ
2位ドイツって
日本は11位
コミュニテイーの所属者もそんな分布でアジアは低い
1位アメリカ
2位ドイツって
日本は11位
441デフォルトの名無しさん
2025/10/27(月) 19:32:35.62ID:UgAh1tV0 Goも似たような感じだね
単にsurveyのアナウンスが拡散されるプラットフォームの人口分布に引っ張られているだけな気もする
RedditとかHackerNewsとか
単にsurveyのアナウンスが拡散されるプラットフォームの人口分布に引っ張られているだけな気もする
RedditとかHackerNewsとか
442デフォルトの名無しさん
2025/10/27(月) 19:41:30.85ID:FbhZH/Sk443デフォルトの名無しさん
2025/10/27(月) 19:42:44.69ID:edSRXQey リファレンスが英語だからな
ガイドは翻訳されてるけどライブラリ周りはどうしようもない
ガイドは翻訳されてるけどライブラリ周りはどうしようもない
444デフォルトの名無しさん
2025/10/27(月) 20:06:35.18ID:oTj8oDFF でも中国5位じゃん
445デフォルトの名無しさん
2025/10/27(月) 20:56:19.83ID:qhXNWfqN446デフォルトの名無しさん
2025/10/27(月) 21:04:31.26ID:syMP9q/B Rustのコレクションは移動なしでは書けまい
447デフォルトの名無しさん
2025/10/27(月) 23:32:35.09ID:OMtkXyUi448デフォルトの名無しさん
2025/10/28(火) 03:31:36.61ID:jbGu9KYL Rustのコレクションは基本的でかつ非自明的にすごい
それはシャローコピーでもディープコピーでもないものが書かせた
それはシャローコピーでもディープコピーでもないものが書かせた
449デフォルトの名無しさん
2025/10/28(火) 17:50:32.18ID:rJCEklN9 >>447
バカなの?
バカなの?
450デフォルトの名無しさん
2025/10/28(火) 18:01:51.21ID:KGeQ1yOx451デフォルトの名無しさん
2025/10/28(火) 19:07:26.87ID:Zt6hv4It goてunixの作者が作っとうけえあんなに使われてるんかな
ポイント使えるのにgcがあるとゆうようわからん仕様
ポイント使えるのにgcがあるとゆうようわからん仕様
452デフォルトの名無しさん
2025/10/28(火) 23:49:42.09ID:tW1WhAkg >>451
Goのポインタは構文はC風だが、できることはJava等のGC言語のオブジェクト参照とほぼ同じ
そして、GC言語のオブジェクト参照はポインタとして実装されており、ポインタとGCの組み合わせは全く矛盾しない
Goのポインタは構文はC風だが、できることはJava等のGC言語のオブジェクト参照とほぼ同じ
そして、GC言語のオブジェクト参照はポインタとして実装されており、ポインタとGCの組み合わせは全く矛盾しない
453デフォルトの名無しさん
2025/10/29(水) 01:38:08.80ID:KUd6rxlw C#だってGCあるけどポインタ使えるじゃん
454デフォルトの名無しさん
2025/10/29(水) 12:14:41.38ID:vbO9JSKW DBを使用するスマホアプリのバックエンド開発でRustを使用してるけど、sqliteがシングルスレッドでしか使えないから
逆に複雑な設計を求められるな。慣れるまできつい
逆に複雑な設計を求められるな。慣れるまできつい
455デフォルトの名無しさん
2025/10/29(水) 15:34:17.17ID:L881d/fh Rustエンジニアをクビにして代わりにペチパー雇って、浮いた金でMySQLに変えた方が遥かに速くなりそうだな
456デフォルトの名無しさん
2025/10/29(水) 17:35:51.56ID:DwSXyKDH RustはSingletonの初期化と共有がすっきりしないな
初期化忘れのunsafeが付き纏うからどこかで割り切らないといけない
初期化忘れのunsafeが付き纏うからどこかで割り切らないといけない
457デフォルトの名無しさん
2025/10/29(水) 19:33:33.85ID:OVpZFjzC once_cellでええやん
458デフォルトの名無しさん
2025/10/29(水) 21:05:45.94ID:DwSXyKDH OnceCellのget_or_initだと初期化処理が動くタイミングが読めない
↓
気持ち悪いからmainの最初で初期化する
↓
共有する時に毎回初期化済みかチェックするの無駄では
↓
unsafe「呼んだ?」
↓
気持ち悪いからmainの最初で初期化する
↓
共有する時に毎回初期化済みかチェックするの無駄では
↓
unsafe「呼んだ?」
459デフォルトの名無しさん
2025/10/29(水) 23:50:28.94ID:xf92jPdM そんなコード書くやつはクビ
460デフォルトの名無しさん
2025/10/30(木) 00:25:31.66ID:9N/j/0Me 別にチェックしたらいいやん
逆にそんな初期化タイミング気にする理由教えてよ
「最初にたまたま使うタイミングで」初期化で自然なのにあえてメイン関数で初期化する理由
逆にそんな初期化タイミング気にする理由教えてよ
「最初にたまたま使うタイミングで」初期化で自然なのにあえてメイン関数で初期化する理由
461デフォルトの名無しさん
2025/10/30(木) 00:26:18.06ID:9N/j/0Me >>454
sqlite 嫌いや
sqlite 嫌いや
462デフォルトの名無しさん
2025/10/30(木) 00:40:46.28ID:srGle5DG 初期化で重い処理があると変のタイミングで遅延が発生するのが気になる
最初にxxx_init(gl_initとか)で初期化するライブラリに馴染んでるのもあるけど
最初にxxx_init(gl_initとか)で初期化するライブラリに馴染んでるのもあるけど
463デフォルトの名無しさん
2025/10/30(木) 01:29:19.31ID:bVySussB つかOnceCellじゃなくてLazyCell使えば?
初期化タイミング固定したいなら一発getしとけばよし
初期化タイミング固定したいなら一発getしとけばよし
464デフォルトの名無しさん
2025/10/30(木) 03:16:33.13ID:X8TSXlMe465デフォルトの名無しさん
2025/10/30(木) 03:58:11.87ID:KK7tlxBe dockerhub見るとポスグレのほうがマイエスの2倍くらいpullされとうけどやっぱマイエスてオラクルだから嫌われてるの?
466デフォルトの名無しさん
2025/10/30(木) 04:18:06.36ID:92TxX2hJ >>463
最初のアクセス時に自動初期化してくれるだけでよいならDeref/DerefMutが使えるLazyCellが圧倒的に扱いやすいね
そうでなく初期化のタイミングを自由にして初期化以前はNoneを返したりset/takeを使ったりしたいならOnceCellだね
最初のアクセス時に自動初期化してくれるだけでよいならDeref/DerefMutが使えるLazyCellが圧倒的に扱いやすいね
そうでなく初期化のタイミングを自由にして初期化以前はNoneを返したりset/takeを使ったりしたいならOnceCellだね
467デフォルトの名無しさん
2025/10/30(木) 10:22:35.58ID:zpGcc97R どっちもスレッドセーフじゃないだろ
468デフォルトの名無しさん
2025/10/30(木) 10:35:58.35ID:bVySussB そっすね
469デフォルトの名無しさん
2025/10/30(木) 10:41:04.39ID:JG/b/82+ それぞれに対応するスレッドセーフ版のOnceLockとLazyLockがある
470デフォルトの名無しさん
2025/10/30(木) 10:48:00.79ID:JG/b/82+ なのでそれを常識としてOnceXxxxとLazyXxxxの性質の違いの話かと
471デフォルトの名無しさん
2025/10/30(木) 10:52:57.20ID:zpGcc97R >>458
共有前にmainで必ず初期化するのであれば
共有後に毎回初期化済みかチェックする必要ない
逆に共有後の初回アクセス時に初期化するという形をとるなら
初期化済みかどうか毎回チェックするようなコードがどこかに必要
毎回チェックするコードを自分で書きたくなければ
LazyLock等に肩代わりしてもらえという話
共有前にmainで必ず初期化するのであれば
共有後に毎回初期化済みかチェックする必要ない
逆に共有後の初回アクセス時に初期化するという形をとるなら
初期化済みかどうか毎回チェックするようなコードがどこかに必要
毎回チェックするコードを自分で書きたくなければ
LazyLock等に肩代わりしてもらえという話
472デフォルトの名無しさん
2025/10/30(木) 11:04:47.24ID:zpGcc97R >>466,470
LazyCell/LazyLockのget/get_mutがもうすぐstabilizeされるから
初期化以前はNoneを返すというのはどちらでも同じようにできるようになる
初期化関数で引数を受け取る必要もなく常に固定の初期化関数を実行すればいいだけならLazyCell/LazyLock
引数を受け取ったり条件によって違う初期化関数を実行したい場合はOnceCell/OnceLock
これが基本的な使い分け
LazyCell/LazyLockのget/get_mutがもうすぐstabilizeされるから
初期化以前はNoneを返すというのはどちらでも同じようにできるようになる
初期化関数で引数を受け取る必要もなく常に固定の初期化関数を実行すればいいだけならLazyCell/LazyLock
引数を受け取ったり条件によって違う初期化関数を実行したい場合はOnceCell/OnceLock
これが基本的な使い分け
473デフォルトの名無しさん
2025/10/30(木) 11:23:27.81ID:JG/b/82+ 使い勝手が天と地の差
Lazy~はderefできるから*Xでアクセスできてコードも見やすい
Once~は返値Option処理かget_or_init(|| ...)が必要
Lazy~はderefできるから*Xでアクセスできてコードも見やすい
Once~は返値Option処理かget_or_init(|| ...)が必要
474デフォルトの名無しさん
2025/10/30(木) 11:31:00.93ID:Nj0jrilV シングルスレッド+遅延評価ではタイミングが不明
別スレッドのスタックに置けば遅延しないのでかえって違和感が少ない
別スレッドのスタックに置けば遅延しないのでかえって違和感が少ない
475デフォルトの名無しさん
2025/10/30(木) 12:35:20.68ID:zpGcc97R >>473
それは使い分けの結果であって原因ではないからな
LazyCell/LazyLockでもinterior mutabilityを使えば
初期化時に引数を受け取るのと同じようなことができるが
get_or_init以上に使い勝手が悪化するから
derefしたいかどうかで選ぶものではない
それは使い分けの結果であって原因ではないからな
LazyCell/LazyLockでもinterior mutabilityを使えば
初期化時に引数を受け取るのと同じようなことができるが
get_or_init以上に使い勝手が悪化するから
derefしたいかどうかで選ぶものではない
476デフォルトの名無しさん
2025/10/30(木) 13:04:12.82ID:Nj0jrilV Option処理をしたくないとき
JavaにたとえるとNullPointerExceptionをcatchしたくないとき
必要なのは「catchされませんでした」みたいなパニックを容認すること
これがスタンダード
unsafeが必要だという考えはスタンダードではない
JavaにたとえるとNullPointerExceptionをcatchしたくないとき
必要なのは「catchされませんでした」みたいなパニックを容認すること
これがスタンダード
unsafeが必要だという考えはスタンダードではない
477デフォルトの名無しさん
2025/10/30(木) 13:10:40.17ID:Nj0jrilV unsafeもpanicもどっちも自由に使えばいい
panicを禁止するためにunsafeを使いたいのだとしたら自由とは言えない
panicを禁止するためにunsafeを使いたいのだとしたら自由とは言えない
478デフォルトの名無しさん
2025/10/30(木) 21:08:57.21ID:8A2yOaqe479デフォルトの名無しさん
2025/10/30(木) 21:45:45.78ID:pM7Xv5YE 例外処理でも条件分岐でも、わざわざ明記することはあっても、いつもそんな起きないことを書いていたら、他人には起きる例外だと認識されてしまう。
480デフォルトの名無しさん
2025/10/30(木) 21:53:26.04ID:Nj0jrilV Optionは長さに制限があるキューと考えられる
キューが空なら読む側はブロックすればいいのにブロックしないから無駄に複雑になる
キューが空なら読む側はブロックすればいいのにブロックしないから無駄に複雑になる
481デフォルトの名無しさん
2025/10/30(木) 21:56:50.09ID:i4jbq83k ?
482デフォルトの名無しさん
2025/10/30(木) 21:59:43.38ID:JG/b/82+ >>475
そこは併用することで解決できる
まずOnceLockで変数FOOの場合
初期化は例えばこうなる
static FOO: OnceLock<String> = OnceLock::new();
let foo = std::env::var("FOO").expect("no 環境変数FOO");
FOO.set(foo).expect("FOO: 初期化済");
このOnceLockのFOOの利用はこうなり可読性の悪い欠点がある
println!("FOO: {}", FOO.get().expect("FOO: 未初期化"));
一方でLazeLockで変数BARの場合
初期化で引数を渡せない欠点を先程のFOO活用で補える
static BAR: LazyLock<String> = LazyLock::new(|| BAR初期化関数(FOO.get().expect("FOO: not initialized")));
fn BAR初期化関数(foo: &str) -> String {
format!("適当に{foo}を変換")
}
このLazyLockのBARの利用はderefでこうなり可読性が向上する
println!("BAR: {}", *BAR);
そこは併用することで解決できる
まずOnceLockで変数FOOの場合
初期化は例えばこうなる
static FOO: OnceLock<String> = OnceLock::new();
let foo = std::env::var("FOO").expect("no 環境変数FOO");
FOO.set(foo).expect("FOO: 初期化済");
このOnceLockのFOOの利用はこうなり可読性の悪い欠点がある
println!("FOO: {}", FOO.get().expect("FOO: 未初期化"));
一方でLazeLockで変数BARの場合
初期化で引数を渡せない欠点を先程のFOO活用で補える
static BAR: LazyLock<String> = LazyLock::new(|| BAR初期化関数(FOO.get().expect("FOO: not initialized")));
fn BAR初期化関数(foo: &str) -> String {
format!("適当に{foo}を変換")
}
このLazyLockのBARの利用はderefでこうなり可読性が向上する
println!("BAR: {}", *BAR);
483デフォルトの名無しさん
2025/10/30(木) 22:01:59.88ID:dCoHjFig そういうのは一番嫌われる
484デフォルトの名無しさん
2025/10/30(木) 22:02:57.95ID:dCoHjFig 意味のない値に意味を持たせるのは最悪
485デフォルトの名無しさん
2025/10/30(木) 22:17:52.20ID:JG/b/82+ FOOやBARは例示で用いる昔からの慣習だよ
Rustの標準ライブラリのdocでも使われてるよ
Rustの標準ライブラリのdocでも使われてるよ
486デフォルトの名無しさん
2025/10/30(木) 23:31:49.22ID:Nj0jrilV 2進数に集合の意味をもたせるとか、方程式に図形の意味をもたせるとかね
487デフォルトの名無しさん
2025/10/31(金) 00:39:35.14ID:Z56C2bCz488デフォルトの名無しさん
2025/10/31(金) 01:23:46.44ID:UvKtMOZk #defineが嫌われていなければexpect云々を#defineするだけで解決するが
嫌われているのが現実?
いや、好感度など無視して解決可能というのが現実じゃないか
嫌われているのが現実?
いや、好感度など無視して解決可能というのが現実じゃないか
489デフォルトの名無しさん
2025/10/31(金) 01:26:08.34ID:VeWziky5 C/C++のクセで毎回、何かを確認しないといけないと思い込んでいるのかな?
490デフォルトの名無しさん
2025/10/31(金) 01:36:15.69ID:bL01KoQp LazyLockは変数宣言を見れば初期化のための式や関数を追える点でも可読性いいよな
491デフォルトの名無しさん
2025/10/31(金) 02:15:05.64ID:IDNiCq6B Cellを激推ししてた時代の複オジを思い出した
成長しないね
成長しないね
492デフォルトの名無しさん
2025/10/31(金) 03:52:17.44ID:VeWziky5 C++のように使いたい人間がいるから面倒なんだよなあ
493デフォルトの名無しさん
2025/10/31(金) 04:51:55.42ID:FXqlUjZZ 久しぶりにC++いじったら、依存ライブラリ管理がめんどくさすぎてキレそうになった
cargoはえらい
cmake大嫌い
cargoはえらい
cmake大嫌い
494デフォルトの名無しさん
2025/10/31(金) 07:07:09.98ID:W/94wpUF OnceLockやLazyLockを嫌いな人は代わりに何を使っているの?
495デフォルトの名無しさん
2025/10/31(金) 08:13:57.15ID:UvKtMOZk Mutex<Option<T>>
496デフォルトの名無しさん
2025/10/31(金) 08:16:32.55ID:W/94wpUF >>495
デタラメな回答はダメ
デタラメな回答はダメ
497デフォルトの名無しさん
2025/10/31(金) 08:43:37.37ID:zOlX52p0 初心に帰ろう
static mut FOO: MaybeUninit<Foo> = MaybeUninit::zeroed();
static mut FOO: MaybeUninit<Foo> = MaybeUninit::zeroed();
498デフォルトの名無しさん
2025/10/31(金) 08:47:38.08ID:W/94wpUF unsafeは論外
499デフォルトの名無しさん
2025/10/31(金) 11:44:05.74ID:UvKtMOZk デタラメがダメならやはり
ウソでも本当でもないポストモダンみたいな言葉を話すのが一つの手段なんだよな
ウソでも本当でもないポストモダンみたいな言葉を話すのが一つの手段なんだよな
500デフォルトの名無しさん
2025/10/31(金) 14:32:08.02ID:6Y8XYqCD501デフォルトの名無しさん
2025/10/31(金) 14:41:51.16ID:UvKtMOZk まあいいじゃんそういうの
レスを投稿する
ニュース
- 【速報】トランプ大統領、中国の習近平国家主席を「国賓」として招待することに ★2 [ニョキニョキ★]
- 日本と中国を結ぶ12航空路線で全便欠航 中国人に最も人気の海外旅行先は日本から韓国に [ぐれ★]
- 米中電話会談、トランプ氏は「米国側は中国にとっての台湾問題の重要性を理解する」 [1ゲットロボ★]
- 【東京・足立の車暴走】赤信号無視か 危険運転致死傷疑いも視野に捜査 逮捕された職業不詳の男性(37)は精神疾患で通院歴も ★3 [ぐれ★]
- 【音楽】「なんでこんなバカが国のトップなの?」 若者に人気のバンド「GEZAN」のマヒトゥ・ザ・ピーポーが高市総理に苦言 [シャチ★]
- 【国際】トランプ氏、来年4月に中国を訪問する招待を受け入れる 習氏も国賓で訪米へ 電話会談 [ぐれ★]
- 【高市悲報】来年、習近平主席がアメリカに「国賓」として訪米。どうするんだよ高市・・・アメリカも敵に回すのか? [483862913]
- 【悲報】有名配信者さん、公式大会で小学生の前で奇行して炎上して逆ギレwwwwwwwwwwwwwwwwww [856698234]
- フィフィ「外国人だろうが日本人だろうが反日は要らんのよ、この国に…自分にとって住みやすい国に行け。」 [856698234]
- 猟友会ハンター「警察や自衛隊の力を借りてのクマ駆除は大歓迎。肉の加工など 駆除の後についてもしっかりと話を進めてほしい」 [932029429]
- 【高市悲報】トランプおやびん「偉大な指導者である習近平首席、米国は中国にとっての台湾問題の重要性を理解しています」 [115996789]
- 4Kって綺麗か?
