公式
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 part26
https://mevius.5ch.net/test/read.cgi/tech/1726838318/
ワッチョイスレ
プログラミング言語 Rust 4【ワッチョイ】
https://mevius.5ch.net/test/read.cgi/tech/1514107621/
探検
Rust part27
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2024/12/02(月) 22:32:50.31ID:D+1pIyvG2024/12/02(月) 22:43:23.38ID:26QdDvTv
乙巳
2024/12/03(火) 07:46:32.00ID:Kek2ztWF
Rust The Book (日本語版)
https://doc.rust-jp.rs/book-ja/
Rust edition guide (日本語版)
https://doc.rust-jp.rs/edition-guide/
Rust by example (日本語版)
https://doc.rust-jp.rs/rust-by-example-ja/
Rust cookbook (日本語版)
https://uma0317.github.io/rust-cookbook-ja/
Rust API guideline (日本語版)
https://sinkuu.github.io/api-guidelines/
Rust nomicon book (日本語版)
https://doc.rust-jp.rs/rust-nomicon-ja/
Rust async book (日本語版)
https://async-book-ja.netlify.app/
Rust WASM book (日本語版)
https://moshg.github.io/rustwasm-book-ja/
Rust embeded book (日本語版)
https://tomoyuki-nakabayashi.github.io/book/
Rust enbeded discovery (日本語版)
https://tomoyuki-nakabayashi.github.io/discovery/
Rust Design Patterns (日本語版)
https://qiita.com/Yappii_111/items/4ccc3a8461cdd4035651
https://qiita.com/Yappii_111/items/654717e6a6a980722189
Rust API guideline (日本語版)
https://sinkuu.github.io/api-guidelines/
https://doc.rust-jp.rs/book-ja/
Rust edition guide (日本語版)
https://doc.rust-jp.rs/edition-guide/
Rust by example (日本語版)
https://doc.rust-jp.rs/rust-by-example-ja/
Rust cookbook (日本語版)
https://uma0317.github.io/rust-cookbook-ja/
Rust API guideline (日本語版)
https://sinkuu.github.io/api-guidelines/
Rust nomicon book (日本語版)
https://doc.rust-jp.rs/rust-nomicon-ja/
Rust async book (日本語版)
https://async-book-ja.netlify.app/
Rust WASM book (日本語版)
https://moshg.github.io/rustwasm-book-ja/
Rust embeded book (日本語版)
https://tomoyuki-nakabayashi.github.io/book/
Rust enbeded discovery (日本語版)
https://tomoyuki-nakabayashi.github.io/discovery/
Rust Design Patterns (日本語版)
https://qiita.com/Yappii_111/items/4ccc3a8461cdd4035651
https://qiita.com/Yappii_111/items/654717e6a6a980722189
Rust API guideline (日本語版)
https://sinkuu.github.io/api-guidelines/
2024/12/03(火) 07:46:58.75ID:Kek2ztWF
Rust Reference Book
https://doc.rust-lang.org/reference/
Rust Standard Library
https://doc.rust-lang.org/std/
Rust rustc Book
https://doc.rust-lang.org/rustc/
Rust rustdoc Book
https://doc.rust-lang.org/rustdoc/
Rust rustup Book
https://rust-lang.github.io/rustup/
Rust Cargo Book
https://doc.rust-lang.org/cargo/
Rust unstable Book
https://doc.rust-lang.org/nightly/unstable-book/
Rust macro Book
https://danielkeep.github.io/tlborm/book/
Rust CLI (Command Line Interface) apps Book
https://rust-cli.github.io/book/
Rust Future Book
https://cfsamson.github.io/books-futures-explained/
Rust async-std Book
https://book.async.rs/
Rust tokio Book
https://tokio.rs/tokio/tutorial
Rust serde Book
https://serde.rs/
Rust Performance Book
https://nnethercote.github.io/perf-book/
https://doc.rust-lang.org/reference/
Rust Standard Library
https://doc.rust-lang.org/std/
Rust rustc Book
https://doc.rust-lang.org/rustc/
Rust rustdoc Book
https://doc.rust-lang.org/rustdoc/
Rust rustup Book
https://rust-lang.github.io/rustup/
Rust Cargo Book
https://doc.rust-lang.org/cargo/
Rust unstable Book
https://doc.rust-lang.org/nightly/unstable-book/
Rust macro Book
https://danielkeep.github.io/tlborm/book/
Rust CLI (Command Line Interface) apps Book
https://rust-cli.github.io/book/
Rust Future Book
https://cfsamson.github.io/books-futures-explained/
Rust async-std Book
https://book.async.rs/
Rust tokio Book
https://tokio.rs/tokio/tutorial
Rust serde Book
https://serde.rs/
Rust Performance Book
https://nnethercote.github.io/perf-book/
2024/12/03(火) 10:17:10.99ID:CyH0XY+t
6デフォルトの名無しさん
2024/12/03(火) 12:48:40.49ID:DZc+/1dr スタバのマルチスレッドって効率悪いよね
2024/12/03(火) 12:56:13.69ID:EOsQeLM6
はいはい、説教おじさんはほっといて気楽に質問してね~。勘違いでもなんでもok。サンプル欲しければコード書きますよ~。
8デフォルトの名無しさん
2024/12/03(火) 15:07:30.04ID:5xjpr7TI 日頃GC付き言語で開発しているからメモリリークがどういったプログラムで起こるのかあんまり実感できない
C言語で書かれたプログラムでメモリリークしやすいプログラムってどんなもんなの?
C言語で書かれたプログラムでメモリリークしやすいプログラムってどんなもんなの?
2024/12/03(火) 15:08:58.63ID:2bVb51Ek
>>8
最近のPCはメモリたくさん積んでるから、リークしても気にしなくていいよ
最近のPCはメモリたくさん積んでるから、リークしても気にしなくていいよ
2024/12/03(火) 16:10:27.68ID:ZsxKPak4
メモリプレッシャーがかかっても不必要にメモリをつかみ続けるFirefoxのようなお行儀の悪いプログラムか増えてるからメモリが潤沢にあってもリークは気にしたほうがいい
使い捨てプログラムや低品質でもいいプログラムなら気にしなくてもいいけどそういうのはGC言語でやる
使い捨てプログラムや低品質でもいいプログラムなら気にしなくてもいいけどそういうのはGC言語でやる
2024/12/03(火) 16:16:53.07ID:ey2XQ99f
2024/12/03(火) 16:51:09.72ID:0HkaMF/9
GC 付きでもメモリリークのようなことが起こることはある。
多くの場合に表面化しないだけ。
プロセスが終わるときにはどうせまるごと回収されるからガッと処理してすぐ終わるようなプログラムでは特に表面化しにくい。
見えにくいからこそ意識的に調査すべきで、 >>11 の意見に同意する。
逆に問題が表面化しやすいのは長期的に起動しっぱなしなもので、わかりやすい例ではウェブサーバ (またはその後ろでサービスを提供するプログラム) などが挙げられる。
ウェブサーバの H2O はそれを防止するのと高速化のためにセッションごとにメモリの塊を確保してその塊の頭から順番に使っていき、セッションが終わると塊をまるごと解放するというメモリ戦略を取ってる。
多くの場合に表面化しないだけ。
プロセスが終わるときにはどうせまるごと回収されるからガッと処理してすぐ終わるようなプログラムでは特に表面化しにくい。
見えにくいからこそ意識的に調査すべきで、 >>11 の意見に同意する。
逆に問題が表面化しやすいのは長期的に起動しっぱなしなもので、わかりやすい例ではウェブサーバ (またはその後ろでサービスを提供するプログラム) などが挙げられる。
ウェブサーバの H2O はそれを防止するのと高速化のためにセッションごとにメモリの塊を確保してその塊の頭から順番に使っていき、セッションが終わると塊をまるごと解放するというメモリ戦略を取ってる。
2024/12/03(火) 17:09:00.60ID:EOsQeLM6
C言語でリークという話なのでこんな感じ。
// メモリリーク例1: mallocした後にfreeし忘れる関数
void leak_in_function() {
char* ptr = (char*)malloc(100);
strcpy(ptr, "Hello");
// freeがないのでメモリリーク
}
// メモリリーク例2: 条件分岐でfreeを飛ばしてしまう
void conditional_leak(int value) {
int* numbers = (int*)malloc(sizeof(int) * 100);
if (value < 0) {
return; // ここでreturnするとfreeされない
}
// 処理
free(numbers);
}
// メモリリーク例3: ポインタの上書きによるリーク
void pointer_overwrite() {
char* ptr1 = (char*)malloc(50);
ptr1 = (char*)malloc(100); // 最初のメモリブロックへの参照が失われる
free(ptr1); // 2番目のメモリブロックだけがfreeされる
}
// メモリリーク例1: mallocした後にfreeし忘れる関数
void leak_in_function() {
char* ptr = (char*)malloc(100);
strcpy(ptr, "Hello");
// freeがないのでメモリリーク
}
// メモリリーク例2: 条件分岐でfreeを飛ばしてしまう
void conditional_leak(int value) {
int* numbers = (int*)malloc(sizeof(int) * 100);
if (value < 0) {
return; // ここでreturnするとfreeされない
}
// 処理
free(numbers);
}
// メモリリーク例3: ポインタの上書きによるリーク
void pointer_overwrite() {
char* ptr1 = (char*)malloc(50);
ptr1 = (char*)malloc(100); // 最初のメモリブロックへの参照が失われる
free(ptr1); // 2番目のメモリブロックだけがfreeされる
}
2024/12/03(火) 17:15:10.75ID:EOsQeLM6
// メモリリーク例4: 動的配列の不完全な解放
typedef struct {
char* name;
int age;
} Person;
void struct_array_leak() {
Person* people = (Person*)malloc(3 * sizeof(Person));
for (int i = 0; i < 3; i++) {
people[i].name = (char*)malloc(50);
strcpy(people[i].name, "John Doe");
}
free(people); // name用のメモリがリークする
}
こういうパターンが多いかな。
C++だと生ポインタ使わなくなるので大分解消されるけど。
typedef struct {
char* name;
int age;
} Person;
void struct_array_leak() {
Person* people = (Person*)malloc(3 * sizeof(Person));
for (int i = 0; i < 3; i++) {
people[i].name = (char*)malloc(50);
strcpy(people[i].name, "John Doe");
}
free(people); // name用のメモリがリークする
}
こういうパターンが多いかな。
C++だと生ポインタ使わなくなるので大分解消されるけど。
2024/12/03(火) 17:23:27.47ID:NKv2UDMA
バグが0になるまで投資を続けるのは誰もやらないのに
メモリリークを0にしようって言われたら投資してしまうのが人情というものだ
メモリリークを0にしようって言われたら投資してしまうのが人情というものだ
2024/12/03(火) 17:54:33.42ID:aDn+t6mK
>>8
ここはRustスレなのに
なぜRustについて全く触れずにC言語の質問をするの?
C言語のスレがあるのだからそちらでしなさい
Rustについて触れずに他の言語の話だけをしている人たちも同罪
必ずRustについても言及しなさい
ここはRustスレなのに
なぜRustについて全く触れずにC言語の質問をするの?
C言語のスレがあるのだからそちらでしなさい
Rustについて触れずに他の言語の話だけをしている人たちも同罪
必ずRustについても言及しなさい
2024/12/03(火) 18:02:49.57ID:cJEFyjqp
Rustのメモリ安全性の目的はメモリリークの回避じゃなくてダングリング参照の回避定期
ついでに競合アクセスも防ぐ
ついでに競合アクセスも防ぐ
2024/12/03(火) 18:49:23.67ID:ll5AjBl1
今度は「競合アクセス」と来たか
2024/12/03(火) 19:03:08.79ID:VEyhp9WQ
C言語はfree()しても断片化という問題が発生すると聞いたことがある
断片化してもOSが落ちたりはしないんだろうけど遅くなるとかならないとか・・・
断片化してもOSが落ちたりはしないんだろうけど遅くなるとかならないとか・・・
2024/12/03(火) 20:08:22.57ID:0HkaMF/9
>>19
断片化によって起こるのはメモリ効率の悪さ。
空いてるメモリの総量が充分にあっても必要分だけ連続したメモリがない(メモリ確保に失敗する)ということが起こる。
C では確保したメモリの場所が変わる(アドレスが変わる)ということは起すわけにいかないので断片化はそれなりに深刻な問題になりうる。
GC には copying gc のように不要メモリの回収と同時に再配置するものもある。
断片化によって起こるのはメモリ効率の悪さ。
空いてるメモリの総量が充分にあっても必要分だけ連続したメモリがない(メモリ確保に失敗する)ということが起こる。
C では確保したメモリの場所が変わる(アドレスが変わる)ということは起すわけにいかないので断片化はそれなりに深刻な問題になりうる。
GC には copying gc のように不要メモリの回収と同時に再配置するものもある。
2024/12/03(火) 20:58:33.67ID:NKv2UDMA
64bitのアドレスが枯渇したとして・・・全オブジェクトに印をつけるGCを使うか?
2024/12/03(火) 21:39:20.42ID:6bT0kHB3
Rustは長時間動かすとメモリが断片化するから、サーバープログラミングに向いてない
2024/12/03(火) 21:49:34.08ID:J79bUhTh
https://www.publickey1.jp/blog/22/cloudflarenginxrusthttppingoracdncpu31.html
CDN世界トップシェアのCloudflareは、同社のグローバルなCDNの基盤として長らく利用してきたC製のNGINXに代えて、
Rust製のHTTPプロキシサーバである「Pingora」を開発して利用していることを明らかにしました。
Pingoraはすでに同社のCDNに採用され、毎日1兆回以上のリクエストを処理し、性能向上や数多くの新機能の提供を実現しており、
従来のNGINXと比較してCPUとメモリリソースの消費はいずれも3分の1程度に収まっているとのこと。
CDN世界トップシェアのCloudflareは、同社のグローバルなCDNの基盤として長らく利用してきたC製のNGINXに代えて、
Rust製のHTTPプロキシサーバである「Pingora」を開発して利用していることを明らかにしました。
Pingoraはすでに同社のCDNに採用され、毎日1兆回以上のリクエストを処理し、性能向上や数多くの新機能の提供を実現しており、
従来のNGINXと比較してCPUとメモリリソースの消費はいずれも3分の1程度に収まっているとのこと。
2024/12/03(火) 21:59:19.12ID:EOsQeLM6
今時の標準アロケーターはよほどでかい領域を確保しない限りメモリの断片化は起きないようになってる。それでも問題ならカスタムアロケーター書くよ。
2024/12/03(火) 22:11:45.28ID:Z14ZJxGL
アマゾンのAWSもRust製
Webサーバサイドでリソース節約したいならRust一択
Webサーバサイドでリソース節約したいならRust一択
2024/12/03(火) 22:47:57.47ID:0HkaMF/9
>>10
現代的には使われていないメモリがあるほうが「無駄がある」と考える思想なので、メモリはあればあるだけ使う(キャッシュやプリロードなど投機的な処理で体感的な速度を上げる)設計になってる。
本当に足りなくなるまでは掴んだままのほうが良いと判断してやってる。
現代のニーズに合わせた意図的な設計としてやってるのでリークとは違う。
良いか悪いかは知らんがリークとは違う。
現代的には使われていないメモリがあるほうが「無駄がある」と考える思想なので、メモリはあればあるだけ使う(キャッシュやプリロードなど投機的な処理で体感的な速度を上げる)設計になってる。
本当に足りなくなるまでは掴んだままのほうが良いと判断してやってる。
現代のニーズに合わせた意図的な設計としてやってるのでリークとは違う。
良いか悪いかは知らんがリークとは違う。
2024/12/03(火) 23:07:54.92ID:6bT0kHB3
Rustはいつメモリのコンパクションできるようになるの?
2024/12/03(火) 23:30:37.95ID:NKv2UDMA
いつも渋滞している道路は無駄がない道路か
まあ徒歩より遅いなら燃料いらないからな
まあ徒歩より遅いなら燃料いらないからな
2024/12/03(火) 23:59:32.38ID:WfNTPXjV
>>13
具体的で勉強になったわ
具体的で勉強になったわ
2024/12/04(水) 00:52:46.84ID:xIul3kYY
>>26
メモリ足りなくなったから不要なメモリ掴んでたら解放してくれと
OSからのメッセージが出ても掴み続けてるアプリが結構あるので
メモリが潤沢にあるからといってリークは気にしなくてもいいなんていう心構えでプログラミングしたらダメだぞという話
難しい話じゃないと思うんだけど1回で伝わらないのは悲しい
メモリ足りなくなったから不要なメモリ掴んでたら解放してくれと
OSからのメッセージが出ても掴み続けてるアプリが結構あるので
メモリが潤沢にあるからといってリークは気にしなくてもいいなんていう心構えでプログラミングしたらダメだぞという話
難しい話じゃないと思うんだけど1回で伝わらないのは悲しい
2024/12/04(水) 07:53:11.74ID:5pmDH7A6
サーバでもアプリでもその他でも
プログラム起動中ずっと必要になるデータは
leak()して&'staticにしてしまっても構わない
これはメモリリークではない
一方ですぐ不要となるデータはleak()してはいけない
これはメモリ使用量が増えていってメモリリークになる
この違いをきちんと認識した上でleak()を活用しよう
ずっと必要になるデータを&'staticにできる大きなメリットがある
プログラム起動中ずっと必要になるデータは
leak()して&'staticにしてしまっても構わない
これはメモリリークではない
一方ですぐ不要となるデータはleak()してはいけない
これはメモリ使用量が増えていってメモリリークになる
この違いをきちんと認識した上でleak()を活用しよう
ずっと必要になるデータを&'staticにできる大きなメリットがある
32デフォルトの名無しさん
2024/12/04(水) 11:14:58.27ID:oDv/ROvl FireFoxのメモリリークは本当に酷い
Rust使ってるっていうのは嘘だろ
Rust使ってるっていうのは嘘だろ
2024/12/04(水) 11:21:44.43ID:CE00sRUi
>>32
そこはC++コード
FireFoxでRustを使っているのはHTML/CSSレンダリング部分
メモリ管理部分を含めてメインはC++で記述されている
ソースが公開されているので誰でも確認できる
そこはC++コード
FireFoxでRustを使っているのはHTML/CSSレンダリング部分
メモリ管理部分を含めてメインはC++で記述されている
ソースが公開されているので誰でも確認できる
34デフォルトの名無しさん
2024/12/04(水) 11:22:03.58ID:oDv/ROvl >>13
さすがにレベル低すぎだろ
さすがにレベル低すぎだろ
35デフォルトの名無しさん
2024/12/04(水) 11:41:12.45ID:1n5AYU37 リークしてるんじゃなくて意図的に解放してないだけ
本当にやばくなったら解放されるようになってる
メモリ食いが嫌ならAuto Tab Discardアドオンを入れろ
本当にやばくなったら解放されるようになってる
メモリ食いが嫌ならAuto Tab Discardアドオンを入れろ
2024/12/04(水) 11:52:22.74ID:mxpvKjAM
2024/12/04(水) 11:55:25.36ID:CE00sRUi
もし仮に特定のアプリに問題があったとしても
それはC++やRustの言語の問題ではない
このスレで特定のアプリの問題の話を始める人は愚か
それはC++やRustの言語の問題ではない
このスレで特定のアプリの問題の話を始める人は愚か
2024/12/04(水) 11:58:57.37ID:tdoiopjD
>>33
何でいつまでたってもRustで書き直さないんだろな
何でいつまでたってもRustで書き直さないんだろな
2024/12/04(水) 12:11:29.24ID:ONbcwvwt
>>30
主旨に反論したわけじゃない。 Firefox が例として不適当と言ってる。
Firefox は貪欲にメモリを使うが本当に足りなくなる手前で抑制的なモードに切り替わる。
Windows からメモリ不足のメッセージを出したときに Firefox がメモリを掴んだままなのは手放せるものは既に手放してるからだ。
メモリ不足になったときは本当にメモリ不足なんだよ。
主旨に反論したわけじゃない。 Firefox が例として不適当と言ってる。
Firefox は貪欲にメモリを使うが本当に足りなくなる手前で抑制的なモードに切り替わる。
Windows からメモリ不足のメッセージを出したときに Firefox がメモリを掴んだままなのは手放せるものは既に手放してるからだ。
メモリ不足になったときは本当にメモリ不足なんだよ。
2024/12/04(水) 12:21:47.57ID:CE00sRUi
FirefoxもChromeもその他のブラウザもやっていないが
究極的にはアクティブウィンドウのアクティブタブ以外の全ての使用メモリを原理的には解放できる
どの方針を採るにしてもC++やRustといった使用言語の問題ではなくどの言語でも可能だ
明らかにスレ違いの話題だから他のスレでやってくれ
究極的にはアクティブウィンドウのアクティブタブ以外の全ての使用メモリを原理的には解放できる
どの方針を採るにしてもC++やRustといった使用言語の問題ではなくどの言語でも可能だ
明らかにスレ違いの話題だから他のスレでやってくれ
41デフォルトの名無しさん
2024/12/04(水) 13:53:37.60ID:oDv/ROvl tab閉じてもそのtabが使ってたメモリ解放しないんじゃリークだろ
2024/12/04(水) 14:10:57.24ID:ONbcwvwt
>>40
長く表示していないタブを一旦解放する仕組みが導入されたこともあるんだが思ったより問題が大きくて消極的になった。
コンテキストの管理とレンダラは不可分な部分もあるので再レンダリングに必要な情報を残しつつ他は解放するってのは手間がかかって割に合わないと考えられてる。
>>41
閉じた時じゃなくてアクティブタブじゃなくなったときの話を >>40 はしてるのにそれがわからないなら黙ってろ。
モダンなブラウザはプロセスを分離しまくっていてプロセス間通信で協調する仕組みになってる。
タブひとつ (または数個のグループ) に対応するプロセスがあって適当な条件でプロセスごと消えて作り直されたりするので仮にメモリ管理に多少の問題があっても全体の堅牢さは維持される。
長く表示していないタブを一旦解放する仕組みが導入されたこともあるんだが思ったより問題が大きくて消極的になった。
コンテキストの管理とレンダラは不可分な部分もあるので再レンダリングに必要な情報を残しつつ他は解放するってのは手間がかかって割に合わないと考えられてる。
>>41
閉じた時じゃなくてアクティブタブじゃなくなったときの話を >>40 はしてるのにそれがわからないなら黙ってろ。
モダンなブラウザはプロセスを分離しまくっていてプロセス間通信で協調する仕組みになってる。
タブひとつ (または数個のグループ) に対応するプロセスがあって適当な条件でプロセスごと消えて作り直されたりするので仮にメモリ管理に多少の問題があっても全体の堅牢さは維持される。
2024/12/04(水) 14:24:21.96ID:pXQEyunH
2024/12/04(水) 14:30:50.31ID:CE00sRUi
いずれにしても各アプリのレベルのメモリ管理の話であってプログラミング言語と関係がない
しかもFirefoxのメモリ管理部分はC++で記述されている
ここRustスレで無関係な話をいつまで続ける気だ
しかもFirefoxのメモリ管理部分はC++で記述されている
ここRustスレで無関係な話をいつまで続ける気だ
2024/12/04(水) 14:35:33.45ID:pXQEyunH
46デフォルトの名無しさん
2024/12/04(水) 15:57:30.78ID:dIs/C0Ii Firefoxで失敗してるRustw
2024/12/04(水) 17:22:43.92ID:mxpvKjAM
ふむ、広告ブロックを強化すればメモリ節約できるのでは
48デフォルトの名無しさん
2024/12/04(水) 20:44:10.29ID:dIFgKrXU 循環参照が起きやすい場面の一つだし、これこそプログラミング言語の仕様と関係のある場面じゃないのかな
2024/12/04(水) 20:50:21.75ID:H1WoIidK
>>48
C++が悪いということ?
C++が悪いということ?
2024/12/04(水) 21:15:04.07ID:9m5UuMRD
Webページ毎に別なので
アリーナ的管理により循環参照があろうと一気に解放するためリークが起きようがない
アリーナ的管理により循環参照があろうと一気に解放するためリークが起きようがない
2024/12/04(水) 22:53:20.36ID:mxpvKjAM
メモリリークと脆弱性の混合物なら急を要するが完全に分離されたから意識低くなった
52デフォルトの名無しさん
2024/12/04(水) 23:26:00.62ID:dIFgKrXU >>48
悪いっていうより、自由が利きやすいんじゃない
悪いっていうより、自由が利きやすいんじゃない
53デフォルトの名無しさん
2024/12/05(木) 21:10:58.63ID:qJrgBNQF iterator traitのnextでiteratorの中のデータの参照を返すことがどうしてもできません
教えてください
教えてください
2024/12/05(木) 21:32:40.26ID:xceXpzKh
>>53
コードで出して。
コードで出して。
2024/12/05(木) 21:37:09.52ID:nBO5q7w2
>>53
lending iteratorでググるといい
lending iteratorでググるといい
2024/12/05(木) 23:37:21.58ID:cvEJUy50
// まず、データを保持する構造体を定義
struct DataHolder {
items: Vec<String>,
}
// イテレータ構造体を定義
// ライフタイムパラメータ 'a を使って、参照の寿命を明示
struct DataIterator<'a> {
data: &'a DataHolder, // データへの参照
index: usize, // 現在の位置
}
// DataHolderにイテレータを作成するメソッドを実装
impl DataHolder {
fn new() -> Self {
DataHolder {
items: vec![String::from("one"), String::from("two"), String::from("three")],
}
}
// イテレータを返すメソッド
fn iter(&self) -> DataIterator {
DataIterator {
data: self,
index: 0,
}
}
}
struct DataHolder {
items: Vec<String>,
}
// イテレータ構造体を定義
// ライフタイムパラメータ 'a を使って、参照の寿命を明示
struct DataIterator<'a> {
data: &'a DataHolder, // データへの参照
index: usize, // 現在の位置
}
// DataHolderにイテレータを作成するメソッドを実装
impl DataHolder {
fn new() -> Self {
DataHolder {
items: vec![String::from("one"), String::from("two"), String::from("three")],
}
}
// イテレータを返すメソッド
fn iter(&self) -> DataIterator {
DataIterator {
data: self,
index: 0,
}
}
}
2024/12/05(木) 23:38:23.20ID:cvEJUy50
// Iteratorトレイトの実装
impl<'a> Iterator for DataIterator<'a> {
// 返り値の型を&'a Stringと指定
type Item = &'a String;
fn next(&mut self) -> Option<Self::Item> {
if self.index < self.data.items.len() {
let item = &self.data.items[self.index];
self.index += 1;
Some(item)
} else {
None
}
}
}
// 使用例
fn main() {
let holder = DataHolder::new();
// イテレータを使用
for item in holder.iter() {
println!("{}", item);
}
}
やりたいことはこんな感じ?
impl<'a> Iterator for DataIterator<'a> {
// 返り値の型を&'a Stringと指定
type Item = &'a String;
fn next(&mut self) -> Option<Self::Item> {
if self.index < self.data.items.len() {
let item = &self.data.items[self.index];
self.index += 1;
Some(item)
} else {
None
}
}
}
// 使用例
fn main() {
let holder = DataHolder::new();
// イテレータを使用
for item in holder.iter() {
println!("{}", item);
}
}
やりたいことはこんな感じ?
58デフォルトの名無しさん
2024/12/06(金) 07:47:51.83ID:tRnxKL09 こんな感じです
struct It<'a>{
i: &'a mut i32
}
impl<'a> Iterator for It<'a>{
type Item= &'a i32;
fn next(&mut self)->Option<Self::Item>{
Some(self.i)
}
}
struct It<'a>{
i: &'a mut i32
}
impl<'a> Iterator for It<'a>{
type Item= &'a i32;
fn next(&mut self)->Option<Self::Item>{
Some(self.i)
}
}
2024/12/06(金) 10:39:26.47ID:zw4qy2EX
mut いらん
2024/12/06(金) 10:45:37.08ID:7cNjBV3c
iter()が作りたいのか、iter_mut()が欲しいのかどっちかな?
あとこれだと無限に続くイテレータになるけど終了条件は?
あとこれだと無限に続くイテレータになるけど終了条件は?
61デフォルトの名無しさん
2024/12/06(金) 12:04:36.97ID:tRnxKL09 struct It<'a>{
i: &'a mut i32
}
impl<'a> Iterator for It<'a>{
type Item= &'a i32;
fn next(&mut self)->Option<Self::Item>{
self.i+=1;
Some(self.i)
}
}
こんな感じなのでmutはいります
本当はiter_mutが作りたいけれど難しそうなので
iterを作ろうとしたけれどどうしても出来ません
初心者です教えてください
i: &'a mut i32
}
impl<'a> Iterator for It<'a>{
type Item= &'a i32;
fn next(&mut self)->Option<Self::Item>{
self.i+=1;
Some(self.i)
}
}
こんな感じなのでmutはいります
本当はiter_mutが作りたいけれど難しそうなので
iterを作ろうとしたけれどどうしても出来ません
初心者です教えてください
62デフォルトの名無しさん
2024/12/06(金) 12:07:14.30ID:tRnxKL09 すいません*つけわすれました
63デフォルトの名無しさん
2024/12/06(金) 12:08:12.03ID:tRnxKL09 >>60
終了条件は25です
終了条件は25です
2024/12/06(金) 12:19:03.26ID:B3lagOoh
結局毎回同じ参照返すならイテレータじゃなくてよくね
2024/12/06(金) 12:49:52.12ID:B2jbh63z
自分の可変参照を返したいならGATでこうする
use lending_iterator::prelude::*;
fn main() {
let mut v: Vec<String> = ["a", "b", "c", "d", "e"].into_iter().map(str::to_string).collect();
my_iter_mut(&mut v)
.skip(1)
.take(3)
.for_each(|s| s.push('x'));
assert_eq!(v, ["a", "bx", "cx", "dx", "e"]);
}
fn my_iter_mut<'a, T>(slice: &'a mut [T]) -> MyIterMut<'a, T> {
MyIterMut { slice, index: 0 }
}
struct MyIterMut<'a, T> {
slice: &'a mut [T],
index: usize,
}
#[gat]
impl<'a, T> LendingIterator for MyIterMut<'a, T> {
type Item<'next> where Self : 'next = &'next mut T;
fn next(self: &'_ mut MyIterMut<'a, T>) -> Option<Item<'_, Self>> {
if self.index < self.slice.len() {
self.index += 1;
Some(&mut self.slice[self.index - 1])
} else {
None
}
}
}
use lending_iterator::prelude::*;
fn main() {
let mut v: Vec<String> = ["a", "b", "c", "d", "e"].into_iter().map(str::to_string).collect();
my_iter_mut(&mut v)
.skip(1)
.take(3)
.for_each(|s| s.push('x'));
assert_eq!(v, ["a", "bx", "cx", "dx", "e"]);
}
fn my_iter_mut<'a, T>(slice: &'a mut [T]) -> MyIterMut<'a, T> {
MyIterMut { slice, index: 0 }
}
struct MyIterMut<'a, T> {
slice: &'a mut [T],
index: usize,
}
#[gat]
impl<'a, T> LendingIterator for MyIterMut<'a, T> {
type Item<'next> where Self : 'next = &'next mut T;
fn next(self: &'_ mut MyIterMut<'a, T>) -> Option<Item<'_, Self>> {
if self.index < self.slice.len() {
self.index += 1;
Some(&mut self.slice[self.index - 1])
} else {
None
}
}
}
2024/12/06(金) 17:58:05.19ID:B2jbh63z
>>65
自己レス
即興で作って冗長な表記があったため
next()関数はこれで
fn next(&mut self) -> Option<Item<'_, Self>> {
(self.index < self.slice.len()).then(|| {
let nth = &mut self.slice[self.index];
self.index += 1;
nth
})
}
自己レス
即興で作って冗長な表記があったため
next()関数はこれで
fn next(&mut self) -> Option<Item<'_, Self>> {
(self.index < self.slice.len()).then(|| {
let nth = &mut self.slice[self.index];
self.index += 1;
nth
})
}
2024/12/06(金) 18:45:17.16ID:OtZyNvR4
>>61
next()で返された不変参照r1(&i32)が生きてる間に次のnext()が呼ばれたら
r1の参照先の値が変わることになるからこの形はIteratorだと実現できないな
同じ値に対する&Tと&mut Tが共存できないルールに引っかかる
next()の戻り値にIt自体のライフタイム(&'b mut selfの'b)を含めて
戻り値の参照が存在してる間は次のnext()を呼べない形にしないといけないけど
Iteratorはそういう制限を想定してない
next()で返された不変参照r1(&i32)が生きてる間に次のnext()が呼ばれたら
r1の参照先の値が変わることになるからこの形はIteratorだと実現できないな
同じ値に対する&Tと&mut Tが共存できないルールに引っかかる
next()の戻り値にIt自体のライフタイム(&'b mut selfの'b)を含めて
戻り値の参照が存在してる間は次のnext()を呼べない形にしないといけないけど
Iteratorはそういう制限を想定してない
2024/12/07(土) 00:37:25.75ID:MlZHBv1+
Vecなどを作れて逆順にもできるイテレータとは性質が異なる
異なるものを、どっちも同じだと頑なに主張し続ける必要はない気がする
異なるものを、どっちも同じだと頑なに主張し続ける必要はない気がする
2024/12/07(土) 02:06:00.13ID:TKfUhpHo
67は一般的なイテレータの概念じゃなくstd::iter::Iteratorの話
このtraitを実装すると例えばIterator::max()も自動的に使えるようになるけど
この実装はSelf::Itemの暫定の最大値を保持しながら次のnextを呼ぶ必要がある
前の値を解放しないと次のnextを使えない状態だと
std::iter::Iteratorが使用者側に保証してる条件を満たせないし
安全なコードの範囲でimpl Iteratorのコンパイルも通せない
自前のIteratorトレイトを用意してもいいけど
それだとstd::iter::Iteratorが要求される処理には使えなくなる
このtraitを実装すると例えばIterator::max()も自動的に使えるようになるけど
この実装はSelf::Itemの暫定の最大値を保持しながら次のnextを呼ぶ必要がある
前の値を解放しないと次のnextを使えない状態だと
std::iter::Iteratorが使用者側に保証してる条件を満たせないし
安全なコードの範囲でimpl Iteratorのコンパイルも通せない
自前のIteratorトレイトを用意してもいいけど
それだとstd::iter::Iteratorが要求される処理には使えなくなる
2024/12/07(土) 08:46:15.51ID:4WGAo47f
2024/12/07(土) 09:01:24.50ID:4WGAo47f
>>69
そのmax()は自動的に全てのイテレータに使えるわけではない
Self::Itemがstd::cmp::Ordを実装している時のみ使える
前の値を保持したままにできるか否かの性質についてもmarker traitを用意することで同じ枠組みに組み込めた可能性がある
それを出来ていないのがstd::iter::Iteratorの欠陥なので他を併用するのがRustでは当たり前になっている
そのmax()は自動的に全てのイテレータに使えるわけではない
Self::Itemがstd::cmp::Ordを実装している時のみ使える
前の値を保持したままにできるか否かの性質についてもmarker traitを用意することで同じ枠組みに組み込めた可能性がある
それを出来ていないのがstd::iter::Iteratorの欠陥なので他を併用するのがRustでは当たり前になっている
2024/12/07(土) 09:28:12.85ID:4WGAo47f
イテレータの前の値を保持できるか否かのどちらが優れているかといえば
より効率的な機能を提供できる点で「前の値を保持できない」方が優れた機能を提供できる
例えばstd::io::BufReadのlines()を考えてみよう
毎回新たなStringを返してくるので前の値を保持できる仕様となっている
しかしlines()の利用で前の値なんて不要なことも多いからその観点からは無駄な仕様ともいえる
一方で「前の値を保持できない」性質にも対応出来ていたとしたら同じStringを使い回すことが出来て明らかに効率が良い
このような例は多数あり自己参照返しイテレータが別途必要とされて使われている理由である
より効率的な機能を提供できる点で「前の値を保持できない」方が優れた機能を提供できる
例えばstd::io::BufReadのlines()を考えてみよう
毎回新たなStringを返してくるので前の値を保持できる仕様となっている
しかしlines()の利用で前の値なんて不要なことも多いからその観点からは無駄な仕様ともいえる
一方で「前の値を保持できない」性質にも対応出来ていたとしたら同じStringを使い回すことが出来て明らかに効率が良い
このような例は多数あり自己参照返しイテレータが別途必要とされて使われている理由である
2024/12/07(土) 12:31:06.78ID:MlZHBv1+
2024/12/07(土) 12:55:43.06ID:TKfUhpHo
61(初心者)が実現できないimpl Iteratorで詰まってるんだから
できない理由を分かってもらうのが優先でしょ
イテレータの優劣とか代替案はその後でいい
できない理由を分かってもらうのが優先でしょ
イテレータの優劣とか代替案はその後でいい
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 小野田紀美・経済安保担当相「何か気に入らないことがあればすぐに経済的威圧をする国への依存はリスク」 ★2 [Hitzeschleier★]
- 日本行き空路49万件キャンセル 中国自粛呼びかけ 日本行きチケット予約の約32%に相当 ★2 [ぐれ★]
- 【中国局長】両国関係に「深刻な影響」 首相発言の撤回要求 [蚤の市★]
- 【インバウンド】中国人観光客の日本での消費額は年間約2兆円超…中国政府は公務員の出張取り消し [1ゲットロボ★]
- 外務省局長は無言で厳しい表情…日中の高官協議終了か 高市首相“台湾”発言で中国が強硬対応 発言撤回求めたか…★3 [BFU★]
- 新米の予想収穫量、1割増 746万8000トン―農水省 [蚤の市★]
- 高市「発言は撤回しない。謝罪もするな。外務省局長!任せたぞ。」👈なにをさせたかったの?😲 [826239858]
- 【高市速報】日本人の3割「中国への武力行使に踏み切る必要がある」ANN世論調査 [931948549]
- 【悲報】『岡田が日和って逃げたのに高市が自分から突っ込んだ発言をして自爆した』⬅国会答弁、実際はこれだった…… [158478931]
- 自分に自信がない女の子、陽キャ美容室で80cmのエクステを付けた結果wwwwwwwwwwwwwwwwwww [329329848]
- 【実況】博衣こよりのえちえち歌枠🧪
- 外務省局長、よくわからないまま帰国へ [834922174]
