◎正当な理由による書き込みの削除について:      生島英之とみられる方へ:

Rust part27 YouTube動画>1本


動画、画像抽出 || この掲示板へ 類似スレ 掲示板一覧 人気スレ 動画人気順

このスレへの固定リンク: http://5chb.net/r/tech/1733146370/
ヒント:5chスレのurlに http://xxxx.5chb.net/xxxx のようにbを入れるだけでここでスレ保存、閲覧できます。

1デフォルトの名無しさん
2024/12/02(月) 22:32:50.31ID:D+1pIyvG
公式
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
http://2chb.net/r/tech/1726838318/

ワッチョイスレ
プログラミング言語 Rust 4【ワッチョイ】
http://2chb.net/r/tech/1514107621/
2デフォルトの名無しさん
2024/12/02(月) 22:43:23.38ID:26QdDvTv
乙巳
3デフォルトの名無しさん
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/
4デフォルトの名無しさん
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/
5デフォルトの名無しさん
2024/12/03(火) 10:17:10.99ID:CyH0XY+t
>>3
何年も更新されてない上に誤訳だらけの非公式翻訳を貼り続けるのいい加減やめろ

前スレの「変数束縛」とか含めて非公式翻訳が勘違い野郎を生む諸悪の根源
6デフォルトの名無しさん
2024/12/03(火) 12:48:40.49ID:DZc+/1dr
スタバのマルチスレッドって効率悪いよね
7デフォルトの名無しさん
2024/12/03(火) 12:56:13.69ID:EOsQeLM6
はいはい、説教おじさんはほっといて気楽に質問してね~。勘違いでもなんでもok。サンプル欲しければコード書きますよ~。
8デフォルトの名無しさん
2024/12/03(火) 15:07:30.04ID:5xjpr7TI
日頃GC付き言語で開発しているからメモリリークがどういったプログラムで起こるのかあんまり実感できない
C言語で書かれたプログラムでメモリリークしやすいプログラムってどんなもんなの?
9デフォルトの名無しさん
2024/12/03(火) 15:08:58.63ID:2bVb51Ek
>>8
最近のPCはメモリたくさん積んでるから、リークしても気にしなくていいよ
10デフォルトの名無しさん
2024/12/03(火) 16:10:27.68ID:ZsxKPak4
メモリプレッシャーがかかっても不必要にメモリをつかみ続けるFirefoxのようなお行儀の悪いプログラムか増えてるからメモリが潤沢にあってもリークは気にしたほうがいい

使い捨てプログラムや低品質でもいいプログラムなら気にしなくてもいいけどそういうのはGC言語でやる
11デフォルトの名無しさん
2024/12/03(火) 16:16:53.07ID:ey2XQ99f
>>8
仕事の製品開発ならgc言語でもメモリプロファイラ一使えよ
ハードの性能向上を無駄に消費するクソソフト多すぎだろ
12デフォルトの名無しさん
2024/12/03(火) 16:51:09.72ID:0HkaMF/9
GC 付きでもメモリリークのようなことが起こることはある。
多くの場合に表面化しないだけ。
プロセスが終わるときにはどうせまるごと回収されるからガッと処理してすぐ終わるようなプログラムでは特に表面化しにくい。
見えにくいからこそ意識的に調査すべきで、 >>11 の意見に同意する。

逆に問題が表面化しやすいのは長期的に起動しっぱなしなもので、わかりやすい例ではウェブサーバ (またはその後ろでサービスを提供するプログラム) などが挙げられる。
ウェブサーバの H2O はそれを防止するのと高速化のためにセッションごとにメモリの塊を確保してその塊の頭から順番に使っていき、セッションが終わると塊をまるごと解放するというメモリ戦略を取ってる。
13デフォルトの名無しさん
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される
}
14デフォルトの名無しさん
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++だと生ポインタ使わなくなるので大分解消されるけど。
15デフォルトの名無しさん
2024/12/03(火) 17:23:27.47ID:NKv2UDMA
バグが0になるまで投資を続けるのは誰もやらないのに
メモリリークを0にしようって言われたら投資してしまうのが人情というものだ
16デフォルトの名無しさん
2024/12/03(火) 17:54:33.42ID:aDn+t6mK
>>8
ここはRustスレなのに
なぜRustについて全く触れずにC言語の質問をするの?
C言語のスレがあるのだからそちらでしなさい

Rustについて触れずに他の言語の話だけをしている人たちも同罪
必ずRustについても言及しなさい
17デフォルトの名無しさん
2024/12/03(火) 18:02:49.57ID:cJEFyjqp
Rustのメモリ安全性の目的はメモリリークの回避じゃなくてダングリング参照の回避定期
ついでに競合アクセスも防ぐ
18デフォルトの名無しさん
2024/12/03(火) 18:49:23.67ID:ll5AjBl1
今度は「競合アクセス」と来たか
19デフォルトの名無しさん
2024/12/03(火) 19:03:08.79ID:VEyhp9WQ
C言語はfree()しても断片化という問題が発生すると聞いたことがある
断片化してもOSが落ちたりはしないんだろうけど遅くなるとかならないとか・・・
20デフォルトの名無しさん
2024/12/03(火) 20:08:22.57ID:0HkaMF/9
>>19
断片化によって起こるのはメモリ効率の悪さ。
空いてるメモリの総量が充分にあっても必要分だけ連続したメモリがない(メモリ確保に失敗する)ということが起こる。
C では確保したメモリの場所が変わる(アドレスが変わる)ということは起すわけにいかないので断片化はそれなりに深刻な問題になりうる。
GC には copying gc のように不要メモリの回収と同時に再配置するものもある。
21デフォルトの名無しさん
2024/12/03(火) 20:58:33.67ID:NKv2UDMA
64bitのアドレスが枯渇したとして・・・全オブジェクトに印をつけるGCを使うか?
22デフォルトの名無しさん
2024/12/03(火) 21:39:20.42ID:6bT0kHB3
Rustは長時間動かすとメモリが断片化するから、サーバープログラミングに向いてない
23デフォルトの名無しさん
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程度に収まっているとのこと。
24デフォルトの名無しさん
2024/12/03(火) 21:59:19.12ID:EOsQeLM6
今時の標準アロケーターはよほどでかい領域を確保しない限りメモリの断片化は起きないようになってる。それでも問題ならカスタムアロケーター書くよ。
25デフォルトの名無しさん
2024/12/03(火) 22:11:45.28ID:Z14ZJxGL
アマゾンのAWSもRust製
Webサーバサイドでリソース節約したいならRust一択
26デフォルトの名無しさん
2024/12/03(火) 22:47:57.47ID:0HkaMF/9
>>10
現代的には使われていないメモリがあるほうが「無駄がある」と考える思想なので、メモリはあればあるだけ使う(キャッシュやプリロードなど投機的な処理で体感的な速度を上げる)設計になってる。
本当に足りなくなるまでは掴んだままのほうが良いと判断してやってる。
現代のニーズに合わせた意図的な設計としてやってるのでリークとは違う。
良いか悪いかは知らんがリークとは違う。
27デフォルトの名無しさん
2024/12/03(火) 23:07:54.92ID:6bT0kHB3
Rustはいつメモリのコンパクションできるようになるの?
28デフォルトの名無しさん
2024/12/03(火) 23:30:37.95ID:NKv2UDMA
いつも渋滞している道路は無駄がない道路か
まあ徒歩より遅いなら燃料いらないからな
29デフォルトの名無しさん
2024/12/03(火) 23:59:32.38ID:WfNTPXjV
>>13
具体的で勉強になったわ
30デフォルトの名無しさん
2024/12/04(水) 00:52:46.84ID:xIul3kYY
>>26
メモリ足りなくなったから不要なメモリ掴んでたら解放してくれと
OSからのメッセージが出ても掴み続けてるアプリが結構あるので
メモリが潤沢にあるからといってリークは気にしなくてもいいなんていう心構えでプログラミングしたらダメだぞという話

難しい話じゃないと思うんだけど1回で伝わらないのは悲しい
31デフォルトの名無しさん
2024/12/04(水) 07:53:11.74ID:5pmDH7A6
サーバでもアプリでもその他でも
プログラム起動中ずっと必要になるデータは
leak()して&'staticにしてしまっても構わない
これはメモリリークではない
一方ですぐ不要となるデータはleak()してはいけない
これはメモリ使用量が増えていってメモリリークになる
この違いをきちんと認識した上でleak()を活用しよう
ずっと必要になるデータを&'staticにできる大きなメリットがある
32デフォルトの名無しさん
2024/12/04(水) 11:14:58.27ID:oDv/ROvl
FireFoxのメモリリークは本当に酷い
Rust使ってるっていうのは嘘だろ
33デフォルトの名無しさん
2024/12/04(水) 11:21:44.43ID:CE00sRUi
>>32
そこは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アドオンを入れろ
36デフォルトの名無しさん
2024/12/04(水) 11:52:22.74ID:mxpvKjAM
>>31
それを普及させて何がやりたいのか分からなかった
が「やりたいことと合致しない現実」を報道する自由を欲しているらしいと最近分かった
37デフォルトの名無しさん
2024/12/04(水) 11:55:25.36ID:CE00sRUi
もし仮に特定のアプリに問題があったとしても
それはC++やRustの言語の問題ではない
このスレで特定のアプリの問題の話を始める人は愚か
38デフォルトの名無しさん
2024/12/04(水) 11:58:57.37ID:tdoiopjD
>>33
何でいつまでたってもRustで書き直さないんだろな
39デフォルトの名無しさん
2024/12/04(水) 12:11:29.24ID:ONbcwvwt
>>30
主旨に反論したわけじゃない。 Firefox が例として不適当と言ってる。
Firefox は貪欲にメモリを使うが本当に足りなくなる手前で抑制的なモードに切り替わる。
Windows からメモリ不足のメッセージを出したときに Firefox がメモリを掴んだままなのは手放せるものは既に手放してるからだ。
メモリ不足になったときは本当にメモリ不足なんだよ。
40デフォルトの名無しさん
2024/12/04(水) 12:21:47.57ID:CE00sRUi
FirefoxもChromeもその他のブラウザもやっていないが
究極的にはアクティブウィンドウのアクティブタブ以外の全ての使用メモリを原理的には解放できる
どの方針を採るにしてもC++やRustといった使用言語の問題ではなくどの言語でも可能だ
明らかにスレ違いの話題だから他のスレでやってくれ
41デフォルトの名無しさん
2024/12/04(水) 13:53:37.60ID:oDv/ROvl
tab閉じてもそのtabが使ってたメモリ解放しないんじゃリークだろ
42デフォルトの名無しさん
2024/12/04(水) 14:10:57.24ID:ONbcwvwt
>>40
長く表示していないタブを一旦解放する仕組みが導入されたこともあるんだが思ったより問題が大きくて消極的になった。
コンテキストの管理とレンダラは不可分な部分もあるので再レンダリングに必要な情報を残しつつ他は解放するってのは手間がかかって割に合わないと考えられてる。

