公式
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 part25
https://mevius.5ch.net/test/read.cgi/tech/1722354386/
ワッチョイスレ
プログラミング言語 Rust 4【ワッチョイ】
https://mevius.5ch.net/test/read.cgi/tech/1514107621/
探検
Rust part26
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2024/09/20(金) 22:18:38.38ID:c48cFuZJ738デフォルトの名無しさん
2024/11/10(日) 20:16:38.46ID:tFJCBt9m >>735
>>661に適当にこれだけのmain足してvalgrindかけてみた
fn main() {
let s = "2021/07/04";
let (year, month, day) = yyyymmdd(s).unwrap();
println!("{}-{}-{}", year, month, day);
}
https://pastebin.com/UN84vEFb
まあ、リーク扱いで出るよね
こういうのがあんまり多いとマジのリークと区別付きづらくて大変そうだけど、なんかアノテーションみたいなので対策できたりするのかな?
>>661に適当にこれだけのmain足してvalgrindかけてみた
fn main() {
let s = "2021/07/04";
let (year, month, day) = yyyymmdd(s).unwrap();
println!("{}-{}-{}", year, month, day);
}
https://pastebin.com/UN84vEFb
まあ、リーク扱いで出るよね
こういうのがあんまり多いとマジのリークと区別付きづらくて大変そうだけど、なんかアノテーションみたいなので対策できたりするのかな?
739デフォルトの名無しさん
2024/11/10(日) 20:28:05.31ID:dkv1a77w >>738
サンクス
過去にC++で似たようなケースで顧客から「あなたの所のライブラリを使うとメモリリークが検出されるんだけど?」って指摘されたことがあって気になった
説明して伝わる相手なら良いけど、そういう面倒な人からのクレームを避けたい場合はstaticは避けたほうが良さそうだな
本質的には重要な問題でないと思うけども
サンクス
過去にC++で似たようなケースで顧客から「あなたの所のライブラリを使うとメモリリークが検出されるんだけど?」って指摘されたことがあって気になった
説明して伝わる相手なら良いけど、そういう面倒な人からのクレームを避けたい場合はstaticは避けたほうが良さそうだな
本質的には重要な問題でないと思うけども
740デフォルトの名無しさん
2024/11/10(日) 20:28:35.21ID:xIqOi7JH >>737
組み込み環境であろうとなかろうと各プログラムは終了する
さらにOS環境でOS内であっても各カーネルモジュールのプログラムはアンロードで終了する
一方でもし完全にモノリシックな一つのシステムなら終了後をそもそも考える必要がない
メモリアロケータについては自作したことあるなら管理してるメモリの全解放なんて楽勝だと理解できるだろ
割り当て用に確保しているバッファを返却するだけだ
組み込み環境であろうとなかろうと各プログラムは終了する
さらにOS環境でOS内であっても各カーネルモジュールのプログラムはアンロードで終了する
一方でもし完全にモノリシックな一つのシステムなら終了後をそもそも考える必要がない
メモリアロケータについては自作したことあるなら管理してるメモリの全解放なんて楽勝だと理解できるだろ
割り当て用に確保しているバッファを返却するだけだ
741デフォルトの名無しさん
2024/11/10(日) 20:52:25.18ID:Qvjt9L31 お前ら、Rustでプログラム書いた後にvalgrind ってるの?
もうそういうの終わりにしたいからRust使ってるんじゃないの?
もうそういうの終わりにしたいからRust使ってるんじゃないの?
742デフォルトの名無しさん
2024/11/10(日) 20:53:16.70ID:tFJCBt9m 相変らず単語ひとつひとつが独自用法すぎて解読が困難だね
mallocみたいなグローバルアロケータを自分で実装しようという話をしているのか?
それとも(allocator_apiがいまだにunstableなせいでボイラープレートモリモリ書かされる)typed_arenaやbumpaloのようなカスタムアロケータの話をしているのか?
前者だとしたらバッファという言葉が出てくるのがまず分からない、もしかしてヒープ領域全体のことをバッファと呼んでいて、確保/解放はsbrkのことを言っているのか?
後者だと「管理してるメモリの全解放」ですべての内容のDropしないといけなくて……って考えるとどう考えてもゲロクソむずいけど、全オブジェクトをManuallyDropに包んで返して責任放棄するのかな……
mallocみたいなグローバルアロケータを自分で実装しようという話をしているのか?
それとも(allocator_apiがいまだにunstableなせいでボイラープレートモリモリ書かされる)typed_arenaやbumpaloのようなカスタムアロケータの話をしているのか?
前者だとしたらバッファという言葉が出てくるのがまず分からない、もしかしてヒープ領域全体のことをバッファと呼んでいて、確保/解放はsbrkのことを言っているのか?
後者だと「管理してるメモリの全解放」ですべての内容のDropしないといけなくて……って考えるとどう考えてもゲロクソむずいけど、全オブジェクトをManuallyDropに包んで返して責任放棄するのかな……
743デフォルトの名無しさん
2024/11/10(日) 20:56:00.86ID:tFJCBt9m >>741
できねーもんはできねーんだから適切な道具を使うんだよ、笑うならそこの嘘吐き宣教師を笑うんだな
できねーもんはできねーんだから適切な道具を使うんだよ、笑うならそこの嘘吐き宣教師を笑うんだな
744デフォルトの名無しさん
2024/11/10(日) 21:08:26.24ID:xIqOi7JH >>742
プログラム本体終了後のメモリ解放のためにdropは必要ない
プログラム全体終了後のメモリリークが組み込みなどで困るケースが対象なのだからそれらメモリを返却するだけでよい
sbrkのあるOS環境ならsbrkでOSへ全メモリを返還できるのはその通りだが
それをしなくてもプログラム終了後にメモリリークは起きないので普通のアロケータでは行われていない
メモリリークが起きうる特殊なOSや組み込みならアロケータが借りてるメモリを全返却すればよい
プログラム本体終了後のメモリ解放のためにdropは必要ない
プログラム全体終了後のメモリリークが組み込みなどで困るケースが対象なのだからそれらメモリを返却するだけでよい
sbrkのあるOS環境ならsbrkでOSへ全メモリを返還できるのはその通りだが
それをしなくてもプログラム終了後にメモリリークは起きないので普通のアロケータでは行われていない
メモリリークが起きうる特殊なOSや組み込みならアロケータが借りてるメモリを全返却すればよい
745デフォルトの名無しさん
2024/11/10(日) 21:16:26.31ID:tFJCBt9m >>744
んでどっちのアロケータの話をしてるの?って
んでどっちのアロケータの話をしてるの?って
746デフォルトの名無しさん
2024/11/10(日) 21:22:25.58ID:xIqOi7JH >>745
普通の仮想メモリOS環境ならstaticでもBox::leakでもプログラム終了後にメモリリークは起きないから対策の必要がない
そうでない特殊なOSや組み込み環境ならばそれ用に用意するメモリアロケータをプログラム終了直前に呼び出して全メモリ返却させればメモリリークは起きない
普通の仮想メモリOS環境ならstaticでもBox::leakでもプログラム終了後にメモリリークは起きないから対策の必要がない
そうでない特殊なOSや組み込み環境ならばそれ用に用意するメモリアロケータをプログラム終了直前に呼び出して全メモリ返却させればメモリリークは起きない
747デフォルトの名無しさん
2024/11/10(日) 21:35:16.61ID:tFJCBt9m748デフォルトの名無しさん
2024/11/10(日) 21:41:49.64ID:tFJCBt9m 少なくともvalgrindとかperfmonみたいなやつは、プログラム終了時にヒープを辿って解放済みマークの無い場所を見つけたらリークって報告するんだし、一般的にはそれがリークだよ
プロセス終了時にメモリマップの割り当てが解除されるとか、どうでもええわ
プロセス終了時にメモリマップの割り当てが解除されるとか、どうでもええわ
749デフォルトの名無しさん
2024/11/10(日) 21:48:10.22ID:xIqOi7JH >>747
Rustでは#[global_allocator]指定でカスタムなグローバルアロケータを使える
プログラム終了後にメモリリークが起きうる組み込み環境なら対応した自作のアロケータを実装してそのように指定して用いる
Rustでは#[global_allocator]指定でカスタムなグローバルアロケータを使える
プログラム終了後にメモリリークが起きうる組み込み環境なら対応した自作のアロケータを実装してそのように指定して用いる
750デフォルトの名無しさん
2024/11/10(日) 22:10:00.14ID:E3OFY7Tp >>729
May I talk about the ownership reproduction in the formal community web page?
May I talk about the ownership reproduction in the formal community web page?
751デフォルトの名無しさん
2024/11/10(日) 22:15:02.72ID:tFJCBt9m > プログラム終了後にメモリリークが起きうる組み込み環境
組み込みやったことないから知らんけど、そんな環境があんの?
組み込みやったことないから知らんけど、そんな環境があんの?
752デフォルトの名無しさん
2024/11/10(日) 22:27:44.25ID:tFJCBt9m https://github.com/rust-embedded/embedded-alloc
組み込みの典型的なコードってこのREADMEのサンプルコードみたいなんでいいのかね
プログラム(main)は終了しない
ヒープの「解放」処理も無い
合ってるよな?
自由に使える物理アドレス空間の一部を実行時アロケーションのために使用するってだけなら、使い終わりにやる「解放」の処理というのは何の話を言ってるんだ? って思ってたけど
そんなものはない、で合ってるのよな?
組み込みの典型的なコードってこのREADMEのサンプルコードみたいなんでいいのかね
プログラム(main)は終了しない
ヒープの「解放」処理も無い
合ってるよな?
自由に使える物理アドレス空間の一部を実行時アロケーションのために使用するってだけなら、使い終わりにやる「解放」の処理というのは何の話を言ってるんだ? って思ってたけど
そんなものはない、で合ってるのよな?
753デフォルトの名無しさん
2024/11/10(日) 22:31:44.37ID:tFJCBt9m >>750
search first
search first
754デフォルトの名無しさん
2024/11/10(日) 22:33:46.00ID:xIqOi7JH >>751
そういう特殊な環境を出してるのは俺ではないからね
すべてを明示的に解放しなくても我々が普通に使っている仮想メモリ利用では問題ないよという話と
組み込みだとそんな仮定はできなくてメモリリークしていく可能性があるよという話の両方が出ているから
後者でも対応したメモリアロケータを用意すれば対応できるよと解決策を示した
そういう特殊な環境を出してるのは俺ではないからね
すべてを明示的に解放しなくても我々が普通に使っている仮想メモリ利用では問題ないよという話と
組み込みだとそんな仮定はできなくてメモリリークしていく可能性があるよという話の両方が出ているから
後者でも対応したメモリアロケータを用意すれば対応できるよと解決策を示した
755デフォルトの名無しさん
2024/11/10(日) 22:41:08.35ID:E3OFY7Tp >>753
What do you mean? What I want to do is talking and having a discussion, not searching.
What do you mean? What I want to do is talking and having a discussion, not searching.
756デフォルトの名無しさん
2024/11/10(日) 22:48:01.15ID:tFJCBt9m757デフォルトの名無しさん
2024/11/10(日) 23:04:28.91ID:nOHdM7oG プログラムの最後に行儀よくbrkやsbrkでOSへメモリを解放しているアロケーターを見たことないな
OSにとってはどうでもいいことだからそんな行儀よさは不要なのだろう
ましてやアロケーターの内部でフラグなどをオフにするだけのfree()はプログラムの最後にいらない
実行中に再利用できるようにするかどうかが本質だろうね
OSにとってはどうでもいいことだからそんな行儀よさは不要なのだろう
ましてやアロケーターの内部でフラグなどをオフにするだけのfree()はプログラムの最後にいらない
実行中に再利用できるようにするかどうかが本質だろうね
758デフォルトの名無しさん
2024/11/10(日) 23:16:52.46ID:tFJCBt9m えーではリークの定義に関して直接的反論はなしということで
以下はすべて誤りであったということでよろしいですね
対戦ありがとうございました
>>593「freeせずにプログラムが終了したり落ちたりしてもメモリリークは起きない」
>>604「freeを忘れてもあるいはfreeせぬまま異常終了となってもその仕組みによりメモリリークは起きない」
>>631「そしてfree()せずにプログラムが終了してもメモリリークは起きない」
>>744「sbrkのあるOS環境ならsbrkでOSへ全メモリを返還できるのはその通りだがそれをしなくてもプログラム終了後にメモリリークは起きない」
>>746「普通の仮想メモリOS環境ならstaticでもBox::leakでもプログラム終了後にメモリリークは起きない」
「そうでない特殊なOSや組み込み環境ならばそれ用に用意するメモリアロケータをプログラム終了直前に呼び出して全メモリ返却させればメモリリークは起きない」
以下はすべて誤りであったということでよろしいですね
対戦ありがとうございました
>>593「freeせずにプログラムが終了したり落ちたりしてもメモリリークは起きない」
>>604「freeを忘れてもあるいはfreeせぬまま異常終了となってもその仕組みによりメモリリークは起きない」
>>631「そしてfree()せずにプログラムが終了してもメモリリークは起きない」
>>744「sbrkのあるOS環境ならsbrkでOSへ全メモリを返還できるのはその通りだがそれをしなくてもプログラム終了後にメモリリークは起きない」
>>746「普通の仮想メモリOS環境ならstaticでもBox::leakでもプログラム終了後にメモリリークは起きない」
「そうでない特殊なOSや組み込み環境ならばそれ用に用意するメモリアロケータをプログラム終了直前に呼び出して全メモリ返却させればメモリリークは起きない」
759デフォルトの名無しさん
2024/11/10(日) 23:26:36.38ID:mfp7bShs static mutは明らかにunsafeなわけだが
紙一重でunsafeとは言えないstatic変数のことを
警戒するかそれとも無駄な警備を極限まで捨てた合理主義の皇帝みたいに思うか
そういう対立はよくある
紙一重でunsafeとは言えないstatic変数のことを
警戒するかそれとも無駄な警備を極限まで捨てた合理主義の皇帝みたいに思うか
そういう対立はよくある
760デフォルトの名無しさん
2024/11/10(日) 23:33:02.28ID:xIqOi7JH プログラム終了後にメモリリークが起きるとすればOSが面倒をみてくれない環境だけだから
そういう環境では特殊な専用のメモリアロケータを用意するしかないだろうね
それならその自作のメモリアロケータをプログラム終了時に呼んで後始末させればメモリリークは防げる
Rustのstaticでヒープを持つ型を使っても最後まで使うメモリをBox::leak()で確保してもメモリリークは起こらないので安心していい
そういう環境では特殊な専用のメモリアロケータを用意するしかないだろうね
それならその自作のメモリアロケータをプログラム終了時に呼んで後始末させればメモリリークは防げる
Rustのstaticでヒープを持つ型を使っても最後まで使うメモリをBox::leak()で確保してもメモリリークは起こらないので安心していい
761デフォルトの名無しさん
2024/11/11(月) 00:17:42.59ID:4hLj+VPf Windows/Linux/macOSあたりなら
ファイルハンドルを閉じずにプログラム終了しても
OSが閉じてくれるから何の問題もない
的な主張?
ファイルハンドルを閉じずにプログラム終了しても
OSが閉じてくれるから何の問題もない
的な主張?
762デフォルトの名無しさん
2024/11/11(月) 00:20:13.67ID:VUm74iyn > プログラム終了後にメモリリークが起きるとすればOSが面倒をみてくれない環境
また実在しない環境の話し始めた
また実在しない環境の話し始めた
763デフォルトの名無しさん
2024/11/11(月) 00:28:54.94ID:VUm74iyn 間違いを認めなくても勝手にすりゃいいけど、そんなんじゃ誰とも意思疎通できないままだぞ
いくら長文を書き連ねても一緒
いくら長文を書き連ねても一緒
764デフォルトの名無しさん
2024/11/11(月) 00:56:28.26ID:If7GINDb 2種類ある
OSレベルのclose (例えばC言語でのシステムコールを呼ぶclose()) ならばOSが処理してくれるので異常終了含めてプログラム終了時にcloseしていなくても構わない
ただし各言語ライブラリのバッファリングなど他の機能を持つcloseはプログラム終了までに自分でcloseしないとその機能が完遂しない
一方でメモリ解放の場合
OSレベルのメモリ解放 (例えばbrk/sbrk) ならばOSがそのプログラムの仮想メモリ全体を無効にするのでプログラム終了時に解放していなくても構わない
メモリアロケーターライブラリのレベルのメモリ解放 (例えばfree()) もOSにとっては全く無関係な話なのでプログラム終了時に解放していなくても構わない
OSレベルのclose (例えばC言語でのシステムコールを呼ぶclose()) ならばOSが処理してくれるので異常終了含めてプログラム終了時にcloseしていなくても構わない
ただし各言語ライブラリのバッファリングなど他の機能を持つcloseはプログラム終了までに自分でcloseしないとその機能が完遂しない
一方でメモリ解放の場合
OSレベルのメモリ解放 (例えばbrk/sbrk) ならばOSがそのプログラムの仮想メモリ全体を無効にするのでプログラム終了時に解放していなくても構わない
メモリアロケーターライブラリのレベルのメモリ解放 (例えばfree()) もOSにとっては全く無関係な話なのでプログラム終了時に解放していなくても構わない
765デフォルトの名無しさん
2024/11/11(月) 01:04:17.69ID:S8QwpOFj 組み込みは詳しくないんだが今ってOSを使わない
組み込みでRustとか使うの?
Rustのターゲットって多分何らかのOSありきだよね
組み込みでRustとか使うの?
Rustのターゲットって多分何らかのOSありきだよね
766デフォルトの名無しさん
2024/11/11(月) 01:08:33.73ID:BN15+aOP >>765
語尾にオジを付けな
語尾にオジを付けな
767デフォルトの名無しさん
2024/11/11(月) 01:10:52.04ID:S8QwpOFj マ板久々なので意味がわからないww
768デフォルトの名無しさん
2024/11/11(月) 01:11:20.28ID:S8QwpOFj webassemblyもなんか微妙な感じだしもったいない
769デフォルトの名無しさん
2024/11/11(月) 01:13:05.34ID:BN15+aOP770デフォルトの名無しさん
2024/11/11(月) 01:16:21.72ID:S8QwpOFj すまんのうww
771デフォルトの名無しさん
2024/11/11(月) 01:27:50.38ID:If7GINDb >>765
OS無しにも対応している
Rustの標準ライブラリstd::はOS前提の機能も入っていてOS無しだと機能しないものもある
Rustの必須な言語機能はcore::ライブラリに部分に分離してまとめてあるので
ベアメタルな組み込みなどではstd::を使わない#![no-std]を指定してcore::を使う
core::では数値型や配列やスライスに文字列(str)およびその複合型が使えるがヒープは対象外なのでVecやStringは標準機能としては使えないといった違いがある
OS無しにも対応している
Rustの標準ライブラリstd::はOS前提の機能も入っていてOS無しだと機能しないものもある
Rustの必須な言語機能はcore::ライブラリに部分に分離してまとめてあるので
ベアメタルな組み込みなどではstd::を使わない#![no-std]を指定してcore::を使う
core::では数値型や配列やスライスに文字列(str)およびその複合型が使えるがヒープは対象外なのでVecやStringは標準機能としては使えないといった違いがある
772デフォルトの名無しさん
2024/11/11(月) 01:31:24.31ID:If7GINDb773デフォルトの名無しさん
2024/11/11(月) 01:32:59.90ID:BN15+aOP774デフォルトの名無しさん
2024/11/11(月) 07:39:38.28ID:P9CdfRTw775デフォルトの名無しさん
2024/11/11(月) 09:19:55.92ID:S9DN3uey >727
rustの質問するならclaude ai 3.5 sonetが圧倒的に優秀よ。
rustの質問するならclaude ai 3.5 sonetが圧倒的に優秀よ。
776デフォルトの名無しさん
2024/11/11(月) 12:55:36.23ID:Bg57iHzA In the rust forum, we have to use English. How can I say “複おじ”? “Reproduction codger”?
777デフォルトの名無しさん
2024/11/11(月) 13:34:10.78ID:RXw/cl7Z778デフォルトの名無しさん
2024/11/11(月) 13:55:19.20ID:kpiTidm5 RustというかCargoの質問なんだけど
crates.ioにリリースしてるもので
一つのcrateでバージョンがいくつかあって
最新のバージョンだけ残して他全部yankedにしてるのに
閲覧回数レポート(crateトップページの下の方の折れ線グラフ)で
yankedされてるバージョンがいつまでもアクセスがあって増え続けて
最新の方がそっちの勢いほどには増えてない
どういう原因が考えられる?
crates.ioにリリースしてるもので
一つのcrateでバージョンがいくつかあって
最新のバージョンだけ残して他全部yankedにしてるのに
閲覧回数レポート(crateトップページの下の方の折れ線グラフ)で
yankedされてるバージョンがいつまでもアクセスがあって増え続けて
最新の方がそっちの勢いほどには増えてない
どういう原因が考えられる?
779デフォルトの名無しさん
2024/11/11(月) 14:34:31.51ID:xigD4A3Y >>778
単純にyankされたバージョン使ってる(つまりCargo.lockにそのバージョンが載ってる)ユーザが多いってだけでは?
yankしたからといって既存のユーザが使用禁止になるわけではないので
単純にyankされたバージョン使ってる(つまりCargo.lockにそのバージョンが載ってる)ユーザが多いってだけでは?
yankしたからといって既存のユーザが使用禁止になるわけではないので
780デフォルトの名無しさん
2024/11/11(月) 22:49:05.67ID:MbvyOF01 >>551
Rustはリファクタリングや機能拡張保守などに適した言語と言われている
強力な静的型付け、借用チェック、参照競合チェック、メモリ競合チェックなどによりコードが思わず壊れることを防ぐとともに
問題点を実行時エラーや実行時デバッグへと遅らせてしまうことを最も少なくしてくれる言語である
そのため全体の開発変更時間が他の言語より短く済んでいる
また、トレイトとトレイト境界による自然なジェネリック化がレイヤー分離独立と最小限の変更での機能追加を容易にしている
どうしてもトレイト設計をし直さなければならない大規模改修の場合でも、上述のように盤石に機能するコードとするまでが早い
Rustはリファクタリングや機能拡張保守などに適した言語と言われている
強力な静的型付け、借用チェック、参照競合チェック、メモリ競合チェックなどによりコードが思わず壊れることを防ぐとともに
問題点を実行時エラーや実行時デバッグへと遅らせてしまうことを最も少なくしてくれる言語である
そのため全体の開発変更時間が他の言語より短く済んでいる
また、トレイトとトレイト境界による自然なジェネリック化がレイヤー分離独立と最小限の変更での機能追加を容易にしている
どうしてもトレイト設計をし直さなければならない大規模改修の場合でも、上述のように盤石に機能するコードとするまでが早い
781デフォルトの名無しさん
2024/11/11(月) 22:59:26.02ID:8PeapwRR 借用まわりで質問させてくれ
struct Foo {
data: Option<Vec<u8>>
}
impl Foo {
fn do_something(&mut self) -> &mut [u8] {
if let Some(x) = &mut self.data {
return x;
}
// `self.data` is assigned to here but it was already borrowed
self.data = Some(vec![0u8; 10]);
self.data.as_mut().unwrap()
}
}
これで self.data への代入の際に「既に借用されている」というエラーが出るんだけど、これって回避できない?
最初の借用が if let Some(x) = ... の箇所で行われていることは理解できるんだけど、
if let のスコープを抜けても借用された状態が続く (以降のコードでの借用ができない) のが腑に落ちない
struct Foo {
data: Option<Vec<u8>>
}
impl Foo {
fn do_something(&mut self) -> &mut [u8] {
if let Some(x) = &mut self.data {
return x;
}
// `self.data` is assigned to here but it was already borrowed
self.data = Some(vec![0u8; 10]);
self.data.as_mut().unwrap()
}
}
これで self.data への代入の際に「既に借用されている」というエラーが出るんだけど、これって回避できない?
最初の借用が if let Some(x) = ... の箇所で行われていることは理解できるんだけど、
if let のスコープを抜けても借用された状態が続く (以降のコードでの借用ができない) のが腑に落ちない
782デフォルトの名無しさん
2024/11/11(月) 23:19:09.36ID:PqwBaVS/ >>781
fn do_something(&mut self) -> &mut [u8] {
if self.data.is_none() {
self.data = Some(vec![0u8; 10]);
}
self.data.as_mut().unwrap()
}
fn do_something(&mut self) -> &mut [u8] {
if self.data.is_none() {
self.data = Some(vec![0u8; 10]);
}
self.data.as_mut().unwrap()
}
783デフォルトの名無しさん
2024/11/11(月) 23:31:21.84ID:VT05MWRT >>774
Static items do not call drop at the end of the program.
https://doc.rust-lang.org/reference/items/static-items.html
Drop types placed in statics WILL leak.
https://github.com/rust-lang/rfcs/pull/1440
Static items do not call drop at the end of the program.
https://doc.rust-lang.org/reference/items/static-items.html
Drop types placed in statics WILL leak.
https://github.com/rust-lang/rfcs/pull/1440
784デフォルトの名無しさん
2024/11/11(月) 23:46:08.88ID:8PeapwRR785デフォルトの名無しさん
2024/11/11(月) 23:52:53.38ID:PqwBaVS/ staticはモジュールアンロードする可能性があるなら始末する時に手動dropできるように対処するしかないな
アンロードしないなら問題なし
アンロードしないなら問題なし
786デフォルトの名無しさん
2024/11/12(火) 00:02:28.18ID:h5v4AbHm >>782
えーとOptionがnoneのとき値を入れたいという場合はもっと簡単に書けて
fn do_something()->&mut [u8] {
self.get_or_insert(vec![1,2,3])
}
という感じ。
えーとOptionがnoneのとき値を入れたいという場合はもっと簡単に書けて
fn do_something()->&mut [u8] {
self.get_or_insert(vec![1,2,3])
}
という感じ。
787デフォルトの名無しさん
2024/11/12(火) 00:12:38.06ID:syNPHnUf >>781
&mut self.dataにも所有者がある
この匿名の所有者の寿命を'a
型を&'b mut T
とする
'bは'aより長いから'aがいくら短くても、借用された状態が続く
匿名をやめて名前をつければその名前でアクセスできる
&mut self.dataにも所有者がある
この匿名の所有者の寿命を'a
型を&'b mut T
とする
'bは'aより長いから'aがいくら短くても、借用された状態が続く
匿名をやめて名前をつければその名前でアクセスできる
788デフォルトの名無しさん
2024/11/12(火) 00:13:32.91ID:crz7XiUG なるほど、リークしちゃうんだ。
789デフォルトの名無しさん
2024/11/12(火) 00:50:59.75ID:d/AkYtUw get_mut OR (insert AND get_mut)を
1ステップにまとめるのは気持ち悪いな
1ステップにまとめていいなら
最初からデフォルト値を入れといてもいいのでは?
1ステップにまとめるのは気持ち悪いな
1ステップにまとめていいなら
最初からデフォルト値を入れといてもいいのでは?
790デフォルトの名無しさん
2024/11/12(火) 02:10:28.31ID:9at7I+bi791デフォルトの名無しさん
2024/11/12(火) 03:23:50.67ID:SFBl6mVs >>781
この辺のルールかなって思ったけど正直分からん
https://doc.rust-lang.org/reference/destructors.html
return x;をpanic!()に変えるとコンパイル通ってしまうのはどこかに明確な説明があるかね……
この辺のルールかなって思ったけど正直分からん
https://doc.rust-lang.org/reference/destructors.html
return x;をpanic!()に変えるとコンパイル通ってしまうのはどこかに明確な説明があるかね……
792デフォルトの名無しさん
2024/11/12(火) 03:24:11.27ID:SFBl6mVs >>781
drop scopeの決定時に制御フローは考慮されないってことなのかなって思ったけど正直分からなくなってきた
https://doc.rust-lang.org/reference/destructors.html
return x;をpanic!()に変えるとコンパイル通ってしまうのはどこかに明確な説明があるかね……
drop scopeの決定時に制御フローは考慮されないってことなのかなって思ったけど正直分からなくなってきた
https://doc.rust-lang.org/reference/destructors.html
return x;をpanic!()に変えるとコンパイル通ってしまうのはどこかに明確な説明があるかね……
793デフォルトの名無しさん
2024/11/12(火) 07:26:38.88ID:7hmoxDUg >>789
複おじの発想が気持ち悪い
複おじの発想が気持ち悪い
794デフォルトの名無しさん
2024/11/12(火) 10:15:49.34ID:m541/0mz >>781
省略せずに書くと
fn do_something<‘a>(&’a mut self) -> &’a mut [u8]
return xするとxのライフタイムは’a
xは&mut self.dataの一部なので&mut self.dataのライフタイムも’a
‘aのライフタイムに渡って&mut self.dataを借りておく必要があると解釈されるので
self.data = Some(vec![0u8; 10]);はエラーになる
マッチしない場合は借りないようにしてくれよと思うのはわかるが
これは今のバージョンのボローチェッカーの制約
nightlyで使える新しいボローチェッカーならエラーにならない
詳しいのは↓ここ
https://rust-lang.github.io/rfcs/2094-nll.html#problem-case-3-conditional-control-flow-across-functions
省略せずに書くと
fn do_something<‘a>(&’a mut self) -> &’a mut [u8]
return xするとxのライフタイムは’a
xは&mut self.dataの一部なので&mut self.dataのライフタイムも’a
‘aのライフタイムに渡って&mut self.dataを借りておく必要があると解釈されるので
self.data = Some(vec![0u8; 10]);はエラーになる
マッチしない場合は借りないようにしてくれよと思うのはわかるが
これは今のバージョンのボローチェッカーの制約
nightlyで使える新しいボローチェッカーならエラーにならない
詳しいのは↓ここ
https://rust-lang.github.io/rfcs/2094-nll.html#problem-case-3-conditional-control-flow-across-functions
795デフォルトの名無しさん
2024/11/12(火) 10:22:11.79ID:m541/0mz if self.data.is_some() {
return self.data.as_mut().unwrap();
}
や
if let Some(ref mut x) = self.data {
return x;
}
でも
エラーにならない
return self.data.as_mut().unwrap();
}
や
if let Some(ref mut x) = self.data {
return x;
}
でも
エラーにならない
796デフォルトの名無しさん
2024/11/12(火) 10:23:41.85ID:m541/0mz >>793
複おじではないよ
複おじではないよ
797デフォルトの名無しさん
2024/11/12(火) 11:06:54.00ID:POGIqTjB798デフォルトの名無しさん
2024/11/12(火) 11:26:31.07ID:syNPHnUf 仇討ちして英雄になりたいのか
とんでもねえ話だなこれ
とんでもねえ話だなこれ
799デフォルトの名無しさん
2024/11/12(火) 13:38:59.51ID:DUnFCq7X >>797
-Z poloniusで通る
-Z poloniusで通る
800デフォルトの名無しさん
2024/11/12(火) 14:07:23.60ID:SFBl6mVs801デフォルトの名無しさん
2024/11/12(火) 18:29:56.22ID:03t9MEqY >>781
左右の型が一致しない(右だけ参照)この部分を
if let Some(x) = &mut self.data {
昔からの正規にrefを使って左右の型を一致させて
if let Some(ref mut x) = self.data {
こう書けばコンパイル通る点は興味深いな
左右の型が一致しない(右だけ参照)この部分を
if let Some(x) = &mut self.data {
昔からの正規にrefを使って左右の型を一致させて
if let Some(ref mut x) = self.data {
こう書けばコンパイル通る点は興味深いな
802デフォルトの名無しさん
2024/11/12(火) 22:58:43.29ID:lrdX5dtV どうしてこのプログラムがコンパイル通るのかがわからん
明らかにyの寿命はxより短いはずなのに、xより長生きすることが仮定された引数にyを渡したらエラーになるはずでは?
x,yの型をどういうのに変えたらこれをエラーにすることができる?
fn test<'a, 'b:'a> (_x:&'a (), _y:&'b ()) {
}
fn main() {
let x = ();
{
let y = ();
test(&x,&y);
}
}
明らかにyの寿命はxより短いはずなのに、xより長生きすることが仮定された引数にyを渡したらエラーになるはずでは?
x,yの型をどういうのに変えたらこれをエラーにすることができる?
fn test<'a, 'b:'a> (_x:&'a (), _y:&'b ()) {
}
fn main() {
let x = ();
{
let y = ();
test(&x,&y);
}
}
803デフォルトの名無しさん
2024/11/13(水) 00:44:01.02ID:on0r5hse 貸し借りの実態を操作したつもりが、「借りられるのに誰も借りてない」状態が続いただけで
実態が変わらなければエラーも起きない
実態が変わらなければエラーも起きない
804デフォルトの名無しさん
2024/11/13(水) 01:07:05.96ID:04hNMT1D Rust信者って、説教くさいよね。
805デフォルトの名無しさん
2024/11/13(水) 01:22:28.48ID:DQQnUk/3 急にどしたの?
806デフォルトの名無しさん
2024/11/13(水) 02:11:38.53ID:lxEAsUm8 >>802
test画最適化されて消えてるんだろう
test画最適化されて消えてるんだろう
807デフォルトの名無しさん
2024/11/13(水) 08:18:30.90ID:DDTh9MDd >>803
変更を加えるとしたらどうしたらいいですか?
変更を加えるとしたらどうしたらいいですか?
808デフォルトの名無しさん
2024/11/13(水) 08:30:57.78ID:xIctxtN4 国内では生成AIに話題を奪われてハイプがめっきり落ち着いた感があるな
世界的には中華圏を中心にまだまだ上昇の余地がありそうだが、国内では残念ながら一部のアーリーアダプタが騒いだだけの言語で終わりそうだ
世界的には中華圏を中心にまだまだ上昇の余地がありそうだが、国内では残念ながら一部のアーリーアダプタが騒いだだけの言語で終わりそうだ
809デフォルトの名無しさん
2024/11/13(水) 08:46:31.60ID:18dRnPdZ 米ホワイトハウス「ソフトウェアはメモリ安全でなければならない」との声明を発表:「C」「C++」よりも「Rust」などの言語を推奨
https://atmarkit.itmedia.co.jp/ait/articles/2403/18/news045.html
米国国防総省のDARPA、CからRustへのコード変換を自動化する「TRACTOR」プログラムを開始
https://atmarkit.itmedia.co.jp/ait/spv/2408/14/news045.html
https://atmarkit.itmedia.co.jp/ait/articles/2403/18/news045.html
米国国防総省のDARPA、CからRustへのコード変換を自動化する「TRACTOR」プログラムを開始
https://atmarkit.itmedia.co.jp/ait/spv/2408/14/news045.html
810デフォルトの名無しさん
2024/11/13(水) 09:16:26.38ID:T0htHWVn お
refの出番あるじゃん
コンパイラのsuggestちゃんとしてくれよ
refの出番あるじゃん
コンパイラのsuggestちゃんとしてくれよ
811デフォルトの名無しさん
2024/11/13(水) 09:17:25.81ID:T0htHWVn >>807
変更を加えるには変更を加えれば良い
変更を加えるには変更を加えれば良い
812デフォルトの名無しさん
2024/11/13(水) 09:19:24.12ID:T0htHWVn813デフォルトの名無しさん
2024/11/13(水) 09:22:11.31ID:on0r5hse814デフォルトの名無しさん
2024/11/13(水) 09:43:08.15ID:QAOz5ViO >>802
x,yのスコープと&x,&yのライフタイムを混同してるように見える
fn test<'a, 'b: 'a>(x: &'a (), y: &'b ()) -> (&'b (), &'b ()){
(x, y)
}
とすれば’a: ‘bがなければ関数単体でエラー
fn test<'a, 'b: 'a>(x: &'a (), y: &'b ()) -> (&'a (), &'a ()){
(x, y)
}
fn main() {
let x = ();
let result: (&(), &());
{
let y = ();
result = test(&x, &y);
}
println!("{:?}", result);
}
↑のように&yのborrowをyのスコープを越えて利用すればエラー
でもこの場合の関数定義は’bを使わず全部’aにしても何も変わらない
x,yのスコープと&x,&yのライフタイムを混同してるように見える
fn test<'a, 'b: 'a>(x: &'a (), y: &'b ()) -> (&'b (), &'b ()){
(x, y)
}
とすれば’a: ‘bがなければ関数単体でエラー
fn test<'a, 'b: 'a>(x: &'a (), y: &'b ()) -> (&'a (), &'a ()){
(x, y)
}
fn main() {
let x = ();
let result: (&(), &());
{
let y = ();
result = test(&x, &y);
}
println!("{:?}", result);
}
↑のように&yのborrowをyのスコープを越えて利用すればエラー
でもこの場合の関数定義は’bを使わず全部’aにしても何も変わらない
815デフォルトの名無しさん
2024/11/13(水) 17:49:14.41ID:6VxXcvJp >>727
最近上がった孫さんの動画だと最新のchatgptはいいみたいだよ
最近上がった孫さんの動画だと最新のchatgptはいいみたいだよ
816デフォルトの名無しさん
2024/11/13(水) 19:43:07.11ID:hOqFwLmf コードの生成なら Claude ai にしておけって。
817デフォルトの名無しさん
2024/11/14(木) 00:17:38.18ID:KXRqkFBN >>815
こないだ試してみたら、さほど良くなってないみたいだったが。
こないだ試してみたら、さほど良くなってないみたいだったが。
818デフォルトの名無しさん
2024/11/14(木) 04:49:13.06ID:yxSXUQjo Claude ai 無料でも有能で笑った
819デフォルトの名無しさん
2024/11/14(木) 09:48:02.77ID:ftI5Ceve >>817
それはバージョン o1 だった?
それはバージョン o1 だった?
820デフォルトの名無しさん
2024/11/14(木) 17:17:13.60ID:9ejC22ly >>819
ChatGPTではなく、OpenAI o1 のことかいな?
ChatGPTではなく、OpenAI o1 のことかいな?
821デフォルトの名無しさん
2024/11/14(木) 20:42:25.26ID:ftI5Ceve すまん、違うものだったか
孫さんの動画でGPTの次のバージョンのような扱いしてたので同じかと思ってた
孫さんの動画でGPTの次のバージョンのような扱いしてたので同じかと思ってた
822デフォルトの名無しさん
2024/11/16(土) 05:20:14.39ID:Heg70qiV アメリカ政府が「安全な言語を強制する」姿勢は、
「規制」だね。それによりC/C++だけが排除される。
ずる賢い連中だ。日本の半導体もそれで駄目になった。
「規制」だね。それによりC/C++だけが排除される。
ずる賢い連中だ。日本の半導体もそれで駄目になった。
823デフォルトの名無しさん
2024/11/16(土) 06:03:12.01ID:KjVWfR2g824デフォルトの名無しさん
2024/11/16(土) 06:40:57.58ID:Oydl0g71 時間ライブラリ、chrono使いにくいなーと思ってtimeに乗り換えたけど
メンテ状態がいまいちだし、変な仕様がいくつもあるなーと悩んでた
今日 jiff を見つけて試してみたら、とても使いやすい
設計のベースがjsのTemporalということもあり、変な独自仕様が少なそう
作者が有名人だし、今後も期待できる
ただちょっとバイナリサイズが大きめかな
メンテ状態がいまいちだし、変な仕様がいくつもあるなーと悩んでた
今日 jiff を見つけて試してみたら、とても使いやすい
設計のベースがjsのTemporalということもあり、変な独自仕様が少なそう
作者が有名人だし、今後も期待できる
ただちょっとバイナリサイズが大きめかな
825デフォルトの名無しさん
2024/11/16(土) 09:37:53.01ID:buoPSpZk826デフォルトの名無しさん
2024/11/16(土) 14:25:13.85ID:YZsYA2TA プロが一番使っている言語であるところのC/C++だけが、
アメリカ当局の鶴の一声で潰されようとしている。
アメリカ当局の鶴の一声で潰されようとしている。
827デフォルトの名無しさん
2024/11/16(土) 14:55:20.01ID:KjVWfR2g 欠陥言語C/C++が一掃されるのは良いこと
無知と怠惰が欠陥言語にしがみつく
無知と怠惰が欠陥言語にしがみつく
828デフォルトの名無しさん
2024/11/16(土) 15:50:00.42ID:YZsYA2TA 市場やソフトウェア業界のプログラマや個々の経営者が決める
べきであり、政府が強制すべきではない。
べきであり、政府が強制すべきではない。
829デフォルトの名無しさん
2024/11/16(土) 16:25:18.89ID:/+LxZ+59 サイコパスは「痛みを伴う失敗」から学習できない!
2024.11.15
nazology.kusuguru.co.jp/archives/165730
「パワハラ上司が生き残る条件」みんな●●だった!
2024.07.12
nazology.net/archives/156599
2024.11.15
nazology.kusuguru.co.jp/archives/165730
「パワハラ上司が生き残る条件」みんな●●だった!
2024.07.12
nazology.net/archives/156599
830デフォルトの名無しさん
2024/11/16(土) 16:50:05.47ID:vdtMtO4q831デフォルトの名無しさん
2024/11/16(土) 16:59:51.39ID:YZsYA2TA832デフォルトの名無しさん
2024/11/16(土) 18:31:49.86ID:Pw6hvHrk 欠陥言語使わないといけない世界は改善したほうが良い
833デフォルトの名無しさん
2024/11/16(土) 18:48:21.70ID:buoPSpZk >>828
別に法律で何時までにどうしろと決めたわけでもないので好きにすればいいけど、技術力が無い会社は置いてかれる、それだけの事よ。
別に法律で何時までにどうしろと決めたわけでもないので好きにすればいいけど、技術力が無い会社は置いてかれる、それだけの事よ。
834デフォルトの名無しさん
2024/11/16(土) 20:55:43.27ID:KjVWfR2g 全盛を極めていたプログラミング言語たちが情勢の変化により落ちていった
今回はC++の番
今回はC++の番
835デフォルトの名無しさん
2024/11/16(土) 21:01:25.26ID:ri7JcYNG 特定の言語使うことを技術力と思うのは勘違いな
たいした価値を生まない
たいした価値を生まない
836デフォルトの名無しさん
2024/11/16(土) 21:26:15.37ID:M8rnPwhr Rustの採用って実のところ、既存の資産を捨ててゼロベースで書く、キャッチアップのためにコストをかける (慣れてる言語よりも時間がかかることを許容する) とかの思い切りの問題だと思う
837デフォルトの名無しさん
2024/11/16(土) 21:37:25.08ID:vdtMtO4q それはそう。
C++ が良い言語ではないことに C++ の設計者は自覚的で、それでもなお「今」目の前にある問題に対処可能であることを理念にしてる。
まだ不十分だけど良い言語だなんてのは実務者にはなんの救いにもならない。
汚くてもなんとかする方法はあるほうがありがたい。
ただ、無限に汚くなり続けることは許容できないのだから、どこかで新しいものが生まれてリセットする必要はあって今がその時なんだろう。
でもまあ現実に使われるものは汚いものだよ。
だって現実が汚いものだから。
Rust もいずれ汚くなって次のなにかに置き換わる。
それが半世紀くらい後だとよいね。
C++ が良い言語ではないことに C++ の設計者は自覚的で、それでもなお「今」目の前にある問題に対処可能であることを理念にしてる。
まだ不十分だけど良い言語だなんてのは実務者にはなんの救いにもならない。
汚くてもなんとかする方法はあるほうがありがたい。
ただ、無限に汚くなり続けることは許容できないのだから、どこかで新しいものが生まれてリセットする必要はあって今がその時なんだろう。
でもまあ現実に使われるものは汚いものだよ。
だって現実が汚いものだから。
Rust もいずれ汚くなって次のなにかに置き換わる。
それが半世紀くらい後だとよいね。
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 日本行き空路49万件キャンセル 中国自粛呼びかけ 日本行きチケット予約の約32%に相当 ★2 [ぐれ★]
- 【中国局長】両国関係に「深刻な影響」 首相発言の撤回要求 [蚤の市★]
- 【卓球】早田ひな、「総額100万スられた」「ずっと憧れていたスペインとイタリア…」ヨーロッパ旅行で悲劇 スリ被害を告白 [muffin★]
- 外務省局長は無言で厳しい表情…日中の高官協議終了か 高市首相“台湾”発言で中国が強硬対応 発言撤回求めたか…★3 [BFU★]
- 【インバウンド】中国人観光客の日本での消費額は年間約2兆円超…中国政府は公務員の出張取り消し [1ゲットロボ★]
- 日経平均の下落率3%超す、財政懸念で長期金利上昇 ★2 [お断り★]
- 【実況】博衣こよりのえちえち歌枠🧪★2
- 【画像】外務省局長「この度はうちの🦎がすみません…」中国「……」 [165981677]
- 産経新聞「高市早苗の答弁さぁ……思慮が足りてなくね?官僚と詰めずに思いつきで話しているでしょ」 [175344491]
- 【高市速報】日本人の3割「中国への武力行使に踏み切る必要がある」ANN世論調査 [931948549]
- 【雑談】暇人集会所part18
- 外務省局長、よくわからないまま帰国へ [834922174]