>>41
閉じた時じゃなくてアクティブタブじゃなくなったときの話を >>40 はしてるのにそれがわからないなら黙ってろ。

モダンなブラウザはプロセスを分離しまくっていてプロセス間通信で協調する仕組みになってる。
タブひとつ (または数個のグループ) に対応するプロセスがあって適当な条件でプロセスごと消えて作り直されたりするので仮にメモリ管理に多少の問題があっても全体の堅牢さは維持される。
43デフォルトの名無しさん
2024/12/04(水) 14:24:21.96ID:pXQEyunH
>>39
>Firefox がメモリを掴んだままなのは手放せるものは既に手放してるからだ。
これは嘘
単にお行儀が悪いだけ

>>40
>FirefoxもChromeもその他のブラウザもやっていないが
Safariは閉じたタブのメモリはもちろんのこと
長く非アクティブなタブのメモリは割と積極的に解放してる
44デフォルトの名無しさん
2024/12/04(水) 14:30:50.31ID:CE00sRUi
いずれにしても各アプリのレベルのメモリ管理の話であってプログラミング言語と関係がない
しかもFirefoxのメモリ管理部分はC++で記述されている
ここRustスレで無関係な話をいつまで続ける気だ
45デフォルトの名無しさん
2024/12/04(水) 14:35:33.45ID:pXQEyunH
>>39
>主旨に反論したわけじゃない
いやいや主旨を理解してないのに主旨に反論してるもしてないもあるかいな
46デフォルトの名無しさん
2024/12/04(水) 15:57:30.78ID:dIs/C0Ii
Firefoxで失敗してるRustw
47デフォルトの名無しさん
2024/12/04(水) 17:22:43.92ID:mxpvKjAM
ふむ、広告ブロックを強化すればメモリ節約できるのでは
48デフォルトの名無しさん
2024/12/04(水) 20:44:10.29ID:dIFgKrXU
循環参照が起きやすい場面の一つだし、これこそプログラミング言語の仕様と関係のある場面じゃないのかな
49デフォルトの名無しさん
2024/12/04(水) 20:50:21.75ID:H1WoIidK
>>48
C++が悪いということ?
50デフォルトの名無しさん
2024/12/04(水) 21:15:04.07ID:9m5UuMRD
Webページ毎に別なので
アリーナ的管理により循環参照があろうと一気に解放するためリークが起きようがない
51デフォルトの名無しさん
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の中のデータの参照を返すことがどうしてもできません
教えてください
54デフォルトの名無しさん
2024/12/05(木) 21:32:40.26ID:xceXpzKh
>>53
コードで出して。
55デフォルトの名無しさん
2024/12/05(木) 21:37:09.52ID:nBO5q7w2
>>53
lending iteratorでググるといい
56デフォルトの名無しさん
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,
}
}
}
57デフォルトの名無しさん
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);
}
}

やりたいことはこんな感じ?
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)
}
}
59デフォルトの名無しさん
2024/12/06(金) 10:39:26.47ID:zw4qy2EX
mut いらん
60デフォルトの名無しさん
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を作ろうとしたけれどどうしても出来ません
初心者です教えてください
62デフォルトの名無しさん
2024/12/06(金) 12:07:14.30ID:tRnxKL09
すいません*つけわすれました
63デフォルトの名無しさん
2024/12/06(金) 12:08:12.03ID:tRnxKL09
>>60
終了条件は25です
64デフォルトの名無しさん
2024/12/06(金) 12:19:03.26ID:B3lagOoh
結局毎回同じ参照返すならイテレータじゃなくてよくね
65デフォルトの名無しさん
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
}
}
}
66デフォルトの名無しさん
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
})
}
67デフォルトの名無しさん
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はそういう制限を想定してない
68デフォルトの名無しさん
2024/12/07(土) 00:37:25.75ID:MlZHBv1+
Vecなどを作れて逆順にもできるイテレータとは性質が異なる
異なるものを、どっちも同じだと頑なに主張し続ける必要はない気がする
69デフォルトの名無しさん
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が要求される処理には使えなくなる
70デフォルトの名無しさん
2024/12/07(土) 08:46:15.51ID:4WGAo47f
>>68
Vecを作れるのも逆順も全て別の話
それぞれ別の要件を備えていないと一般的なイテレータではどちらも不可能
例えばイテレータ「1..」はVecを作れない&逆順に呼ぶのも無理
std::iter::repeat(1)はVecを作れないがDoubleEndedIteratorを実装しているのでメソッドrev()が使えて逆順に呼べる!
自己可変参照を返す>>65のMyIterMutはスライス&mut [T]を内部に持っているため逆順呼び出しrev()メソッドの実装が可能
71デフォルトの名無しさん
2024/12/07(土) 09:01:24.50ID:4WGAo47f
>>69
そのmax()は自動的に全てのイテレータに使えるわけではない
Self::Itemがstd::cmp::Ordを実装している時のみ使える
前の値を保持したままにできるか否かの性質についてもmarker traitを用意することで同じ枠組みに組み込めた可能性がある
それを出来ていないのがstd::iter::Iteratorの欠陥なので他を併用するのがRustでは当たり前になっている
72デフォルトの名無しさん
2024/12/07(土) 09:28:12.85ID:4WGAo47f
イテレータの前の値を保持できるか否かのどちらが優れているかといえば
より効率的な機能を提供できる点で「前の値を保持できない」方が優れた機能を提供できる
例えばstd::io::BufReadのlines()を考えてみよう
毎回新たなStringを返してくるので前の値を保持できる仕様となっている
しかしlines()の利用で前の値なんて不要なことも多いからその観点からは無駄な仕様ともいえる
一方で「前の値を保持できない」性質にも対応出来ていたとしたら同じStringを使い回すことが出来て明らかに効率が良い
このような例は多数あり自己参照返しイテレータが別途必要とされて使われている理由である
73デフォルトの名無しさん
2024/12/07(土) 12:31:06.78ID:MlZHBv1+
>>70
長さが有限でも実行時にメモリが足りなければVecもreverseもないけど
「実行時に」という要件は備えなくて良いというルールがあるんだよね?
74デフォルトの名無しさん
2024/12/07(土) 12:55:43.06ID:TKfUhpHo
61(初心者)が実現できないimpl Iteratorで詰まってるんだから
できない理由を分かってもらうのが優先でしょ
イテレータの優劣とか代替案はその後でいい
75デフォルトの名無しさん
2024/12/07(土) 13:24:25.81ID:4WGAo47f
>>73
rev()メソッドのtrait DoubleEndedIteratorはゼロコスト抽象化
逆順に並べ替えることはしないのでそのためのメモリは必要ない
既にある任意の構造を後ろからたどる、あるいは、後ろから計算するだけ
76デフォルトの名無しさん
2024/12/07(土) 13:35:30.31ID:4WGAo47f
>>74
それならば別の条件が必要となるIterator::max()を事例に出すのはよろしくないかな
説明するためには単純にこれだけでいいよ
let first = iter.next();
let second = iter.next();
println!("{first:?} {second:?}");
77デフォルトの名無しさん
2024/12/07(土) 14:11:16.76ID:TKfUhpHo
>>76
next2回呼ぶだけだとstd::iter::Iteratorと関係なくなるだろ
自分がそういう使い方をしなければ問題ないってなるだけ

maxはstd::iter::Iteratorの実装に求められる条件の分かりやすい例として挙げた
別の条件まで気にするならmax_byでもいいけどそれはそれで初心者には余計なノイズが増える
78デフォルトの名無しさん
2024/12/07(土) 14:52:07.98ID:MlZHBv1+
コピーもcloneもできないデータの存在自体がノイズだね
本当はcloneできるんだけどゼロコストではできないとか言ってるのもノイズだ
79デフォルトの名無しさん
2024/12/07(土) 15:42:48.47ID:YxUwNEYs
結局>>53は何がしたかったのか
80デフォルトの名無しさん
2024/12/07(土) 16:58:02.14ID:ikP3bVWr
>>67
stdのIterator::nextの&mut selfのライフタイムはnextメソッドを抜けるところまで
(次のnextが呼ばれるまで生きてない)

つまりstdのIteratorでは&mut selfのライフタイムに依存するような参照を返すことはできないということ
そういう参照を返したいならlending iterator
逆に言えば&mut selfのライフタイムに依存しない参照であればstdのIteratorでも返せるということ
81デフォルトの名無しさん
2024/12/07(土) 17:27:34.95ID:4WGAo47f
>>77
max_byも同じ
Ord実装型そのものかOrd実装型に変換してOrd::cmp()できる時のみ利用できる
それらを持ち出さなくてもSelf::Itemの条件なくcollect()すなわち収納型へのFromIteratorが適用される
つまりfirst要素とsecond要素が同時に存在することになると矛盾の説明で十分となる
そのため自己参照を返すイテレータはstd::iter::Iteratorがカバーする範囲になく別途必要となる話をしてきた
82デフォルトの名無しさん
2024/12/07(土) 17:32:25.17ID:4WGAo47f
>>78
イテレータが返すのはデータ値自体とは限らず参照も返す
特に今回の質問者が返したい可変参照は明確に!Cloneが定義されていてもちろん!Copyでもある
それでも可変参照をイテレータが返すことができてVecへ収容することも可能なのはCloneもコピーも行われないためだ
さらにそれらと全く独立した話としてイテレータ自体への参照/可変参照を返す場合はstd::iter::Iteratorで扱えないためLendingIteratorを使うという話が本題
83デフォルトの名無しさん
2024/12/07(土) 18:53:41.33ID:MlZHBv1+
そんなに移動がしたいならこれでいい

first = into_next(iter); // iterはもう値を所有しない
second = into_next(first) // firstはもう値を所有しない
84デフォルトの名無しさん
2024/12/07(土) 19:21:07.13ID:8M4lSePd
>>83
それによって新たにできるようになることや新たに生じるメリットは何?
85デフォルトの名無しさん
2024/12/07(土) 21:52:51.51ID:MlZHBv1+
C++でもRustでも変わらないメリットはcloneとdropをしなくてすむことだが

そういえば、Rust固有のメリットは'aが出てこないことと
'staticも出てこないことだな
86デフォルトの名無しさん
2024/12/08(日) 15:04:28.36ID:vgRddWB1
全然話変わるんだけどPinky Crush新曲のlowercase lifetimeってRust関係あるのかな
87デフォルトの名無しさん
2024/12/08(日) 22:46:56.54ID:y6R7+MXT
>>61
mutでないiterも出来なくて困ってるとのことなので
スライスのiter()と同じものがLendingIteratorを使わずに書けるよ

struct MyIter<'a, T>(&'a [T]);

fn my_iter<'a, T>(slice: &'a [T]) -> MyIter<'a, T> {
MyIter(slice)
}

impl<'a, T> std::iter::Iterator for MyIter<'a, T> {
type Item = &'a T;
fn next(&mut self) -> Option<Self::Item> {
if let [first, rest @ ..] = self.0 {
self.0 = rest;
Some(first)
} else {
None
}
}
}

fn main() {
let a = ["foo", "bar"];
let mut iter = my_iter(&a);
assert_eq!(iter.next(), Some(&"foo"));
assert_eq!(iter.next(), Some(&"bar"));
assert_eq!(iter.next(), None);
}
88デフォルトの名無しさん
2024/12/09(月) 08:04:13.18ID:kf5GINDJ
組み込みFW屋さんなんだけどRustやってみようかな…
組み込み屋視点でRustはC++の何を解決してると思う?
組み込み屋なんて古いシステムばかりだからすぐに取って代わることは無いとは思うけど
年々複雑な製品を求められるから選択肢としては持っておきたい
89デフォルトの名無しさん
2024/12/09(月) 09:11:23.41ID:bWuDC7pJ
zulip行けば?
ここにはカスしかおらん
90デフォルトの名無しさん
2024/12/09(月) 09:29:03.77ID:1L49Pn1/
>>88
ダングリング参照を発見出来るだけ……とは言えそれが重要ではあるのだけど。
C++ は結局は人が気を付けなきゃならないことだらけで、複雑になると手におえない。
知ってることでも複雑に絡み合った状況では間違う。
C++ よりは機械的に検証可能な範囲を広げてるだけでもありがたいものだよ。
91デフォルトの名無しさん
2024/12/09(月) 09:59:55.51ID:kf5GINDJ
>>90
え?マジ?
俄然興味湧いてきた
さっさと定時で帰って環境整えるか
92デフォルトの名無しさん
2024/12/09(月) 10:35:05.93ID:URePCLgA
ビット幅気にするようなケースだと
数値型の暗黙の型変換がないとか演算時のオーバーフローの扱いを明示的に書けるとかが結構ありがたい
93デフォルトの名無しさん
2024/12/09(月) 13:24:01.49ID:wWCmXoxS
科学 + 5ch

【AI】AIはわずか2時間の対話で人間の性格をコピーできる [すらいむ★]
http://2chb.net/r/scienceplus/1733576027/

コメントに面白いことが書かれている
94デフォルトの名無しさん
2024/12/09(月) 13:32:22.31ID:elhM3R9g
>>92
たしかに基礎的なことではあるがC/C++ではうっかり数値型の自動キャストでハマることもあるし
何よりも未定義動作が多くてこれも沼にハマる原因だな
それらを無くしたRustは賢明だ
95デフォルトの名無しさん
2024/12/09(月) 13:59:10.18ID:uh4vUAM3
釣れますか?
96デフォルトの名無しさん
2024/12/09(月) 20:25:44.95ID:MZPPSq7i
struct RefMutex<'a, T>(&'a Mutex<T>);
impl<'a, T> Iterator for RefMutex<'a, T> {
type Item = std::sync::MutexGuard<'a, T>;
//略
}

try_lockが失敗したらループが止まります
マルチスレッドならランダムに止まります 知らんけど
97デフォルトの名無しさん
2024/12/09(月) 20:57:28.00ID:bWuDC7pJ
FnMut() -> Option<T>っぽいあらゆる処理を全部Iterator化しようという気概を感じるな

近寄らんとこ
98デフォルトの名無しさん
2024/12/09(月) 22:22:52.93ID:FjJr0oeZ
イテレータが勝手にループすることはない
ループするよう別途コードを書かなければならない
Option<T>を返す関数をfとすると
while let Some(x) = f() { ... } で十分である
つまりイテレータ実装する意味がない
イテレータメソッドに繋げたい!という反論もあろう
それなら std::iter::from_fn(f) で十分である
99デフォルトの名無しさん
2024/12/10(火) 01:03:26.70ID:EhFU+3MS
Iteratorの話は、lifetimeの棍棒で殴られたという文脈で出てきただけだな

構造体のメンバーが&'a Mutex<T>なら
reborrowではなくmoveで取得した値に対しderef_mutが使える
moveなら殴られない
100デフォルトの名無しさん
2024/12/10(火) 12:58:54.26ID:maUGvQsb
>>88
c++使ってる組み込みって組み込みLinuxとかじゃねーの?
あんまり組み込み特有の制限ないだろ
好きに組めや
101デフォルトの名無しさん
2024/12/11(水) 12:00:23.09ID:FLapvbLS
これはポリシーというか戦略が違ってて、「今より少しでも改善するなら採用」だからじゃないかと
従来型の「最低限のクオリティに達するまではreject」へのアンチテーゼでもあるから
そして(文句あるかもしれんが)crates開発者は元々のエンジニアの質がそこそこ高かったからそれでも何とかなったものの、
同じ事をGitでやったからあの「ぼくがおもいついたすごいcrates」の山になったのだと思う
交通整理すらやる気無かったわけだ

とはいえ、「使われなくなったcratesは、いつしか動かなくなった事すら認識されなくなり、死んでいく」という、
Gitコマンド内でのライフゲームをやるつもりなら、ありなんだろうさ
102デフォルトの名無しさん
2024/12/12(木) 23:08:54.89ID:qS1eLhOO
C/C++からRustへ:Googleが示すファームウェア進化の道筋
https://xenospectrum.com/google-revamps-firmware-with-rust/
103デフォルトの名無しさん
2024/12/14(土) 11:03:48.81ID:mSSbYcoF
読み終わった

>>102
具体的なアプローチは以下の通りである:
(1) 段階的なRust導入:
 略
(2) 既存のCコードベースとの統合:
 略
(3) ベアメタル環境への対応:
 略
(4) ビルド最適化とパフォーマンスの考慮:
 略
104デフォルトの名無しさん
2024/12/15(日) 23:03:38.24ID:ehGoRf8d
Rustで連番IDを発行する関数はこれでいい?

fn new_id() -> Option<usize> {
thread_local! {
static ID: Cell<usize> = Cell::new(0);
}
ID.get().checked_add(1).inspect(|&new_id| ID.set(new_id))
}
105デフォルトの名無しさん
2024/12/15(日) 23:37:25.98ID:YS3isBj8
mutableなRange(0..)をIteratorとして使う小技があるけど
オーバーフローは意識したことないな

fn new_id() -> Option<usize> {
use std::cell::RefCell;
use std::ops::RangeInclusive;

thread_local! {
static ID: RefCell<RangeInclusive<usize>> = RefCell::new(0..=usize::MAX);
}

ID.with_borrow_mut(|ids| ids.next())
}
106デフォルトの名無しさん
2024/12/15(日) 23:49:49.46ID:ehGoRf8d
>>105
Cellで済むところがRefCellになってしまってメリットがよくわからないです
107デフォルトの名無しさん
2024/12/16(月) 00:17:21.21ID:QlO1DQXb
合わせたつもりだったけど104の実装だと最初のidは1か
108デフォルトの名無しさん
2024/12/16(月) 00:32:53.11ID:QlO1DQXb
0から開始できる形でCellにこだわるなら↓みたいな実装もありそう

fn new_id() -> Option<usize> {
thread_local! {
static ID:Cell<Option<usize>> = Cell::new(Some(1)); // ←0開始ならSome(0)
}
ID.replace(ID.get().map(|i| i.checked_add(1)).flatten())
}
109デフォルトの名無しさん
2024/12/16(月) 01:08:38.61ID:KPayFncJ
スレッド単位の連番て何やの?
110デフォルトの名無しさん
2024/12/16(月) 12:39:36.29ID:pEIdxfnL
>>104をマルチスレッド対応するなら
まず初心者入門向け版としてはCellをMutexに変更で動く

fn new_id() -> Option<usize> {
static ID: Mutex<usize> = Mutex::new(0);

let mut id = ID.lock().unwrap();
id.checked_add(1).inspect(|&new_id| *id = new_id)
}
111デフォルトの名無しさん
2024/12/16(月) 18:51:07.44ID:gawhGp3+
inspectの間違った使い方
112デフォルトの名無しさん
2024/12/16(月) 19:41:56.01ID:NChejl3+
正しいようだが何を問題視してる?
ちなみにRustではmatch(またはif let)で書いた時に
次のようなパターンになる場合に
わかりやすく短くメソッドにして繋げることができる

and_then(f)
 | Some(x) => f(x),
 | None => None,

map(f)
 | Some(x) => Some(f(x)),
 | None => None,

inspect(f)
 | Some(x) => { f(x); Some(x) }
 | None => None,

or_else(f)
 | Some(x) => Some(x),
 | None => f(),

unwrap_or_else(f)
 | Some(x) => x,
 | None => f(),

ok_or_else(f)
 | Some(x) => Ok(x),
 | None => Err(f()),

など
113デフォルトの名無しさん
2024/12/17(火) 10:28:51.72ID:hEkGaD6x
全然判り易くないぞ
語彙に直交性が全く無い
114デフォルトの名無しさん
2024/12/17(火) 12:02:56.17ID:PdC61IaM
語彙の問題もあるのかもしれないけどasyncの問題もあって中の人たち含めみんな昔ほどコンビネータで書かなくなった
115デフォルトの名無しさん
2024/12/17(火) 12:27:03.59ID:QsDK8zUE
Optionを自然に真偽値ベースで英語で読むと判り易くなっている
例えばunwrap_or_elseは
真ならunwrapすなわちSome(x)→x
orは前提が偽つまりNoneの場合がfの対象でNone→f()

似ているor_elseは
Some(x)→Some(x)となる部分だけ違うとすぐわかる

その逆は当然and_thenとなり
andは前提が真の場合がfの対象でSome(x)→f(x)となる

通常の動詞1つの時は真つまりSome(x)の時が対象で
mapは値を写像してSome(x)→Some(f(x))
inspectは値を変化させずに実行Some(x)→{ f(&x); Some(x) }
filterも値は変化させずに実行して偽なら捨ててNone
Some(x)→if f(&x) { Some(x) } else { None }
116デフォルトの名無しさん
2024/12/17(火) 13:56:28.23ID:fyM5pHAa
現状追認オジの意見ほど意味のないものはない
117デフォルトの名無しさん
2024/12/17(火) 13:58:12.78ID:8t1OBzHL
バカでも読めるコードが正解なんだよ
118デフォルトの名無しさん
2024/12/17(火) 14:25:44.95ID:QOGj4SRI
コボラーがそんな事言っていたなw
119デフォルトの名無しさん
2024/12/17(火) 15:37:01.20ID:k3aNgl34
あほくさ。
そこらの医学でも物理でも法律でもいいが適当な論文が単語や言い回しだけ平易にすればバカでも読めるようになるか?
前提知識がないとどうせ意味なんかわからん。
プログラミングも同じ。
理屈が理解できるだけの能がなければ表現ばかり平易にしても無意味。

不必要に難解にする意味はないが、言い回しだけ過度に平易にする意味もない。
120デフォルトの名無しさん
2024/12/17(火) 15:40:38.28ID:8t1OBzHL
特定のプログラミング言語を使えることを物理医学レベルと思ってるのは思い上がり
121デフォルトの名無しさん
2024/12/17(火) 15:52:02.93ID:k3aNgl34
>>120
どこをどう読んだらそんな風に読めるんだ?
言語は当然にそれで表現すべき何事かがある (書く人はそれを理解している) という話なんやが。
122デフォルトの名無しさん
2024/12/17(火) 15:54:52.82ID:8t1OBzHL
>>121
自分はバカだと自覚したほうがいいぞ
ソフトウェア開発するならな
123デフォルトの名無しさん
2024/12/17(火) 16:01:39.84ID:k3aNgl34
>>122
それは大変によくわかる。
自分で書いたものすら意味わからんようになるのは普通のことだからな……。

だから意図を表現することが大事で、小さなロジックの断片にでも名前を付ける。
その状況を表すための名前 (専門用語) こそが大事。
訓練されていない人にとって平易であることとは違う。
124デフォルトの名無しさん
2024/12/17(火) 16:33:22.09ID:bLYSKCYG
>>116
現状追認主義なのに推奨されてる用量・用法は守らず動くだけのコードを披露したがるのは理解できないんだが
125デフォルトの名無しさん
2024/12/17(火) 17:43:30.54ID:SHc5Q5Oi
ママに褒めてもらいたい幼児の心理だよ
わかりやすいだろ
126デフォルトの名無しさん
2024/12/17(火) 20:27:48.43ID:QsDK8zUE
>>117
「ごっちゃに書いて見通しの悪いコードにはせずに、
高階関数のメソッドチェーンにして、
各々のメソッドで個別に関数またはクロージャで処理を指定する。」
ここまでは共通認識でいいんだよね?
万が一これにも反対の人がいるならばまずは代案を明示的に出してほしい

以上の共通認識の上で
語彙の問題という話が出ているからメソッド名の付け方に問題があるということなのか?
それともメソッドが多すぎる(機能が多すぎる)またはメソッドの分別の仕方に問題があるということなのか?
まさか高階関数がわかりにくいという話ではないと思うが
127デフォルトの名無しさん
2024/12/17(火) 21:50:43.67ID:dgkTZZrK
なんでもメソッドチェーンで繋げればいいわけでもなければ
なんでも分割して書けばいいわけでもない
ケースバイケース

一番ダメなのは慣習や暗黙の了解を無視したコード
>>104>>110はその一番ダメなやつ

つかこんな基本的なことから説明させようとするなよ
128デフォルトの名無しさん
2024/12/17(火) 22:05:47.16ID:ecWnwmom
>>127
んでお前ならどう書くんだ?
Rust使った新システムで慣習や暗黙の了解はまだない時に自分で考えてソース書くときはどうするんだ?
129デフォルトの名無しさん
2024/12/17(火) 22:08:10.40ID:e6YSkvhC
>>127
また自分勝手な慣習や思い込みの暗黙の了解かよ
130デフォルトの名無しさん
2024/12/17(火) 22:18:10.64ID:zSkWZLKX
vecs.iter().map(|x| x.iter()).flatten().filter(...)

みたいなのは書いてて気持ち良いけど、全員が賛同するわけではないよな
Rustの公式のドキュメントだって関数型スタイルの書き方と手続き型スタイルの書き方の両方を紹介してるわけだし
そういう「高度な書き方」をバッサリ切り捨ててるGO言語が人気というのもそう
131デフォルトの名無しさん
2024/12/17(火) 22:20:51.38ID:QsDK8zUE
>>127
具体的に何を問題視してるのかわからん
Mutexを使わずに効率よく実装できるケースのようにみえるが
初心者入門向けと書かれてるからMutex利用もアリだろう
132デフォルトの名無しさん
2024/12/17(火) 22:42:34.79ID:e6YSkvhC
>>130
そのコード自体はともかく
そういうメソッド連鎖は標準ライブラリや有名クレートのソースにいくらでも出てくるぜ
まずはソース読んでみな
133デフォルトの名無しさん
2024/12/17(火) 23:29:57.24ID:zSkWZLKX
>>132
自分も好みとしては関数スタイルを使うよ
だけど >>126 のような「それが正しい形であり、みんなそちらを使うべき」みたいな言説はあほらしい
有名どころのOSSのコントリビューターだって、利用者からの質問への回答やチュートリアルでは 「for文で一つずつ要素を Vec に push_back で詰める」コードを示すことも実際にある

Rust開発者は関数スタイルを好む人も多いと思うけど、それは好みの域を出ないと思う
134デフォルトの名無しさん
2024/12/18(水) 09:42:19.11ID:w442kBzm
まあ存在する以上はユースケースがあるってことだからな。
135デフォルトの名無しさん
2024/12/18(水) 12:59:18.01ID:RrhqiCIc
コードゴルファーのために存在してるわけじゃないからな
136デフォルトの名無しさん
2024/12/18(水) 13:17:46.53ID:3HdOm/G7
そろそろitertoolsを標準ライブラリ化する話はないのか?
137デフォルトの名無しさん
2024/12/18(水) 18:37:10.88ID:C5X2cUVY
個別に取り入れられてる
まとめて標準化はない
棲み分け
138デフォルトの名無しさん
2024/12/18(水) 19:09:54.98ID:MW322kuv
>>127
そのマルチスレッド対応コードに
指摘の「慣習や暗黙の了解を無視したコード」とやらが見当たらないのだが
そもそも慣習や暗黙の了解とはどういう意味で使ってる?

>> マルチスレッド対応するなら
>> まず初心者入門向け版としてはCellをMutexに変更で動く
>>
>> fn new_id() -> Option<usize> {
>> static ID: Mutex<usize> = Mutex::new(0);
>>
>> let mut id = ID.lock().unwrap();
>> id.checked_add(1).inspect(|&new_id| *id = new_id)
>> }
139デフォルトの名無しさん
2024/12/19(木) 11:45:17.60ID:p9TYuGiM
こういう C のコードを Rust で描く場合どうやればいい?


もちろん unsafe 利用 ok として
140デフォルトの名無しさん
2024/12/19(木) 11:55:22.77ID:953TTIIh
型のキャストは
std::mem::transmute
141デフォルトの名無しさん
2024/12/19(木) 12:16:13.05ID:H/9JfOm9
assert_eq!((3.14_f32).to_bits(), 0b1000000010010001111010111000011_u32);
assert_eq!(f32::from_bits(0b1000000010010001111010111000011_u32), 3.14_f32);
142デフォルトの名無しさん
2024/12/20(金) 15:29:01.33ID:raronLtC
JAIST、「並行量子通信プロトコル」の完全な自動形式検証を実現
http://news.mynavi.jp/techplus/article/20241220-3090485/
143デフォルトの名無しさん
2024/12/22(日) 22:27:16.01ID:K7zRdssG
>>138
中級者向けにはこれでええんかね

fn new_id() -> Option<usize> {
static ID: AtomicUsize = AtomicUsize::new(0);

let mut old_id = ID.load(Relaxed);
while let Some(new_id) = old_id.checked_add(1) {
match ID.compare_exchange_weak(old_id, new_id, Relaxed, Relaxed) {
Ok(_) => return Some(new_id),
Err(updated_old_id) => old_id = updated_old_id,
}
}
None
}
144デフォルトの名無しさん
2024/12/23(月) 22:20:47.40ID:GhTcJSaR
Rustに興味出てきたからとりあえず、とほほさんのサイトに目を通してみたんだけど
…もしかしてあの方、非同期処理と並列処理をごっちゃに理解している?

https://www.tohoho-web.com/ex/rust.html#async-await
145デフォルトの名無しさん
2024/12/23(月) 22:54:25.61ID:OG1FFUyc
>>143
lock freeはそう
今回のアルゴリズムはRelaxedでも大丈夫だがmemory orderingに注意を要する

>>144
executor (runtime) とそこでの使い方次第
single thread で並列(parallel)なく並行(concurrent)のみも可能であるし
それをmulti threadで並行並列も可能であるし
blockさせて並行なく専属並列も可能
146デフォルトの名無しさん
2024/12/28(土) 15:51:05.67ID:SGU/9qSb
Rustしか勝たん
147デフォルトの名無しさん
2024/12/28(土) 17:09:23.73ID:IXmLUnxX
こういうアホが湧いてきたときがピークだな
148デフォルトの名無しさん
2024/12/28(土) 17:20:50.92ID:T6F1mfjg
WebAssemblyはRustが主流なイメージだけど実際どんなもんだろ
149デフォルトの名無しさん
2024/12/28(土) 18:28:20.06ID:wm6lCJnC
linuxカーネルがシェルスクリプトの付属品にならなかったのはシェルを変更できるから
だがjsは、変更不可能にすればjsが永久に主流だというのを意図的にやっている
150デフォルトの名無しさん
2025/01/01(水) 12:59:04.47ID:emEmRiID
>>149
何いってんだお前?
151デフォルトの名無しさん
2025/01/01(水) 18:48:34.00ID:0dTGHEt/
触るな触るな
152デフォルトの名無しさん
2025/01/03(金) 23:49:31.66ID:hQWrSYwJ
ひといないねこのすれ
153デフォルトの名無しさん
2025/01/04(土) 10:08:52.56ID:9AJmtK0P
だからマルチスレッドで発生しうる競合はその2つだけじゃないから

それだけで安全と言い切れるわけないだろ

そもそも安全性ってお前が作るアプリで必要なの?
Linuxカーネルや組み込みだったらわかるけどそんな高度なプログラム作ってんの?
飛行機のシステム作ってて命がかかってるとかならわかるが、その辺のアプリで安全性とかどうでもいいよね

Rust馬鹿信者は開発生産性を軽視しすぎだ、開発生産性を犠牲に安全性に振ってるのがRustだがアプリの特性によって安全性なんぞどうでもいいことが多い

開発生産性が一番重要
154デフォルトの名無しさん
2025/01/04(土) 11:56:56.49ID:Z095809L
難しさによる障壁はあるけど、慣れれば生産性自体は高い言語だと思う
ライブラリ多いし、ちょっとしたツールを作る程度ならエラーハンドリングもそんなに頑張らなくて良いし (anyhow を使えば割と雑に書ける)

流石にPythonのような手軽さは無いけど、C++よりは遥かに書きやすいし、個人的にはC#やJavaよりも楽だと思うくらい
これは言語仕様でなくツールの話だけど、プロジェクトを作ったり、ライブラリを追加したりするのが楽

学習コストが高いのはその通りで、誰かが書いたツールを他の人が保守しづらいみたいな問題はどうしようもないけど…
(そういう用途ならGoが良さそう)
155デフォルトの名無しさん
2025/01/04(土) 12:23:29.13ID:5PJMX9Ru
>>154
他人が書いたコードの保守しやすさはGoより上だと感じてるけどな
型含めてコード上に情報が豊富で作者の意図を取りやすいから
かなり巨大なOSSでも割と楽にプルリクとか出せる
156デフォルトの名無しさん
2025/01/04(土) 12:59:21.10ID:OzBQvYrX
>>155
「自分がRustに慣れてるなら」それは自分も同意
自分の意見は
・Rustは分かるようになるまでが大変
・理解できれば開発者にとって強力な言語
で、「Goの方が向く」というのはとっつきやすさを含めた話のつもりで書いた
他言語の経験者から見たら、たぶんRustは型やトレイトの意味を理解するのが難しいし、参照などのルールを理解しないとコンパイルすら通らないから、Goの方が触りやすいんじゃないかと思う

Arc, Rc, Cell, Mutex とかの型は分かる人にとってはmeaningfulだけど、初学者がすぐに分かるものではないと思う
157デフォルトの名無しさん
2025/01/04(土) 13:59:36.84ID:5PJMX9Ru
>>156
単純にメンテする人員を確保しづらいという意味ならそれはそう
158デフォルトの名無しさん
2025/01/04(土) 22:40:45.82ID:xBPs09Kz
rustのいい所はresultやoption.その他色々な型について文脈が大体決まっていること。なので慣れると人が書いたコードでも読みやすい。c#やjavaとの比較であれば開発効率は大体同じか、勝っているぐらい。nullや例外がある言語はプログラムがどうしても汚くなる。
rustはaiにコード生成させた時の品質も割といい。コンパイルエラーでても対応方法が具体的なのでそのままメッセージをaiに渡すだけで直る。
159デフォルトの名無しさん
2025/01/04(土) 22:49:58.13ID:xBPs09Kz
AIが当たり前の時代においてはコードの記述量そのものは開発効率に直結するものではなくなる。どの言語でも似たような事は出来る。でも作られたコードが、正しいかどうかは別の問題。
AIはたまに嘘を付くので、それをコンパイラで厳密にチエックする必要がある。そういう意味では関数型言語へのシフトは進むし、rustはいい位置にいると思う。
160デフォルトの名無しさん
2025/01/04(土) 23:01:31.53ID:tP/ja7AQ
関数型関係ないから
161デフォルトの名無しさん
2025/01/04(土) 23:15:15.09ID:FAAvXSOV
>>159
関数型である部分ではなく
Rustが安全性にも役立つ史上最強の型システムを構築したことが決め手かな
特にトレイトそしてトレイト境界
さらに例えばSendやSyncといった概念的なトレイトなど
162デフォルトの名無しさん
2025/01/05(日) 00:44:18.92ID:TOCT7c8i
そうなんだ、Rustってすごいんだね!
163デフォルトの名無しさん
2025/01/05(日) 11:01:38.28ID:8kdOFrcZ
関数型関係ないから
164デフォルトの名無しさん
2025/01/05(日) 13:34:15.55ID:4B4hqpXY
お前ら9連休はちゃんと楽しめたか?
165デフォルトの名無しさん
2025/01/05(日) 16:19:33.22ID:mRHgcQU5
九連休に一回もコード書いてない陽キャはこのスレ書き込み禁止な
166デフォルトの名無しさん
2025/01/05(日) 18:30:14.16ID:Rb8d6mKE
体力落ちないように散歩しまくってたら脚の裏に豆出来たよ
167デフォルトの名無しさん
2025/01/05(日) 18:46:31.56ID:7ZREq1Cz
陰キャなのに今年のコード書いてなかった

fn main() {
println!("{}年", (0..10u64).map(|i| i.pow(3)).sum::<u64>());
println!("{}年", (0..10u64).sum::<u64>().pow(2));
}

sum()の型アノテーション外せないの?
168デフォルトの名無しさん
2025/01/06(月) 00:22:47.46ID:criPfDaa
>>167
型アノテーションは必要。
オーバーフローしない十分に大きな型を選定しなきゃならないから。
浮動小数点ならオーバーフローはしないが必要な精度を推論しようがないことにかわりない。
169デフォルトの名無しさん
2025/01/06(月) 00:30:50.77ID:wyPVXQtD
その論理は明らかにおかしい
170デフォルトの名無しさん
2025/01/06(月) 03:11:05.95ID:AJFRd04v
0..10がu64なんだからsumの結果も当然u64だろうという気持ちにはなる
171デフォルトの名無しさん
2025/01/06(月) 08:35:26.36ID:wMDzRwfr
そこは指定必須
例えばu64の和をu128で求める型を以下のように増やせるから無指定を許すとコードが曖昧になる

struct MySum(u128);

impl std::iter::Sum<u64> for MySum {
fn sum<I: Iterator<Item = u64>>(iter: I) -> Self {
iter.fold(MySum(0), |sum, n| MySum(sum.0 + n as u128))
}
}

fn main() {
// u64の和をu128で計算できる
let x = [u64::MAX, u64::MAX].into_iter().sum::<MySum>().0;
assert_eq!(x, u64::MAX as u128 * 2);

// このコードはデバッグモード時にoverflowして悪手
let x = [u64::MAX, u64::MAX].into_iter().sum::<u64>();
assert_eq!(x, u64::MAX - 1);

// ラップアラウンドさせたいならこうする
use std::num::Wrapping;
let x = [u64::MAX, u64::MAX].into_iter().map(|n| Wrapping(n)).sum::<Wrapping<u64>>().0;
assert_eq!(x, u64::MAX - 1);
}

このように必ず型を指定して使い分けをする
172デフォルトの名無しさん
2025/01/06(月) 16:43:43.88ID:lN8qCLjL
Monoidを先に整備すればこんなことにはならずに済んだろうに
173デフォルトの名無しさん
2025/01/06(月) 17:02:00.56ID:jpfBkgv0
>>171
そういうのは本来sumの役割じゃなくないかという気持ち
174デフォルトの名無しさん
2025/01/06(月) 18:43:17.81ID:tSs1WAlu
オーバーフローとかは関係なくて型システムの制約と標準ライブラリの実装方法の問題だよ
175デフォルトの名無しさん
2025/01/06(月) 19:00:20.90ID:9m9l0GJF
sum()の戻り値の型をIterator::Itemに固定するとItemが参照型の場合に対応できないな
176デフォルトの名無しさん
2025/01/06(月) 21:13:46.20ID:CO3hUR7m
そら固定したらダメだよ
177デフォルトの名無しさん
2025/01/06(月) 21:49:35.38ID:4hhkOX4f
ジェネリクスで良いとは思うけど、デフォルトの型として元の型になってくれると便利な気はする
参照の場合とかは、数値型なら .copied() で値にできるし
178デフォルトの名無しさん
2025/01/07(火) 23:41:33.61ID:tWQ6EHho
>>177
copy可かつcopyでコスト増にならないのはプリミティブな数値型だけだよ
巨大な整数値やタプルや行列などもありうる
例えば std::simd::Simd のimpl Sumでも参照を扱ってるね
impl<'a, const N: usize> Sum<&'a Simd<u32, N>> for Simd<u32, N>
179デフォルトの名無しさん
2025/01/08(水) 00:21:31.60ID:tEqXW2Dh
もうfoldでいい気がしてきた

fn main() {
use std::ops::Add;
println!("{}年", (0..10u64).map(|i| i.pow(3)).fold(0, u64::add));
println!("{}年", (0..10u64).fold(0, u64::add).pow(2));
}

3乗の総和=総和の2乗の証明は今年の入試で狙われそうだな
帰納法使えば簡単だけどn(n+1)/2の導出からだとだるい
180デフォルトの名無しさん
2025/01/08(水) 23:11:07.72ID:SlaqrUqV
そのSimdのSum実装のこれを見てそこに落ち着いたのか
iter.fold(Simd::splat(0 as $type), Add::add)
181デフォルトの名無しさん
2025/01/11(土) 08:43:38.04ID:UwKGG2Q8
Rust排除のためのMozilla潰しが始まったか?

GoogleとLinux FoundationがChromiumの開発と維持を支援する基金「Supporters of Chromium-Based Browsers」を設立、MetaやMicrosoftなども参加 - GIGAZINE
https://gigazine.net/news/20250110-supporters-of-chromium-based-browsers/
182デフォルトの名無しさん
2025/01/11(土) 10:01:12.58ID:dWpFaXpi
Chromium プロジェクトが Rust の利用をサポート
https://developers-jp.googleblog.com/2023/02/supporting-use-of-rust-in-chromium.html
183デフォルトの名無しさん
2025/01/11(土) 10:03:06.03ID:dWpFaXpi
Rust を導入する目的は、シンプルで(IPC を使わない)安全な(全般的に C++ よりも複雑でなく、サンドボックスでメモリの安全性に関するバグは発生しない)形で 2 の法則を満たすことにより、
184デフォルトの名無しさん
2025/01/11(土) 10:08:09.58ID:dWpFaXpi
Rust は、Mozilla がブラウザを書くために特別に開発したものなので、このテクノロジーが Chromium でようやく使われ始めるようになるのは、理にかなったことです。
システム ソフトウェア業界に莫大な貢献をしてくださっている Mozilla に感謝いたします。
Rust は、安全性とパフォーマンスの両方を言語に期待できることを見事に証明しています。
185デフォルトの名無しさん
2025/01/11(土) 10:21:28.46ID:UwKGG2Q8
むむっ
186デフォルトの名無しさん
2025/01/11(土) 11:00:56.87ID:rJtu07B+
そもそもMozillaはRust開発者の大半をリストラしてしまったし
すでに単なる1ユーザ企業に過ぎなくて、Rustの発展にはあんまり関係なくなってる
どちらかというとMDNを維持できるかとかの方が重要そう
187デフォルトの名無しさん
2025/01/11(土) 11:44:47.56ID:3LDhx22M
GoogleはChromeが独占禁止法違反にならないようにFirefox支援しててMozillaは生きててもらわなきゃならん
デフォルトの検索エンジンに採用する見返りにGoogle社から受け取ってる金がMozillaの収益の90%を占めるから潰すのはその金を絞るだけでいい
188デフォルトの名無しさん
2025/01/11(土) 12:13:12.32ID:RVo7o+pP
>>187
おまえ日本語不自由なら無理に書き込まなくてもいいんだよ?
189デフォルトの名無しさん
2025/01/11(土) 12:35:47.49ID:3LDhx22M
>>188
お前には難しかったか
すまんな
190デフォルトの名無しさん
2025/01/11(土) 12:37:03.90ID:6FujqKQM
添削してあげる

GoogleのChromeが独占禁止法違反にならないように対抗馬のFirefoxにある程度台頭してもらう必要がある
そのためGoogleはMozillaを投資している
投資の一例としてMozillaはデフォルトの検索エンジンに採用する見返りにGoogleからMozillaの収益の90%を占める投資を受け取ってる
仮にGoogleがMozillaを潰すのならその投資を絞るだけでいい
191デフォルトの名無しさん
2025/01/11(土) 12:38:54.31ID:6FujqKQM
訂正

誤 そのためGoogleはMozillaを投資している
正 そのためGoogleはMozillaに投資している
192デフォルトの名無しさん
2025/01/11(土) 12:49:21.17ID:dWpFaXpi
いずれも着実にRust化
193デフォルトの名無しさん
2025/01/11(土) 12:57:56.78ID:3LDhx22M
>>190
俺より頭が良さそう
尻拭いしてもらってすまんな
194デフォルトの名無しさん
2025/01/11(土) 16:20:18.17ID:Vz6os9Zc
ところがMozillaに資金援助してるのが
独禁法違反ともめてるわけだ
195デフォルトの名無しさん
2025/01/12(日) 23:53:09.91ID:DJe+xzuK
ChromeもMozillaも各々Rust化へ向かってるなら
今後はここでもう揉めなくて済むな
196デフォルトの名無しさん
2025/01/13(月) 05:20:11.26ID:i8wWMTup
>>189
結局添削されてるな
ガイジ乙
197デフォルトの名無しさん
2025/01/13(月) 13:52:02.59ID:g4/CTboD
>>188
あなたは頭が不自由なのですね判ります
198デフォルトの名無しさん
2025/01/13(月) 16:13:11.82ID://H6HHHW
Rust 1.84.0でprovenance関係が安定化されてるね
199デフォルトの名無しさん
2025/01/18(土) 10:00:11.55ID:7Jaib8zo
Rustで描かれてるMozillaがめっちゃ不安定なんすけど
200デフォルトの名無しさん
2025/01/18(土) 10:07:56.33ID:CvcZ6tuy
>>199
Mozillaのメモリ管理や中核部分はC++で書かれている
201デフォルトの名無しさん
2025/01/19(日) 17:48:38.01ID:IALgBqxE
>2016/07/20 まとめ:Firefox 48 には、Rust で書かれたコードが初めて含まれます。以降のバージョンにも Rust での実装が予定されている部分があります。
10年掛けてまだ置き換わってないってどういう事なの
202デフォルトの名無しさん
2025/01/19(日) 18:43:58.99ID:9UIKz8U/
現場を動かすほどの言語じゃなかったってこと
いずれ忘れ去られていくだろうねw
必死で宣伝するやつはしばらく残るだろうけど
203デフォルトの名無しさん
2025/01/19(日) 18:56:23.31ID:9gpOiSYw
Rust化を進めようとしているのはChromeの方だよ
ソース >>182 >>184
204デフォルトの名無しさん
2025/01/19(日) 21:30:19.41ID:w17+kMts
>>201
単純に考えてその時点で約20年積み上がってからね
205デフォルトの名無しさん
2025/01/19(日) 21:49:11.92ID:9gpOiSYw
firefoxシェアほとんど無くなって自立収入ではやっていけなくて
独占禁止法を逃れるためのGoogleからの資金で開発やってるから
基本部分は変えずに独自機能の強化の方に力を入れてるんじゃないかな
206デフォルトの名無しさん
2025/01/19(日) 21:58:50.96ID:CccJ4y+9
GoogleはRustでXilemやってるね
207デフォルトの名無しさん
2025/01/25(土) 15:49:13.35ID:6/VZHgMn
WindowsのOsStringってなんでUTF-16直接保持しないであんな面倒なことやってるんだろ
208デフォルトの名無しさん
2025/01/25(土) 20:21:28.98ID:X7sHiUyB
>>207
Rustは時代に応じて文字列をUTF-8で扱っていてString型には必ず正規なUTF-8が入ることが保証される
しかし外の世界は魑魅魍魎でUnicodeですらないものを扱えないといけない
ファイル内容やネット通信でUTF-8以外が定められてるならencoding_rsを使って明示的に変換しながら読み書きする
209デフォルトの名無しさん
2025/01/25(土) 20:22:51.37ID:X7sHiUyB
>>207
一方で問題となるのはファイルシステムのパス等だ
OS環境毎に異なるプログラムは書きたくないからコード上はString型つまりUTF-8で統一して扱いたい
パスがUTF-8自体もしくはUTF-8に1対1で対応するUTF-16等ならプログラム中はString型(=UTF-8)で扱えてうれしい
しかしパス内にはUTF-8に変換できないものも含まれている可能性があるためOsString型(=UTF-8+α)として区別して扱う
210デフォルトの名無しさん
2025/01/25(土) 20:30:47.77ID:X7sHiUyB
>>207
OsString型は以下の2つを満たす抽象的な型となっている
正規UTF-8のみを含むならばコスト無しでString型に変換できて逆にString型からは常にOsString型にコスト無しで変換できる
各OS環境で扱える全ての表現と1対1に対応できる(特に正規なUnicodeならばUTF-8に対応する)
この1対1が重要でありUnicodeでない場合も読み書きしての同一性が保証される
これらを満たせば内部の構造は自由でありユーザープログラムがその構造に依存することはなく構造を知る必要もない
211デフォルトの名無しさん
2025/01/25(土) 20:42:28.32ID:X7sHiUyB
>>207
Windows OSのUTF-16環境であってもユーザープログラムは環境の違いを気にせず統一して扱えるようにString(=UTF-8)とOsString(=UTF-8+α)で扱う
そのため正規なUTF-16はUTF-8に変換して内部で扱うことになる
しかし実際には任意の16bit列がパス等に現れることも可能なのでUTF-16以外の場合も1対1にOsStringに変換できなければならない
この任意の16bit列にはUTF-16のみの場合も含まれるため区別してWTF-16と呼ぶ
つまりWTF-16=UTF-16+αの関係になっている
あとはそれと1対1に対応するWTF-8=UTF-8+αを上手く定義してやれば前述の性質を満たす内部構造が完成する
以上おわり
212デフォルトの名無しさん
2025/01/25(土) 22:15:52.59ID:6/VZHgMn
> Windows OSのUTF-16環境であってもユーザープログラムは環境の違いを気にせず統一して扱えるようにString(=UTF-8)とOsString(=UTF-8+α)で扱う

OsStringの内部エンコーディングがWTF-16だと統一的に扱えないと言いたいの?
213デフォルトの名無しさん
2025/01/25(土) 22:25:37.00ID:6/VZHgMn
どうなっているか、ではなく、なぜそうなっているか
214デフォルトの名無しさん
2025/01/25(土) 23:56:53.55ID:I/LFBEOt
String <-> OSString <-> System Native String

右の変換コストよりも左の変換コストを下げることを優先してる
そのほうが標準ライブラリ内部で共通の実装や似通った実装を使いやすい
215デフォルトの名無しさん
2025/01/26(日) 00:33:00.73ID:pBUmpNYA
System Native Stringは直接取り扱わず、OsStringでラップして扱うのが原則なら
ゼロコスト抽象化の観点から言えば右の変換コストをゼロにするべきでは?
左の変換は必ず行うとは限らないのだから
216デフォルトの名無しさん
2025/01/26(日) 00:38:12.14ID:pBUmpNYA
というか、Windows以外なら実際右の変換が実行時チェック無しのゼロコストになってて、左の変換時にチェックしてるんだから、その説明には合わないじゃないか
どこにそんな説明が書いてあるんだ
217デフォルトの名無しさん
2025/01/26(日) 01:11:13.56ID:cI9cwCw6
>System Native Stringは直接取り扱わず、OsStringでラップして扱うのが原則なら
別にそんな原則ない
OsStringで楽できないなら使わなくてもいいよ

>ゼロコスト抽象化の観点から言えば右の変換コストをゼロにするべきでは?
それは君がマルチプラットフォーム対応のライブラリを維持管理する立場で考えず
Windows中心でしか物事を見てないからだよ

>というか、Windows以外なら実際右の変換が実行時チェック無しのゼロコストになってて、左の変換時にチェックしてるんだから
間違って理解してるね

>どこにそんな説明が書いてあるんだ
公式ドキュメント
218デフォルトの名無しさん
2025/01/26(日) 13:21:14.47ID:pBUmpNYA
? ちょっと調べたらバレるくだらない嘘つくんだったらもう相手してあげないよ
219デフォルトの名無しさん
2025/01/26(日) 18:31:50.46ID:4FlbzXxO
外部と内部でデータの表現形式が異なる場合
外部に従属するソフトウェアを作ってるのでなければ
可能な限り境界に近いところで変換を行うのは当然の選択
220デフォルトの名無しさん
2025/01/26(日) 19:05:06.86ID:o76t42ts
外部とUTF-8変換する微々たるコストが深刻になる用途があるならば標準ライブラリを使わずに独自に実装すればよいだけの話
標準ライブラリはAsRef<OsStr>やAsRef<Path>でそのままstrやStringが使えるように設計されている
File::openなどでのパス指定の引数もこのAsRef<Path>がトレイト境界となっている
as_で扱える設計が望ましい
221デフォルトの名無しさん
2025/01/26(日) 20:54:35.44ID:aE8oqgD4
>>220
後半の話は全然関係ないじゃん
222デフォルトの名無しさん
2025/01/26(日) 21:10:37.51ID:o76t42ts
>>221
後半ためにはOsStringがStringを含む拡張になっていなければならない
そうなっていれば型の読み替えだけでas_refできる
223デフォルトの名無しさん
2025/01/26(日) 22:23:21.64ID:b7sQng67
>>222
それは>>213が書いてるようにどうなってるかの話で
なぜそうなってるかの理由ではないよね

File::openはAsRef<Path>を受け取るけど
windowsならすぐにVec<u16>に変換されてる

仮にwindows向けOsStrの内部がu16ベースで
File::openがInto<Path>を受け取る実装だったとしても
処理内容は変わらない
224デフォルトの名無しさん
2025/01/27(月) 20:17:02.44ID:cd9tX+Hd
>>223
それは違うな
str.as_ref()と参照を読み替えるだけでOsStrになることが重要
そのためOsStrとstrのPartialEqも用意されていてコストなく比較可能
UTF-8のみであればOsStrとstrは一致することが本質
225デフォルトの名無しさん
2025/01/27(月) 23:21:32.51ID:4GlaXCk5
>>224
どれも結果であって原因ではないね

>str.as_ref()と参照を読み替えるだけでOsStrになることが重要
なんで重要なの?

>そのためOsStrとstrのPartialEqも用意されていてコストなく比較可能
OsStrとstrをコストなく比較可能にするために
System Native StringをOsStrにするタイミングでコストがかかってる
コストをかけるタイミングだけの違い
OsStrとstrがコストなく比較可能でなければならない必然性は全くない
226デフォルトの名無しさん
2025/01/28(火) 15:31:40.54ID:Wlj2eClg
ファイル操作なんてI/O負荷の方が高いんだからファイルパスの変換コスト気にする必要あるか?
文字コードが違う環境はwindows以外にも色々あるだろうし。
227デフォルトの名無しさん
2025/01/28(火) 16:58:57.81ID:bBapgORx
直交する話を持ち出しても元の議論には一切影響しませんが
228デフォルトの名無しさん
2025/01/28(火) 20:40:46.87ID:BsfM3c6P
一般的な話として
アスキー非互換かつサロゲートペア問題を抱えるUTF-16は欠陥品なので使用は好ましくない
UTF-16や16bitで扱うシステムはユニコードが16bit時代に決めた古いシステムがほとんどで稀に後に無知者が導入したものがある程度

Rustで文字charは正しく32bitとなっており
文字列strはネット上やファイル内でも推奨されアスキー上位互換のUTF-8になっている
さらにOsStrはそのUTF-8の上位互換となり集合的にはOsStr⊃str⊃アスキーとなっている
それさえ満たせば細かい内部実装は各OS毎に異なってよい
欠陥品のUTF-16は何も満たせずそこでも排除で正しい
229デフォルトの名無しさん
2025/01/28(火) 22:01:50.93ID:GfuGIG8x
また意味のない話を始める
さすが複オジ
230デフォルトの名無しさん
2025/01/29(水) 00:32:12.48ID:g0VOlyym
OsStringの用途はファイルパスに限られたものではないけど主たる用途で性能が問題にならないというのは今の実装方法が選ばれた理由の一部ではある
231デフォルトの名無しさん
2025/01/29(水) 00:58:47.06ID:0dekUNSK
UTF16はメモリとパフォーマンスのバランスが良い
オンメモリの内部形式としては悪くないチョイス
232デフォルトの名無しさん
2025/01/29(水) 02:25:08.58ID:j23j/EVS
別に理由が無いなら無いと言えばいいのに、変にこじつけようとするから
233デフォルトの名無しさん
2025/01/29(水) 07:54:01.03ID:hKDzv5Fb
スレを荒し続けているUTF16信者は何がしたいの?
本気でUTF16がいいと信じているならそういうcrateを作って布教すればいい
そんな需要はないと思うが
234デフォルトの名無しさん
2025/01/29(水) 08:41:13.10ID:UbIZehjy
>>225
それは >>219 が述べるように「変換は境界で」という基本思想による。
このやり方が複雑さを避ける良い方法だというのは歴史の積み重ねで皆が実感してきたことなので今さらどうこう言っても「その話はもう終わった。蒸し返すな」という気持ちなんだよ。
235デフォルトの名無しさん
2025/01/29(水) 10:10:29.66ID:j23j/EVS
じゃあせめて「その話」がどのissueでされたかでも貼ってくれないかな
236デフォルトの名無しさん
2025/01/29(水) 10:45:41.27ID:kksSyPk2
甘え過ぎw
237デフォルトの名無しさん
2025/01/29(水) 11:52:20.85ID:j23j/EVS
ソース無しの妄想だからそう返すしかないか
238デフォルトの名無しさん
2025/01/29(水) 11:54:18.78ID:LdIOcSwO
複オジはともかく質問者もまだ分かってなかったのか
239デフォルトの名無しさん
2025/01/29(水) 21:48:50.26ID:1MMCze3E
わかった
少なくともこうして容易に使えることが最低必要条件
fn OsStr::to_str(&self) -> Option<&str>
したがってOsStrはstrを含む拡張集合
それ以外に制約はなく各OS毎に内部実装は自由
240デフォルトの名無しさん
2025/01/29(水) 22:07:32.91ID:mZdkrOxi
それがお前の妄想でないという根拠は?
241デフォルトの名無しさん
2025/01/29(水) 23:10:55.15ID:LNP2TJDd
impl AsRef<OsStr> for str
242デフォルトの名無しさん
2025/01/29(水) 23:12:05.86ID:1MMCze3E
issueで内部が16ビットではそれが機能しないと
243デフォルトの名無しさん
2025/01/29(水) 23:17:05.07ID:1MMCze3E
機能しないと議論されて決定してる
244デフォルトの名無しさん
2025/01/29(水) 23:58:56.14ID:ogxgEV/3
>>234
219と225は同一人物だぞ
245デフォルトの名無しさん
2025/01/30(木) 00:13:31.97ID:N5Ev4mKi
>>232
特定のプラットフォームに依存するコードはなるべく減らしたいという動機は理解できるんだよね?

可能な限り境界に近いところで外部表現と内部表現の変換を行うことがプラットフォーム依存のコードを減らすことに寄与するというのもわかるよね?

あとは外部の表現形式を内部でも維持したとしてもデメリットを上回る十分なメリットがあるかどうか
OsString/OsStrの主たる用途ではそれだけのメリットはないという判断
メリットがある用途ならOsString/OsStr以外を使いましょうということ
246デフォルトの名無しさん
2025/01/30(木) 00:26:18.93ID:N5Ev4mKi
str <-> OsStrの話は差異をうまく隠蔽しにくくシグニチャに影響しうるというのがあるけど仮に影響しなくても境界で変換するのが望ましいという判断は変わらなかったはず
247デフォルトの名無しさん
2025/01/30(木) 00:39:30.16ID:N5Ev4mKi
https://github.com/rust-lang/rfcs/pull/575
https://github.com/rust-lang/rfcs/blob/master/text/0517-io-os-reform.md#string-handling
248デフォルトの名無しさん
2025/01/30(木) 20:50:11.01ID:DEHLqPyE
>>247
ありがとう、RFCのほう探せばよかったのか

> ## Wide string representation
> Downsides:
> * These conversions have inconsistent performance characteristics between platforms. (Need to allocate on Windows, but not on Unix.)

やっと納得できる理由が出てきた、これはたしかにな…いやでもなあ、直接OsString/OsStrを触るAPIがもっと充実していれば別にString/strとの変換をそこまで気にする必要もないのでは?
一気にString/str相当のAPIを実装するのも手間だし、OsString/OsStrで何かやりたかったらとりあえずString/strと変換してなんとかしてくれ、だからここではプラットフォームごとの差を付けたくない、って方針だったのかね?
とはいえ、考えられる発展としていろいろな文字列型を一般化する抽象化を作れるはずとかちゃんと書いてあるし、まあまあ納得できる経緯説明ではある
ありがとうね

> // and ultimately other functionality typically found on vectors,
> // but CRUCIALLY NOT as_bytes

…とか書いてるけど、今は普通にas_encoded_bytesとして実装しちゃってるし、結局なんだかよく分からんなあ
249デフォルトの名無しさん
2025/01/30(木) 23:18:13.05ID:tIaEaP36
>>248
>> * These conversions have inconsistent performance characteristics between platforms
こう書かれてるけどパフォーマンスという点では特にDownsideじゃないと思うんだけどね
今の実装でも発生してるし違う環境用のOsStringを1つのプログラムが実行時に混ぜて扱うわけでもないし

問題なのは内部コードにアロケーションタイミングの違いみたいなのが侵食して分岐が増えること
わかりやすい例としてはOsStr::new(“foo”)が&OsStrを返せなくてCow<OsString, OsStr>になるとか
250デフォルトの名無しさん
2025/01/30(木) 23:38:58.04ID:dm9clnkq
そうだね
だから現状の仕様で正しくて
10年間も問題視されていない
許容できない用途が仮にあるならWindows専用のクレートを作ればいい
251デフォルトの名無しさん
2025/01/30(木) 23:54:08.19ID:tIaEaP36
as_encoded_bytesの話はこれ
https://github.com/rust-lang/libs-team/issues/306
252デフォルトの名無しさん
2025/01/31(金) 02:25:28.04ID:r6oh8F22
> # Alternatives
> * A split_at(&self, pos: usize) -> (&OsStr, &OsStr) style method. This is ostensibly simpler than a slicing API. But:
> ** The OMG-WTF-8 encoding does not support this. It requires some splits to produce overlapping slices, so that left.len() + right.len() > orig.len(). The encoded bytes on one side of pos might form a valid OMG-WTF-8 string while those on the other side do not.
> *** RFC #2295 that proposes this encoding was merged five years ago (but has not been implemented).

何その絵に描いた餅を喉に詰まらせて死ぬみたいな話……
253デフォルトの名無しさん
2025/02/03(月) 22:01:34.61ID:QOxyx9oM
ほとんどのシステムはUTF-8以外のファイル名があったら無視かエラーでいいからどうでもええわ
254デフォルトの名無しさん
2025/02/06(木) 13:08:01.16ID:s+irydGq
http://2chb.net/r/tech/1691038333/514-528

ワッチョイ付いてないとどこにでも出るな妖怪
255デフォルトの名無しさん
2025/02/07(金) 13:12:05.02ID:2gmcoh6P
LinuxカーネルのメンテナがRustコードを混ぜることを「癌」と呼び、開発者間の対立が激化中 - TechFeed
https://techfeed.io/entries/67a52d4677bdbc0f2990eed9

争え……もっと争え……
256デフォルトの名無しさん
2025/02/07(金) 21:47:52.74ID:Q2ziLxl4
Linusが一喝するまで収めるの無理やろ
257デフォルトの名無しさん
2025/02/07(金) 22:08:06.65ID:lN1GxRH8
そりゃドライバーはカーネルのインターフェイスに従って動作すべきだから、ラッパーなりで隠蔽すべきなんじゃないんかね。

個別のドライバーのためにカーネル側をカスタマイズするのはインターフェイスを侵食する越権行為だから、そんなのドライバーのラッパー側でやれ、と言いたくなるのはわかる。
258デフォルトの名無しさん
2025/02/08(土) 23:53:09.62ID:YOrLPiSI
>>257
それは君の理解が間違っている

今回はRust製の各デバイスドライバが独自のCバインディングを持つ不便な状況を改善するためのパッチだ
つまりカーネルのC側に手を入れるパッチではなくC側は同じままで変更は一切ない
今回の件は該当部分dma_alloc_coherent()のC⇔Rustの抽象ラッパーのコードを含めるパッチだけだ
それさえメインテナーに拒否されたため大問題になっている
259デフォルトの名無しさん
2025/02/08(土) 23:57:46.16ID:dA8HOTum
デバドラはRustで書くのが普通になってきているから
そういう共通ラッパーという形のRustインターフェイスが色々と欲しいのよね
でもそれはいずれカーネル自体のRust化へ繋がる道になるから強く反対してるのよ
260デフォルトの名無しさん
2025/02/09(日) 00:59:41.26ID:LgxLklST
普通に考えたら異種の言語が混ざるとデバッグと開発の障害でしかないからどこかで境目は必要
261デフォルトの名無しさん
2025/02/09(日) 06:01:46.16ID:2Eyl255N
>>258
メンテナーがRust用コードのメンテナンスを拒否したということじゃないの?
Rust for Linuxでサポートするような話じゃないんかね。
262デフォルトの名無しさん
2025/02/09(日) 06:47:59.48ID:2n/Om2yv
>>260
異種の言語を混ぜる話なんか誰もしていない
今回の事件のパッチも異種の言語を混ぜることなくCのAPIはそのままで
その上にRustの層を作る話

In response, Krummrich explained the Rust for Linux effort is creating Rust code that abstracts the C APIs for all Rust drivers and is maintained by Rust devs. In other words, the C side of the kernel stays the same, and Rust drivers use abstractions to that C code, and that these abstractions are maintained by a team centrally in rust/kernel, all of which is arguably better than drivers having their own individual C bindings.
263デフォルトの名無しさん
2025/02/09(日) 08:50:09.78ID:lISaYUpW
最終的にRust側のメンテナが切れてSNSで晒したりしたのは良くなかったけど
技術的にはC側に迷惑かからないように十分配慮して、出てきた懸念も全て潰したにも関わらず
「とにかくRustに関わりたくないから却下」だったからまぁ切れるのも分かる
264デフォルトの名無しさん
2025/02/09(日) 09:09:11.56ID:2Eyl255N
>>263
そのコードはcで使えるの?
使えるならともかく、Rust専用ならメンテナーが「そんなののメンテナンスで負担増えるのは嫌だからRustドライバー側でやってくれ」というのもわかる。

Rust for Linuxはこういうのの受け皿にならんのかしらん?
265デフォルトの名無しさん
2025/02/09(日) 09:24:37.62ID:lISaYUpW
>>264
受け皿も何もそもそもRust for Linuxでやってる話だし
完全にRustドライバー側でやるからCには影響しないって言ってるわけ
具体的にメンテナンスの負担が増える理由を挙げてくれれば対応策も考えられるけど
「とにかくお前らを邪魔するためなら何でもする」って言ってるからどうしようもない
266デフォルトの名無しさん
2025/02/09(日) 10:38:22.52ID:2Eyl255N
>>265
メンテナが「Rustは俺のサポート範囲に出てこないでドライバ内で閉じてやってくれ」と言うんだから、当面はrust fir linux でドライバーのテンプレートを作るなりCバインディングサポートライブラリを作るなりすればいいんじゃないんかね。

「Rust製の各デバイスドライバが独自のCバインディングを持つ不便な状況」というのもrust fir linuxでフレームワーク作ってサポートすれば解決するし。
267デフォルトの名無しさん
2025/02/09(日) 10:58:29.23ID:LgxLklST
互いにブラックボックス内でなにが起ってるのかわからないとすると困るけどね

コレコレこういうコードを書いたらこういう結果が出るはずなのに出ないとコード提示されても
相手が理解できなければこじれるだけ
268デフォルトの名無しさん
2025/02/09(日) 11:17:45.05ID:lISaYUpW
>>266
そこで言う当面はってのは3-4年前の状況かな
今はもう準備も整って、Mac用のAsahiLinuxとかAndroidとかフォークしてる勢には普通に入ってる段階
だからそろそろ本体にって話になってるわけだけど、拒絶されるなら彼らはフォークに戻っていくだけだとは思う
269デフォルトの名無しさん
2025/02/09(日) 11:46:40.81ID:SqO2AyXb
>>256
Linusの返答も出てるな
https://x.com/lauriewired/status/1888018962811863109
270デフォルトの名無しさん
2025/02/09(日) 12:46:41.58ID:LgxLklST
内部の問題をSNSつかって文句言うなアホ
お前が問題じゃ
271デフォルトの名無しさん
2025/02/09(日) 13:50:57.72ID:CgBIGE40
ここや他のスレでRustに意味のわからん難癖つける人が
いるのは5ちゃん民度のせいではないのがわかった
272デフォルトの名無しさん
2025/02/09(日) 14:20:31.41ID:o7IahYRC
C++に似ている部分はC++と同じ程度に批判される
それとハイブリッド的な部分
100%ガソリンで動くか100%電気で動くかどっちかにしろという
273デフォルトの名無しさん
2025/02/09(日) 16:28:50.86ID:2Eyl255N
>>268
該当コード用のメンテナがRustを使いこなすようになるか、専用のメンテナが別に現れるか、現在のメンテナが引退してRust推進のメンテナに代わるまでじゃない?

これはメンテナの複雑性管理&管理ポリシーの問題だから、普及具合とかはあんまり関係ない。
274デフォルトの名無しさん
2025/02/09(日) 23:42:15.23ID:yWuHVaf1
色んなものがRust製になっていく中
最後まで残りそうなのが巨大でモノリシックなカーネルとブラウザになりそうだな
275デフォルトの名無しさん
2025/02/10(月) 00:33:23.09ID:vC/tdt5D
日本の古文漢文は残らないかもしれないが西洋では全部保存していて選択肢が増えるだけ
だから、向こうが世界の中心みたいな空気になる
276デフォルトの名無しさん
2025/02/10(月) 16:53:59.27ID:NarMF1Jn
firefoxはまだrust製にはならんの?
277デフォルトの名無しさん
2025/02/10(月) 17:38:09.01ID:cWC6BpGk
Linux カーネルは保守的な方針だろ。
数年前まで C89 が前提だったんだぞ。
この速度感で考えるなら Rust 導入なんてまだまだ時期尚早じゃね?
278デフォルトの名無しさん
2025/02/10(月) 19:19:29.76ID:CLC139Pw
Firefoxのレンダリングエンジンは大分前からRust製(Servo)でしょ
279デフォルトの名無しさん
2025/02/10(月) 19:49:30.60ID:+iqVWpvf
>>278
Servoにそんな完成度はない
実験レベル
280デフォルトの名無しさん
2025/02/10(月) 22:57:20.26ID:K8Z0rKJe
錆→癌
281デフォルトの名無しさん
2025/02/10(月) 22:59:57.28ID:u4cWXaji
Mozillaお金なさすぎて色々と切り捨てて
RustもRust Foundationへ移管されたもんな
結果的にRustにとっては中核が安定してラッキーになったけどさ

> 2020年にMozillaがすべてのServo開発者を解雇した後、プロジェクトのガバナンスはLinux Foundation Europeに移管された。
> 開発作業は公式には同じGitHubリポジトリで続けられており、プロジェクト自体は完全にボランティア主導です。
282デフォルトの名無しさん
2025/02/10(月) 23:42:58.20ID:vC/tdt5D
C/C++その他の知識を蒸留してないわけがないから
コストもコスパもないんだよ
283デフォルトの名無しさん
2025/02/12(水) 22:57:39.73ID:f3u+GZc6
Pointers (this includes values of reference type) in Rust have two components.
- The pointer's "address" says where in memory the pointer is currently pointing.
- The pointer's "provenance" says where and when the pointer is allowed to access memory.
We have to know not only the address the pointer points to,
but also track which other pointer(s) it is "derived from".
Provenance is useful because it allows powerful optimizations.
Provenance can affect whether a program has undefined behavior.
284デフォルトの名無しさん
2025/02/16(日) 23:45:42.12ID:aPxhKLjT
Rust Tokyo 2024 開催レポート
https://gihyo.jp/article/2024/12/rust-tokyo-2024-report

lud20250219202612
このスレへの固定リンク: http://5chb.net/r/tech/1733146370/
ヒント:5chスレのurlに http://xxxx.5chb.net/xxxx のようにbを入れるだけでここでスレ保存、閲覧できます。

TOPへ TOPへ  

このエントリをはてなブックマークに追加現在登録者数177 ブックマークへ


全掲示板一覧 この掲示板へ 人気スレ | Youtube 動画 >50 >100 >200 >300 >500 >1000枚 新着画像

 ↓「Rust part27 YouTube動画>1本 」を見た人も見ています:
なんUSTR部
なんUSTR部
なんUSTR部
なんUSTR部
なんUSTR部
なんUSTR部
なんUSTR部
なんUSTR部
なんUSTR部
なんUSTR部
なんUSTR部
なんUSTR部
なんUSTR部
なんUSTR部
なんUSTR部
なんUSTR部
なんUSTR部
なんUSTR部
なんUSTR部
SATORU
citrus
なんG RUST部
なんJ RUST部
STERUSS 2
なんU RUST部
RYUTist解散
SOUL TRAIN
Naru Sato
TRAP MUSIC
SUPER GT+
DONGURTES
SUPER GT+
catch surf
Suzu Part1
test sure
Crossout
SUPER GT+
Rust part9
Rust vs Go
SUPER GT+
SUPER GT+
SUPER GT+
The Surge
Surgeon pt2
SUPER GT+
DISTURBED
Soul Captor
なんUSTR部 ★2
Fkindustry
azusa part4
SUPER GT+
Rust part8
SUPER GT+
UberEats仙台
SUPER GT+
Rust Part5
Rust part16
Rust part20
Rust最強(仮)
男Uber Eats
PUSHIM Part1
tjrssukilou
初心者Vtuber
Botulus Rex
Sproutsスレ
なんUSTR部 ★2
18:21:56 up 63 days, 19:20, 0 users, load average: 9.65, 9.88, 9.94

in 0.097811937332153 sec @0.097811937332153@0b7 on 062007