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

Rust part27 YouTube動画>1本 ->画像>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
285デフォルトの名無しさん
2025/02/21(金) 06:52:59.68ID:p6I2RufL
edition = "2024" が来たね
286デフォルトの名無しさん
2025/02/25(火) 13:22:53.51ID:XvTpfGzl
https://softantenna.com/blog/linus-rust-policy/

Linus が一喝して技術的に合理的説明のない
rust拒否は許さないことで決着か
287デフォルトの名無しさん
2025/02/25(火) 13:50:37.48ID:z5mNSc8+
生メモリいじくるのが好きな人たちがいきなりrustやれって言われたらきつい気持ちはわかる
どうせメンテーなんてみんなジジイなんだし
288デフォルトの名無しさん
2025/02/25(火) 15:08:04.83ID:Uj70bClX
rustが嫌でもやれなんて言ってないが
289デフォルトの名無しさん
2025/02/25(火) 16:25:22.46ID:ixFc3NBv
Linusの今回の発言は明瞭で
・Cだけ触りたい人はそのままRustを覚えなくてOK
・その代わりRustについて口を挟む権利はない
・CのAPIをその利用者は自由に使えてメンテナといえども用途用法に口を挟む権利はない

したがって今回もめていた「CのAPIの上にRustのAPIを設ける件」について
Cだけ触りたいメンテナは口を挟む権利はなくパッチを拒否する権利もない、ということ
大方の人々が考えていた通りに決着
290デフォルトの名無しさん
2025/02/25(火) 17:47:40.26ID:z5mNSc8+
口を出せない=メンテナ失格ということと受け取った
291デフォルトの名無しさん
2025/02/25(火) 18:17:51.25ID:AwfAD5GP
かつてカーネルを正しく修正した結果として (保証してない挙動に依存した) 間違ったアプリケーションのいくつかがまともに動かなくなったことがある。
そのときに Linux の理念としては技術的合理性でユーザー体験を損なってはならないということで間違っているアプリケーションに合わせて互換性が維持された。
ユーザは一方的な利用者に過ぎずカーネルに口出ししないなんてことはない。
絶対に、絶対に、絶対に、カーネルに口出しするよ。
まあそれが良いか悪いかは知らんけどな。
292デフォルトの名無しさん
2025/02/25(火) 18:41:48.14ID:XvTpfGzl
>>291
そういう具体性を欠いた屁理屈言って拒否するのは
やめろと怒られてるのだね
293デフォルトの名無しさん
2025/02/26(水) 04:07:17.14ID:m7ecN2qb
>>290
そういうデマを言うやつがいるとコミュニティー全体が嫌われるから止めるべき。

Linusが言っているのはせいぜい「Rustコードのメンテナじゃないだろ」ぐらいの話で、Linuxメンテナ失格とは全く言っていない。むしろメンテナが自分のメンテナンス範囲をCコードだけにするのを肯定している。
今回の件も、C APIユーザーとしてのRustコードがCコードとは独立した形で別のメンテナにメンテナンスされるんじゃないんかね。
294デフォルトの名無しさん
2025/02/26(水) 19:09:22.06ID:ixFc3NBv
着実にRust APIを増やしていこう
脱libc
295デフォルトの名無しさん
2025/02/27(木) 14:26:32.38ID:VQNvJTxh
Rustは清書用
296デフォルトの名無しさん
2025/02/27(木) 21:14:53.56ID:z3E1gBHI
じゃあRoughって言語も要るな
297デフォルトの名無しさん
2025/02/27(木) 23:34:31.56ID:8PL54Hpa
Rustはリファクタリングでの安定度も他より極めて高くて開発効率が良いので
まずは雑に書いて後から可読性を上げたり拡張性を上げたり実行効率性を上げたり普通に行われているね
298デフォルトの名無しさん
2025/02/28(金) 08:15:36.47ID:rekq6zs6
>>296
クレート境界をダックタイピング化した言語が欲しいわ。
299デフォルトの名無しさん
2025/02/28(金) 12:17:20.44ID:ydxSDGT7
>>291
その動作は弊社製品の仕様です
(今後も動作は維持されます)

その動作は弊社製品の問題点です
(今後動作は変更されます)
300デフォルトの名無しさん
2025/02/28(金) 12:19:57.96ID:3/BLzMLJ
>>298
それがC++かもしれませんね
301デフォルトの名無しさん
2025/02/28(金) 22:27:33.84ID:wOIfhSFi
>>298
ダックタイピングは各異なる型を統一的に安全に呼び出せる保証が人任せだから使うべきでない
トレイト境界を指定すれば安全が保証されるがそれはトレイトすなわち他言語で言うところのインターフェースに近い存在を仮定していてダックタイピングとは言い難い
302デフォルトの名無しさん
2025/02/28(金) 22:51:15.56ID:OmeBN0rd
>>301
>298のダックタイピングは静的ダックタイピングで構造的部分型のことね。
型の機能的な共通部分を部分型として統一的に扱うから、普通の型と同程度には安全かと。
303デフォルトの名無しさん
2025/02/28(金) 23:05:54.93ID:aDguz5rE
>>298
Go だと型があるインターフェイスを満たす (満たすつもり) かどうかは明示的な宣言がない。
インターフェイスで定義されたのと同じメソッドを持っていればそのインターフェイスを実装したものと見做される。
304デフォルトの名無しさん
2025/02/28(金) 23:49:44.86ID:wOIfhSFi
>>302
まずその共通部分が存在する保証がない
次に共通部分があったとしてもその部分への任意のアクセスメソッドが完全に同一である保証がない
さらにダックタイピングで用意されるメソッドがその共通部分のみにアクセスされる保証がない
共通部分型方式には問題が山積み

一方でトレイト境界を用いると
共通部分を持たなくても安全に共通メソッドを増やすことができる
305デフォルトの名無しさん
2025/03/01(土) 00:09:58.46ID:k1Z2LiOl
相変わらず日本語不自由だな
306デフォルトの名無しさん
2025/03/01(土) 08:37:01.16ID:IXdCHP3R
言語によるとしか言えない
その言語にある道具なら、それが便利なら使って問題ないと思う
C++だと標準ライブラリでもダックタイピングをごく普通に使うけど、それに文句を言う人もいないでしょ
307デフォルトの名無しさん
2025/03/01(土) 08:57:54.01ID:fWE8MQKS
C++のような古くてダサい言語は比較する意味ないだろ
ダサくて自己責任となるダッチタイピングはお似合いだが
308デフォルトの名無しさん
2025/03/01(土) 09:10:51.88ID:J1DdG5rG
Rust書きやすいって言ってるのは大体c++から移った人間でそういう人がここに集ってる
GC付きの言語から来たらそこまでは思わない
309デフォルトの名無しさん
2025/03/01(土) 09:47:12.55ID:+k5QM36w
>>304
静的ダックタイピングとか構造的部分型はご存知で?

コンパイル時にメソッドとかプロパティとかの部分集合で互換性を判定しているので、通常の型と同じレベルで合致するよ。
310デフォルトの名無しさん
2025/03/01(土) 11:24:22.93ID:dZ2eBKvG
>>304 に賛成
311デフォルトの名無しさん
2025/03/01(土) 11:25:33.81ID:dZ2eBKvG
>>306
便利さと安全性は独立してるからな
312デフォルトの名無しさん
2025/03/01(土) 11:39:32.69ID:LIMOz2LM
>>310
>>304を理解できるなんて君は天才だねw
313デフォルトの名無しさん
2025/03/01(土) 13:10:29.22ID:UmJa16uz
A:「〇〇な言語があったらいいのに」
B:「言語によるとしか言えない」
A:「・・・」
314デフォルトの名無しさん
2025/03/01(土) 18:25:43.33ID:iHXAtSJa
Structural Typingでバイナリ境界を超えて新しいメソッドを追加できるようにしてしまうと衝突時のデメリットがメリットを上回る
Rustにcoherenceがあるのと同じ
315デフォルトの名無しさん
2025/03/01(土) 22:44:41.75ID:qVuk4Ae3
>>308
GCの有無は関係ない
異なる型に対するコードの共通化つまりジェネリクスの話

例えばクラスを使えば同じ基底を継承する派生同士は異なる型でも共通のメソッドやプロパティを使える
しかし同じクラス継承の関係しか扱えないのは制約がキツく各機能毎に継承で多重クラス継承など問題が多い

一方でダッチタイピングや構造的サブタイピングは無関係な型同士でも同じメソッドやプロパティがあるだけで暗黙に使える
しかし互換性がなく偶然同じメソッドやプロパティを持つ同士の利用をエラーにできない問題や暗黙であるため複雑化してくると分かりにくくなるなど問題が多い

そこで機能毎にインターフェース宣言と各型でのインターフェース利用宣言することで諸問題を解決し安全で保守しやすいコードにすることができる
そしてインターフェース名(機能名)が付くことで複数の機能の列挙や関係も宣言できるようになる
Rustではトレイトと称する
316デフォルトの名無しさん
2025/03/01(土) 22:55:40.18ID:J1DdG5rG
llmの3B当たりが吐き出す文章みたいで何を言ってるのか意味不明だな
317デフォルトの名無しさん
2025/03/02(日) 00:27:51.62ID:yD3mmOcG
丸一日調べてこれとか泣けてくるな
ついでにRustのトレイト問題も調べとけよ
318デフォルトの名無しさん
2025/03/02(日) 08:35:08.13ID:Na6YXFfW
>>313
最初の一文は違うだろ
A. 「(Rustにない、他の言語では使われてる機能) は問題だらけ」
っていう主張に対して反論されてるだけ
319デフォルトの名無しさん
2025/03/02(日) 15:32:34.86ID:gL5X58/w
>>312
少なくとも君は馬鹿だよ
320デフォルトの名無しさん
2025/03/02(日) 17:14:53.44ID:ZyJLqNmz
わからんけどtypescriptやれば
321デフォルトの名無しさん
2025/03/02(日) 18:00:38.37ID:4Ag5PO4h
ま人生一度は型厨になるのは仕方ない
322デフォルトの名無しさん
2025/03/02(日) 18:29:41.49ID:JmtuUveA
ダックタイピングは動的か静的かに関わらずデメリットが多すぎて使うべきではないよ
唯一のメリットはinterface宣言が不要だけどこれが害悪を招いちゃう
interface名がないから可読性が悪く保守性も低いのはもちろん利用方法に制限も
323デフォルトの名無しさん
2025/03/02(日) 19:02:58.00ID:Q0x8LaN0
静的なダックタイピングにはinterface宣言もinterface名もあるやろ
324デフォルトの名無しさん
2025/03/02(日) 19:17:03.00ID:JmtuUveA
>>323
名前をつけて宣言したらそれはinterfaceそのものだよ
名前も宣言もなしで共通のメソッド名など構造が同じなら動作することがダックタイピングだよ
325デフォルトの名無しさん
2025/03/02(日) 21:10:41.61ID:JAzjPHpU
ubyの罪は重い
326デフォルトの名無しさん
2025/03/02(日) 21:55:50.48ID:4ZT2iFI9
Rustってまだオワコンになってなかったんだな
327デフォルトの名無しさん
2025/03/02(日) 22:12:16.30ID:vq+w9eu/
構造に頼るよりも、ジェネリック関数でトレイト境界で制約かけた方がRustっぽい気がする。
なんとなく。
328デフォルトの名無しさん
2025/03/02(日) 22:50:29.46ID:RayeYp/T
>>324
上に出てきてるように構造的部分型(Strructural Subtyping)を含めた話
まあ俺もStrructural Subtypingを静的ダックタイピングと呼ぶのは
誤解を招きやすいからあまり賛同しないがそこは問題じゃないでしょ
329デフォルトの名無しさん
2025/03/02(日) 23:00:19.17ID:RayeYp/T
>>327
ジェネリックの型パラメータをトレイトで制約するということと
その制約を満たしてるかどうかを型の構造に頼ってチェックするのは両立する話
330デフォルトの名無しさん
2025/03/02(日) 23:17:39.99ID:g7i6E9Hi
共通する構造&機能がある時に
・interface名(Rustではtrait名)を付けて宣言するか
・名付けずにダックタイピングするか
の違いが最も大きい
後者は様々な点で劣る

両者の中間的な位置付けにいるのがGo
Goでは各型に対するinterface実装宣言を省略できてしまうため
省略すると可読性や保守性で劣ることになる
331デフォルトの名無しさん
2025/03/02(日) 23:37:21.79ID:WP5yHTvc
その「保守性が劣る」というGoは世間的には保守しやすい言語と言われてるんだが
型で守るという意味ではなく、多くの人に分かりやすい簡易な構文だからという理由でだけど
332デフォルトの名無しさん
2025/03/02(日) 23:44:33.72ID:g7i6E9Hi
各型に対するinterface実装宣言を省略すると可読性や保守性で劣る
その事実以外の話には言及していない
333デフォルトの名無しさん
2025/03/02(日) 23:54:11.22ID:Na6YXFfW
その可読性や保守性の劣化というのは現実にどの程度問題と言われてるの?
「自分は嫌い」というお気持ちじゃなくて?
あるいは「Rustが採用してないから正しい」とか?
334デフォルトの名無しさん
2025/03/02(日) 23:57:06.79ID:JmtuUveA
一般的に必要な情報は暗黙ではなく明記されている方が保守性も高いんだよ
そして多くの人に分かりやすい
省略できるようにしたことはGoの仕様の失策だね
335デフォルトの名無しさん
2025/03/03(月) 00:08:35.40ID:BZGxSOwK
Goの場合は「省略できる」というよりも「書かない」というのが正しい
選択できるものではなく、常に書かないものだから

正直自分も好きではないし、だいぶクセのある言語だけど、世間的には受け入れられてる
世の中の人は案外そこまで型にこだわりはなくて、それよりも分かりやすさの方が好まれたりする
それは単に「考えが違う」というだけで、劣るとか優れてるとかいうものではない
(それなら何でGoは人気なの?ってなるし)
336デフォルトの名無しさん
2025/03/03(月) 00:11:38.35ID:BZGxSOwK
あとRust開発者はC++から来た人が多いと思うけど、C++のテンプレートは思いきり静的ダックタイプでしょ
あれで実際「可読性ガー」ってなるより、便利だと思う場面もあるよね?
337デフォルトの名無しさん
2025/03/03(月) 00:12:13.08ID:3d6F6ZIn
>>334
明記されていたほうが分かりやすいというのは正しい。
その一方で、明記しなくても分かるような設計にしろ (分かり難くなるなら設計が誤っている) という哲学が Go の根底にある。
338デフォルトの名無しさん
2025/03/03(月) 00:19:18.53ID:lMbQDSSk
structural vs nominalならが安全性はnominalのほうが高いが
保守性や可読性はどちらか一方が常に優れてるわけではないな

Rustはよりメタルに近いOSやライブラリでの利用を重視してるから
安全性の面からより保守的な選択をしてる
coherenceとかもアプリケーション開発者観点だと不必要に厳しい
339デフォルトの名無しさん
2025/03/03(月) 00:25:34.97ID:xahbKnOP
Goでは省略しちゃうことが多くて、
ある型についてどんなinterface群を満たしているのか、を把握するために、
対象となりそうな全てのinterface群の各々のメソッド群と見比べて、
そのメソッド群すべてを実装していることを確認することで、
ようやくそのinterfaceを満たしていることを把握できる。
たった1行を省略できる利便性(?)のために、大きく可読性が落ちているのは否めない。
340デフォルトの名無しさん
2025/03/03(月) 01:43:43.47ID:lMbQDSSk
gopls implementationとかで確認すればいいよ
341デフォルトの名無しさん
2025/03/03(月) 03:55:57.34ID:US4xw5vs
今どき珍しい真面目なスレッドだな
342デフォルトの名無しさん
2025/03/03(月) 04:54:41.57ID:CkLabMrP
>>330
静的ダックタイピングは明示的インターフェイスでも成り立つよ。>336で言うならテンプレートとコンセプトみたいにテンプレート引数の要件を明示するやり方。

>330の言い方なら、
共通する構造&機能がある時に
・共通することを型としてあらかじめ宣言するか
・共通部分を使う時に判別するか
の違いですな。
後者は共通する構造&機能の決定を実際に使用する時まで遅らせることができるので、型の設計時点で決めなくてはならない前者よりも設計の自由度が増す。

Adapterパターンのサポートが充実していれば問題を緩和できるけど、Rustて充実してたっけ?
343デフォルトの名無しさん
2025/03/03(月) 06:07:05.65ID:YJglMSFw
Rustは各型で共通事項をあらかじめ宣言する必要がなく
共通する構造&機能の決定を実際に使用する時まで遅らせて
それらが決まってから後から実装すればよいため
設計の自由度が高いね
344デフォルトの名無しさん
2025/03/03(月) 07:42:47.63ID:FotMwNUg
>>343
あれ?どうやるんだっけ?
345デフォルトの名無しさん
2025/03/03(月) 10:32:52.62ID:CIgoBgkV
他人の書いたコードをインタフェースで抽象化したいときにGoのinterfaceは便利だけど
全て自分で管理する場合は明示的に宣伝した方がいいから選べるようにしてほしい

Javaの普通のinterfaceに加えてGoのinterface同時に使える言語が欲しい
346デフォルトの名無しさん
2025/03/03(月) 10:43:32.37ID:wkIAEgPa
>>341
少し考えれば理由はわかるはず
347デフォルトの名無しさん
2025/03/03(月) 10:47:29.58ID:US4xw5vs
>>346
お?上から来たな
348デフォルトの名無しさん
2025/03/03(月) 19:22:07.10ID:niTL8qrF
>>345
interfaceに関して欲しい機能はRustのトレイト境界の機能だろ
Javaには類似の境界型パラメータがあるが単相化しないため役に立たない
349デフォルトの名無しさん
2025/03/03(月) 19:49:07.58ID:SsAcHPN0
>>343
Rustで共通事項をあらかじめ宣言しないで、共通する構造&機能を統一的に使うのってどうすればいいの?

Rustの型システムを考えると、(既存のコードを変更することなく) 共通する構造&機能を新たに宣言して統一的に扱える、ということだよね?
350デフォルトの名無しさん
2025/03/03(月) 19:56:00.40ID:niTL8qrF
リファクタリングをするのに既存のコードを変えないとか矛盾していて意味がわからん
後から共通メソッドをトレイト化すればいいだけだろ
それで困る人はいない
351デフォルトの名無しさん
2025/03/03(月) 21:42:58.25ID:CkLabMrP
>>350
例えば標準ライブラリの型との共通部分を統一的に扱いたい場合、標準コードをリファクタリングして新しい共通Traitを切り出すのかしらん?
352デフォルトの名無しさん
2025/03/03(月) 22:28:07.80ID:T1gSmlwj
Rustでコーディングしたことないお客さんが来てるのか?
標準ライブラリのコード自体を書き換えなんてせずとも普通に行われていることだぞ
353デフォルトの名無しさん
2025/03/03(月) 22:56:04.92ID:trSew6xi
>>349
>>343が言ってるのはstructの定義時にそのstructがどのtraitを実装するかを(あらかじめ)宣言する必要はなく後から必要になった時にtraitの宣言及び実装をすればいいというだけの話

わざとずらしたことを書いてるから噛み合ってないんだよね
354デフォルトの名無しさん
2025/03/03(月) 23:07:24.80ID:trSew6xi
既に存在する共通する構造&機能をポリモーフィックに扱いたい時にGoなら必要なのはインターフェース宣言だけ
既存のインターフェースに合致するものなら新しく宣言する必要もなくそのまま扱える

一方Rustの場合は新しいインターフェースを宣言して既存の構造体に対する新しいインターフェース用の実装をそれぞれ追加で書かない限りは使えない
それで済めばまだいい方で既存のインターフェースに適合させなければいけない場合は既存の構造体をラップする新しい構造体とその実装を逐一全部書いた上にインターフェースに対する実装も別途追加で書かないダメ

特に後者の手間は雪だるま式に膨れ上がるからライブラリのように他人に使わせるコードを書く場合は型の設計時点というより外部APIの設計時点で何を共通の構造&機能として使えるようにするか決めておく必要がある
355デフォルトの名無しさん
2025/03/03(月) 23:24:45.25ID:uMOb2Eig
> 既存のインターフェースに合致するものなら新しく宣言する必要もなくそのまま扱える

無茶苦茶だな
そんな意図しない全ての型に自動適用される危険な言語は使いたくないわ

Rustは明示的にimplしたものだけに適用されるから安全で使い勝手が良い
356デフォルトの名無しさん
2025/03/03(月) 23:29:41.09ID:uMOb2Eig
> 一方Rustの場合は新しいインターフェースを宣言して既存の構造体に対する新しいインターフェース用の実装をそれぞれ追加で書かない限りは使えない

そんなことはない
既にimpl Tにあるのだからimpl Trait for Tへ移動させるだけだぞ

> それで済めばまだいい方で既存のインターフェースに適合させなければいけない場合は既存の構造体をラップする新しい構造体とその実装を逐一全部書いた上にインターフェースに対する実装も別途追加で書かないダメ

そんなことはない
既存の構造体にそのままtraitメソッドを増やせる
357デフォルトの名無しさん
2025/03/03(月) 23:46:24.87ID:T1gSmlwj
Rustでコーディングしたことないお客さんがこのRustスレでRust叩きとは完全に荒らしだ
358デフォルトの名無しさん
2025/03/03(月) 23:56:56.53ID:BZGxSOwK
外部クレートで定義されたトレイトを別の外部クレートの型に対して実装するときはラップが必要じゃない?
要素1つのタプル構造体 (いわゆる new type) で済むような話だけど
インターフェースといってるあたり微妙にズレてる感はあるけど、「ラップする必要がある」という点自体は間違ってない
359デフォルトの名無しさん
2025/03/04(火) 00:10:16.92ID:PYBK8h/l
>>358
そんな話は誰もしていないよ
今話されているのはこれ

>既に存在する共通する構造&機能を
>新しいインターフェース宣言

複数の型に共通事項が出てきたから
新たなトレイトを作って宣言する話が行われてる
ラップは不要
360デフォルトの名無しさん
2025/03/04(火) 00:26:54.32ID:ZIAXnU+S
自分の管轄外の型に対して、自分の管轄外のトレイトを実装することだけは、安全のため禁止されているので、自分の型にするためのラップが必要
そんな特殊な例外的ケースを除けばラップはもちろん不要
361デフォルトの名無しさん
2025/03/04(火) 01:25:48.23ID:JpOggS8o
最初からクレート境界を前提とした文脈だろ >>298
文脈読めよ
362デフォルトの名無しさん
2025/03/04(火) 01:53:29.12ID:s9xD5Zkr
インターフェイス vs. ダックタイピング

ダックタイピングはインターフェイス名がないため可読性が著しく低い
インターフェイス名を使った制約も指定できない
必ずインターフェイス機能を使うべし
363デフォルトの名無しさん
2025/03/04(火) 02:35:55.33ID:VOLcqrY4
>>362
こういう簡潔なまとめ助かる
364デフォルトの名無しさん
2025/03/04(火) 06:51:13.78ID:r27xQ0ge
ダックタイピングは、意味が異なっていても、見かけの構造さえ同じなら、同一視してしまう問題もある
つまりうっかり間違えて用いても、エラーを検出できないため、安全性で劣る。

その見かけの構造さえも、複数の構造を含む場合など、
この型はどのダックタイピングで用いられているのか、読み手が認識するのに時間がかかってしまう。

これらの問題は、各型において、どのダックタイピングに用いられているのかの宣言がないことに起因している。
一方で、interfaceは「各型でどのinterfaceを用いているのか」の宣言があるため、どちらの問題も生じない。
365デフォルトの名無しさん
2025/03/04(火) 09:45:00.92ID:murVybZ/
>>327 奇遇ですね私もです
366デフォルトの名無しさん
2025/03/04(火) 09:47:17.60ID:murVybZ/
>>333
実行前(コンパイル時など)に問題が表面化することと
実行後に問題が表面化することの違いは果てしなく大きい
367デフォルトの名無しさん
2025/03/04(火) 09:50:16.00ID:murVybZ/
>>339
ほんそれ
368デフォルトの名無しさん
2025/03/04(火) 09:52:06.99ID:murVybZ/
>>342
だからRustは清書用って言われるんだよ
369デフォルトの名無しさん
2025/03/04(火) 09:55:52.32ID:murVybZ/
>>351-352
type alias でほぼ何でもありな状態に出来るけど
他人のcrateとさらに他人のcrateを混ぜてると詰む
370デフォルトの名無しさん
2025/03/04(火) 09:57:24.96ID:murVybZ/
>>353
君こそコーディングしたことないだろ
371デフォルトの名無しさん
2025/03/04(火) 10:00:12.78ID:murVybZ/
ああ 353 は引用なのか?
354 と 353 が同一人物ならきもいが
354 の言ってることが実情
372デフォルトの名無しさん
2025/03/04(火) 10:02:37.01ID:murVybZ/
>>356
↑こういうのが混乱を招くからやめれ
373デフォルトの名無しさん
2025/03/04(火) 10:09:07.10ID:murVybZ/
>>359-360
struct に限ってはそうだね
374デフォルトの名無しさん
2025/03/04(火) 11:30:33.83ID:CoDTmeUS
>>342
Rustでは最初から共通部分があることを意識する必要がなく
そのような場合でも設計の自由度が高い
共通部分が生じたことに後から気付いた時点でそのためのトレイトを後から宣言すればよい
375デフォルトの名無しさん
2025/03/04(火) 11:34:47.54ID:CoDTmeUS
>>354
Rustならばラップは必要なく、トレイト宣言をしてトレイト側へメソッドを移動するだけで簡単に済む
impl Foo {
 fn method(&self, ...
}
impl Bar {
 fn method(&self, ...
}
と複数の型に共通メソッドがあり、それをトレイトで共通に扱えるようにしたければ

// トレイト宣言
trait TraitName {
 fn method(&self, ...
}
// トレイト実装
impl TraitName for Foo {
 fn method(&self, ...
}
impl TraitName for Bar {
 fn method(&self, ...
}
つまり「impl Foo」から
「impl TraitName for Foo」へ移すだけで済む
今回の例なら差分タイプ量は「TraitName for」のみ
376デフォルトの名無しさん
2025/03/04(火) 12:03:00.52ID:murVybZ/
struct のときだけね
377デフォルトの名無しさん
2025/03/04(火) 12:04:58.27ID:CoDTmeUS
>>376
enumでも他でも同じ
378デフォルトの名無しさん
2025/03/04(火) 12:18:25.90ID:murVybZ/
フーン(ニヤニヤ)
379デフォルトの名無しさん
2025/03/04(火) 12:40:56.52ID:uaFJKO3n
伸びてると思ったら複オジの類友が増えただけだったorz
380デフォルトの名無しさん
2025/03/04(火) 12:45:41.91ID:DDDjLfi5
>>376
structに限らず全ての型に対してトレイト実装によりメソッドを増やせるよ
381デフォルトの名無しさん
2025/03/04(火) 12:58:42.56ID:WqCDnV/I
&str(実質&[u8]でもVec<u8>でも)の末尾に
ゴミで良いから毎回必ず'\0'付ける仕様にしといて欲しかった
382デフォルトの名無しさん
2025/03/04(火) 13:19:59.57ID:813wXAHn
>>381
'\0'に限らず任意の値を終端として型を定義できるZigの勝利だね
383デフォルトの名無しさん
2025/03/04(火) 13:44:40.50ID:QtwoMD6j
やっぱ崩れたかw
346みたいな偉そうな奴がいるとなw
384デフォルトの名無しさん
2025/03/04(火) 13:53:15.88ID:aSLD1MTT
死んだスレが生き返ることなどない
385デフォルトの名無しさん
2025/03/04(火) 15:55:00.59ID:UUqFoJ1U
>>381
必要な時だけ付けりゃいいじゃん
不要なものを常時付けとけとか頭おかしい
386デフォルトの名無しさん
2025/03/04(火) 16:14:05.76ID:Xo2DP/vf
異なる方式を混ぜ合わせると両方を協調するのにミスが入りやすい。
ゼロ終端方式とファットポインタ方式に常に矛盾が生じないように維持するくらいなら必要なときに変換するほうがマシ。
387デフォルトの名無しさん
2025/03/04(火) 16:16:40.93ID:HZGad4Nn
>>375
>つまり「impl Foo」から
>「impl TraitName for Foo」へ移すだけで済む
>今回の例なら差分タイプ量は「TraitName for」のみ
フィボナッチみたいなトイコードしか書いたことがないと
こんな意味のない破壊的な変更を無自覚に書いてしまうんだな
388デフォルトの名無しさん
2025/03/04(火) 16:28:38.12ID:c62Mny0R
>>381
"abc"の部分文字列"ab"を参照する時に元の文字列が"ab\0"になるけどいい?
389デフォルトの名無しさん
2025/03/04(火) 17:42:39.60ID:uxSCDJ2e
>>381
&strはStringや(別の)strの任意の部分文字列を参照する型
もし末尾に'\0'を付加すると次の文字を'\0'で上書きするため原理的に不可能
Rustで'\0'終端文字列はCStr/CStringを使う
リテラルならc"ABCDE"

ちなみにC/C++で部分文字列を扱うと
同じ問題が起きるため別領域へコピーして末尾'\0'を付加する
さらに途中に'\0'を置くと千切れる問題や
長さを知るために'\0'まで要走査の問題があるので
Rustのstr/Stringでは'\0'終端文字列としていない
390デフォルトの名無しさん
2025/03/04(火) 17:44:45.66ID:uxSCDJ2e
>>387
新たなトレイトを作ってメソッドを移しても破壊的な変更にならない
もちろん移すだけでは意味はないが
使う側でそのトレイト境界を用いてコードの共通化が可能となるため普通に行なわれる
391デフォルトの名無しさん
2025/03/04(火) 18:39:12.83ID:gw3gBjaL
>>389
いつの時代のC++だよw
392デフォルトの名無しさん
2025/03/04(火) 23:48:22.54ID:qtalPCL7
>>391
昔も今もC + +のs t r i n g関数s u b s t r (開始位置, サイズ)は別の領域を確保してコピーだよ
\0終端するためにコピーは避けられないね

ちなみにライブラリ実装依存だろうけど
毎回ヒープ領域確保はコストが大きすぎるため
結果が15文字までならば静的に各16バイトの領域を事前に持っていてそこを使って頑張っていたりはする
でもそこへのコピーは避けられないね
393デフォルトの名無しさん
2025/03/05(水) 00:13:26.12ID:cALyDE8e
>>390
うわぇー
なんでそんな嘘を吐くの?
もしかして破壊的変更の意味を知らない?
394デフォルトの名無しさん
2025/03/05(水) 00:15:45.55ID:+YosNdhq
>>391
C++ の中だけでやるなら今は range を中心にライブラリが編成されてるから文字列の一部を取り出すのにコピーは必要ないしゼロ終端も不要だが、ここでは (古いライブラリなり API なりの都合で) ゼロ終端が必要になったときはという前提の話をしてるんだぞ。
外の世界は言語の都合に合わせて勝手に変わってくれたりはしない。
モダンな C++ を使っていても外と繋がる境界では外の都合に合わせなきゃしょうがないんだ。
395デフォルトの名無しさん
2025/03/05(水) 01:23:27.50ID:zAVGaXEW
>>394
Rustの中だけでやるなら文字列の一部を取り出すのにコピーは必要ないしゼロ終端も不要だが、ここでは (古いライブラリなり API なりの都合で) ゼロ終端が必要になったときはという前提の話をしてるんだぞ。
外の世界は言語の都合に合わせて勝手に変わってくれたりはしない。
モダンなRustを使っていても外と繋がる境界では外の都合に合わせなきゃしょうがないんだ。

君の言う前提に沿えば>>389の比較は無意味
396デフォルトの名無しさん
2025/03/05(水) 01:31:23.03ID:+YosNdhq
>>395
「いつの時代の C++ だよ」に対していつの時代でもそうだよと言ってるだけ。
>>389 には興味ない。
397デフォルトの名無しさん
2025/03/05(水) 01:45:32.35ID:+YosNdhq
>>395
あらためて >>389 を見たら「ゼロ終端にするにはコピーが必要なのは同じだ (型の整理の仕方は違っても)」というのが趣旨だから結論が同じなのは意図どおりだろ。
398デフォルトの名無しさん
2025/03/05(水) 03:17:39.16ID:nw/EeQ+y
>>389
CString::new(string)で0終端してくれて
c"ABCDE"は最初から0終端されてて便利だね

// 固定文字列は c"..." リテラルで作成
let c1 = c"ABCDE"; // &CStr型
// 文字列を組み立てる場合はStringで作成しておいて
let s = ('A'..='E').collect::<String>();
// そのStringを消費して0終端してくれる (途中に0があるとError)
let c2 = CString::new(s).unwrap();
// 左右どちらも &CStr型の c"ABCDE" で一致
assert_eq!(c1, &*c2);
399デフォルトの名無しさん
2025/03/05(水) 10:19:35.16ID:wPTO1w2Q
このスレいつからワッチョイとかIDとか無くなった?
400デフォルトの名無しさん
2025/03/05(水) 11:21:05.48ID:yWF1u2Fm
隔離スレにそんなもん必要ねえよ
401デフォルトの名無しさん
2025/03/05(水) 12:18:55.35ID:8D9MhhW+
ワッチョイとかIDがあると自演するのに不便だからいらない
402デフォルトの名無しさん
2025/03/05(水) 12:31:30.46ID:wPTO1w2Q
本スレどこ?
403デフォルトの名無しさん
2025/03/05(水) 12:35:55.74ID:yWF1u2Fm
まともに他人の意見を尊重できる人たちが集まり議論が行われればそこが本スレになるだろうが、期待するだけ無駄じゃろ
404デフォルトの名無しさん
2025/03/05(水) 22:19:07.11ID:GGwXatao
>>398
自分で'\0'プッシュすればええやんと以前は思っていたけど
ミスがないことを型システムに保証してもらえる安心感
405デフォルトの名無しさん
2025/03/05(水) 23:13:15.92ID:tlB2HjRS
>>402
DかZにおいで
406デフォルトの名無しさん
2025/03/06(木) 07:37:15.29ID:B42CPAD4
自分でNULL終端しようとする老害は
安全を保証する型システムと相性悪い
407デフォルトの名無しさん
2025/03/06(木) 15:59:09.42ID:WqcKZUUD
[c_char]が[u8]だと思ってたら[i8]だったでごじゃる
408デフォルトの名無しさん
2025/03/06(木) 17:21:49.66ID:hP34p9/Z
c_charは処理系依存っぽいからu8かi8に決め打ちするならc_ucharかc_scharにキャストした方がいい
ターゲット変更した時にコンパイラに文句言われる可能性がある
409デフォルトの名無しさん
2025/03/06(木) 18:39:39.08ID:c+X1ur2G
\0終端じゃないと困るってcやc++から来た人だろ…
老害っているんだな
410デフォルトの名無しさん
2025/03/06(木) 19:04:31.26ID:lbAGNheW
>>409
OS の要求ならしょうがないだろ……
適当なラッパー作るにしてもそのラッパーの中ではゼロ終端にしないわけにはいかん。
411デフォルトの名無しさん
2025/03/06(木) 23:08:05.29ID:/xPeDHQy
>>398
あとはCString/CStrからの変換だな
&[u8]として扱えるのは当然として

// CStringを消費して Stringとして扱う (非UTF8だとError)
let c = CString::new([b'A', b'B', b'C', b'D', b'E']).unwrap();
assert_eq!(c.into_string().unwrap(), String::from("ABCDE"));

// &Cstrを &strとして扱う (非UTF8だとError)
assert_eq!(c"ABCDE".to_str().unwrap(), "ABCDE");

// &Cstrを Cow<str> にする
// UTF8なら &strとして扱い Cow::Borrowed(&str)型
let cow = c"ABCDE".to_string_lossy();
assert_eq!(cow, Cow::<str>::Borrowed("ABCDE"));
// 非UTF8部分があると U+FFFD置換Stringにして Cow::Owned(String)型
let cow = c"AB\xccDE".to_string_lossy();
assert_eq!(cow, Cow::<str>::Owned(String::from("AB\u{FFFD}DE")));

いずれも'\0'の存在は気にしなくていい
412デフォルトの名無しさん
2025/03/07(金) 23:55:18.15ID:nJW2jcZy
&selfで読み取り参照のまま、別の型の読み取り参照に読み替えるのはもちろん、
selfで消費してしまい、確保メモリをそのまま活用して、別の型に読み替えるのが効率ええんやな
413デフォルトの名無しさん
2025/03/08(土) 09:38:56.99ID:y8OZgzU7
>> http://2chb.net/r/tech/1708677472/784

Ruby (が採用している CSI 方式) での文字列オブジェクトはそれぞれどの文字コードであるかの情報を持っていて処理系は各文字コードの処理方法を知っている。
つまり文字列を扱うあらゆる箇所で様々な文字コードごとの処理をやってる。
それが先進的か?
文字コードが統一できない世界でも「なんとかする」方法だろ。

内部的には統一した文字コードで扱い、様々な文字コードを扱いたければ入出力の段階で変換するというのが Rust 的なスタイルを含む現代的なプログラムが目指すところで、そのために Unicode はあるゆる文字コードから「変換可能であること」を指向してる。
とはいえ、これが先進的と言えるわけでもなく総合的に考えて現代の事情に合うやり方ってだけだ。

様々な文字コードの変なところも含めて Unicode に取り込んでいるのは既存のテキストのデータを (情報を失うことなく) 移行できなきゃ Unicode に統一されていかないからで、同じ駄目なら統一されていないことによる駄目さより統一されてる駄目さのほうがかなりマシという価値観による。
いろんな駄目さに個別に対処するのではなくデカい駄目に皆で立ち向かう。

人間の言語が数千年・数万年の歴史的経緯の積み重ねなので文字も駄目だし文字コードも駄目。
根本的に駄目なものはどう扱ったって駄目。
綺麗なやり方で扱わないのは綺麗なやり方が存在しないから。。
414デフォルトの名無しさん
2025/03/08(土) 17:22:21.85ID:O70yvsau
AIで3行程度にまとめてから書き込んてくれる?
415デフォルトの名無しさん
2025/03/08(土) 22:27:54.11ID:EzMMiepo
ネットもファイルもUTF-8で統一しちゃうのが吉
外部のcharset=Shift_JISとか扱わないといけない分だけencoding_rs _io
416デフォルトの名無しさん
2025/03/10(月) 03:27:00.75ID:SacQDf18
>>356
>>375
>既にimpl Tにあるのだからimpl Trait for Tへ移動させるだけだぞ

pub 付いてると知名的なので doubt
417デフォルトの名無しさん
2025/03/10(月) 08:58:57.66ID:CNm9iAF0
crateとかdocsの事考えるとそんな単純な話じゃないんだよ
実践的なコード描いてない人か
418デフォルトの名無しさん
2025/03/10(月) 12:17:05.04ID:BVl3qR6K
歴史的にマクロ=悪の固定観念もってるプログラマも多い気がするから
macro_rules!()はtemplate!()に改名した方がいいかもしれんね
impl Traitとかマクロ使わないと面倒な場合が多い
419デフォルトの名無しさん
2025/03/11(火) 15:16:53.15ID:mrtJh8pq
Rustってfor_eachのclosureのなかでbreak出来ないのです
420デフォルトの名無しさん
2025/03/11(火) 16:23:47.17ID:GvJGmymX
>>418
名前は Scheme の syntax-rules から持ってきたんだと思う。
421デフォルトの名無しさん
2025/03/11(火) 16:37:58.97ID:FiOBTiHo
>>419
map_whileやtake_whileか
try_for_eachやtry_foldを使えば?
ControlFlowを使って自分で作る方法もある
422デフォルトの名無しさん
2025/03/11(火) 19:10:27.26ID:iBVYkGzp
>>419
クロージャは(変数をキャプチャできる)関数の一種なのでbreakなんて概念はない
for_eachはクロージャを引数に取る高階関数なのでbreakなんて概念はない
次々とやってくる「全ての各エレメント」に対して何度もそのクロージャを呼び出すだけなのでクロージャで早期returnしようとしても全てのエレメントに対して処理される
やりたいことはおそらく次々とやってくるエレメントの途中で処理を終えたいのだろうからfor_eachではなく以下のイテレーターメソッドを使う
423デフォルトの名無しさん
2025/03/11(火) 19:12:23.50ID:iBVYkGzp
>>419
中断条件を分離できるならばイテレータを返してくれる(そして他のイテレータメソッドを繋げられる)以下を使うのがベター
take(n) 最初のn個だけ
while_some() OptionがSomeの間だけ
take_while(f) fが真の間だけ
 その後に続きを漏れなく使いたいときは
  take_while_ref_inclusive(f)
  take_while_ref(f)
  peeking_take_while(f)
map_while(f) 変換しながらfがSomeの間だけ
scan(init_state, f) 状態を持ちながら変換しながらfがSomeの間だけ

いきなり結果を(ResultやOptionやControlFlowで)返したいならば
try_for_each(f) fが中断(ErrorやNoneやBreak)になったら終えてそれを返す 中断なければ()を返す
try_fold(init_state, f) 状態を持ちながら同上 中断なければ状態を返す
try_collect() iterとitertoolsで仕様が異なりiter版はnightlyのみだけど 中断になるまでをcollect
424デフォルトの名無しさん
2025/03/11(火) 21:21:23.37ID:jytsrQer
要点をまとめる力って大事だな
425デフォルトの名無しさん
2025/03/12(水) 00:42:42.49ID:XRphkku6
クロージャが関数の一種なのか関数がクロージャの一種なのかそれが問題だ
426デフォルトの名無しさん
2025/03/12(水) 02:15:27.24ID:ck/kStOw
大雑把な説明としては、
クロージャは(キャプチャがある)関数の一種、
関数は(キャプチャのない)クロージャの一種、
と言っても構わないが、
実際には、
Fnで使えるのはsafeなfnのみ、
fnにコアースできるのはキャプチャのないFnのみ、
といった関係。
427デフォルトの名無しさん
2025/03/12(水) 12:58:04.29ID:7dQQHGES
クロージャと言えばFn(&mut T) -> ()みたいな定義が許容されてるのはなんでなの?
間違った使い方をすればownershipルールに違反してエラーにはなるだろうけどFnMut(&mut T)->()にするよう弾いたほうがよくない?
428デフォルトの名無しさん
2025/03/12(水) 13:35:41.11ID:aNDBBqWo
ここ観るのが早い
https://qiita.com/lo48576/items/34887794c146042aebf1
429デフォルトの名無しさん
2025/03/12(水) 16:12:44.05ID:FLZx408U
試しに見てみたがリファレンスと同じ情報の劣化版なので見る価値なし(個人の感想です)

>try_for_each(): Iterator<T> -> (T -> Try<B=()>) -> Try<B=()>
>失敗するかもしれない関数について for_each 的な操作を行う関数。
>これといって特記すべきこともないが、今まで for で書いていたものがシンプルにできる、ありがたい関数である。
>もし成功時にも何らかの意味ある値を返したいのであれば、 try_fold を使うべきである。

例えばtry_for_eachの最後の行の解説とか
ツッコミどころが盛り沢山
430デフォルトの名無しさん
2025/03/12(水) 18:16:35.74ID:ck/kStOw
>>427
クロージャの引数は、毎回変わるのだから常に何をしても自由であり、引数を消費してしまおうが、可変参照があって参照先を書き換えようが自由。
クロージャで制限がありうるのはキャプチャした値のみ。

Fnはキャプチャした値がある時に、それを読み取り参照しようが自由だが、書き換えたり消費したりはできないという意味。
FnMutはキャプチャした値を読み取り参照しようが書き換えようが自由だが、消費してはいけないという意味。
FnOnceはキャプチャした値を消費しようが書き換えようが参照しようが自由という意味。
キャプチャ値を消費をしてもしなくても自由ということは、2回以上の実行は不可で、そのクロージャの実行は1回だけという意味、だからFnOnceという名前。

トレイト間の関係は「Fn: FnMut」かつ「FnMut: FnOnce」、つまりFnOnceは他の最上位のスーパートレイト。
集合で見ると、FnOnce⊃FnMut⊃Fnとなり、Fnが最も制限がきつくて集合としては小さい。
蛇足だが、fnはさらに制限がきつくて読み取り参照キャプチャすら許容されないから、Fn⊃(safeなfnの集合)となって、safeなfnは任意のクロージャの位置で代わりに使える。

例えば、LazyLock::new(f: F)のような、1回しか指定クロージャが実行されない高階関数では、最も緩いFnOnceでトレイト境界「F: FnOnce」を指定できる。
逆に何度もクロージャが実行されるIterator::fold(init, f: F )では、初期値initは消費されるが、fがキャプチャした値が消費されては困るためFnOnceではダメで「F: FnMut」となり、fの引数二つは毎回消費できる。
431デフォルトの名無しさん
2025/03/12(水) 21:01:47.70ID:BjrFEung
>>428
一番重要な独自の分類方法を最初にまとめて書かないからクソ記事になる
432デフォルトの名無しさん
2025/03/12(水) 21:52:39.29ID:m5dRvsnl
>>430
>クロージャの引数は、毎回変わるのだから常に何をしても自由であり

なるほど。言われてみれば納得。
ありがとう
433デフォルトの名無しさん
2025/03/13(木) 02:14:17.95ID:RNV6T1tE
なんでtypescriptのソースをrustに移植できないの?
プログラムなんだから不可能ってことはないでしょ?
434デフォルトの名無しさん
2025/03/13(木) 04:38:06.94ID:RfjEKuUj
>>433
出来ることと効果的に出来ることは別というシンプルな話。
435デフォルトの名無しさん
2025/03/13(木) 07:14:12.10ID:93baVECr
TypeScriptのコンパイラはその利用の多さからもっと高速さを狙ってC/C++・Rust・ZigなどのGC非依存言語で書く価値がありブラウザ上Wasm実行の観点からもそうすべきだったが
担当者の能力不足のため遅いGC依存言語から速いGC依存言語へ書き換えるだけで終わってしまった
そのため早くもWasmでの実行が遅いという指摘が出ている
436デフォルトの名無しさん
2025/03/13(木) 07:27:03.63ID:gAHIvnwi
要するに、GC依存症の人にはrustは過ぎた物って事か。
437デフォルトの名無しさん
2025/03/13(木) 07:45:56.77ID:FfpB+bg4
アンダース・ヘルスバーグが能力不足なんて話があるかいな。
Rust や C# が得意なのにあえて Go を選定したんだぞ。
WASM 上で遅いのは WASM のほうの性能不足だ。
Go の優秀さはランタイムサポートの作り込みにあり、それが十全に発揮されない環境ではそりゃ遅い。
438デフォルトの名無しさん
2025/03/13(木) 07:53:47.23ID:TRbLLvdR
Rustで書けばwasmの件も問題なかったわけだからGoという中途半端な言語を選んだ選択ミスだな~
439デフォルトの名無しさん
2025/03/13(木) 08:52:01.37ID:FfpB+bg4
WASM ってそんなに絶対に考慮が必要なほど重要なプラットフォームか?
コンパイラを WASM 上で動かそうとする判断をするやつがいたらそのほうが選択ミスだろ。

TypeScript からの移植という前提があったから Go が比較的やりやすいと判断された。
関数単位でほとんど一対一のベタ移植を出来てる。
440デフォルトの名無しさん
2025/03/13(木) 09:41:53.87ID:9FAKkD2W
GC言語で書かれたプログラムをRustに移植しようとするとプログラムの構造を大幅に変えなきゃいけないからな

まあRustでのプロトタイピングも絶対やってるだろうけど
441デフォルトの名無しさん
2025/03/13(木) 09:56:55.03ID:yv4NvN1D
スパゲッティになってる下手なプログラムは、Rustで書く時にそれをほどいてまともなプログラムにしなきゃいけないもんね
それにより効率改善や機能拡張などの保守性も格段にアップするから、当たり前で必須な作業なんだけど、手間を惜しんだのかね
442デフォルトの名無しさん
2025/03/13(木) 10:18:55.01ID:9FAKkD2W
また的外れなことを
普段Rust書いてれば嫌でも分かることなんだけどなぁ
443デフォルトの名無しさん
2025/03/13(木) 10:39:22.49ID:FfpB+bg4
TypeScript で書いてあることの弊害としてランタイム (つまりは JavaScript 実行環境) がウェブ用に最適化されてることを挙げてる。
ウェブのプログラムではリクエストごとのターンアラウンドタイムが重要だが、コンパイラは時間あたりの計算量が重要で、違う戦略が要る。

コードの保守などはとりたてて問題になっていない。
もしより良く出来る余地があったとしても組織としてコストを支払うほどの価値じゃない。
444デフォルトの名無しさん
2025/03/13(木) 11:03:01.65ID:1bSTG+9t
Rustの話題だとダンマリなのに
どうでもいい他の言語の話だと連投するヤツいつもいるな
445デフォルトの名無しさん
2025/03/13(木) 12:14:30.28ID:C23vdZ7h
政治や流行に流されない決断ができる土壌があるのは良い組織
動画を見るとヘルスバーグの優秀さがひしひしと伝わってくる
windowsのPMとは大違い
446デフォルトの名無しさん
2025/03/13(木) 12:57:02.36ID:TBxE2TsU
一通りいろんな言語でプロトタイプコンパイラー作ってみたって動画内でも言ってたじゃねーか。で、Goが一番一対一で手堅く移植できる上に十分に速度アップもしたと言うことかと
パランスの問題だよ。時間をかけてリターンがどれだけあるか。だって営利企業だしプログラマーは無料じゃない。実際、方針決まってからはギットハブ・コパイロットに大部分やらせたんだろうがな
447デフォルトの名無しさん
2025/03/13(木) 14:32:17.25ID:XQNYuMCZ
なんでfirefoxのソースをrustにできないの?
プログラムなんだから不可能ってことはないでしょ?
448デフォルトの名無しさん
2025/03/13(木) 15:24:15.58ID:chX1MDYs
新たに作るものはRust一択になりつつあるが
既に別の言語で書かれているものはそれを負の遺産として考慮しなければいけなくなる
サンクコスト効果コンコルド効果に加え既存言語プログラマの抵抗勢力も足を引っ張る要因となる
449デフォルトの名無しさん
2025/03/13(木) 16:51:18.65ID:FfpB+bg4
>>448
> 新たに作るものはRust一択になりつつあるが

んなこたーない。
選択肢として普通のものになったが、あくまで選択肢のひとつだ。
450デフォルトの名無しさん
2025/03/13(木) 16:55:33.59ID:TBxE2TsU
日本語を型付きにして文法的に正しく無い書き込みは投稿ボタン押した時点で弾くようにならんかな。必ず日本語コンパイルエラー無しなのを確認してからしか誰も会話しちゃいけないなら世の中より良くなるはず。頭の中がスッキリする。
451デフォルトの名無しさん
2025/03/13(木) 17:09:05.03ID:P+4CnHos
型への幻想期は誰しもが通る
そのうち人間には無理なことを悟るまでがテンプレ
452デフォルトの名無しさん
2025/03/13(木) 17:23:47.86ID:jEo0CRn4
>>448
頭おかしい
453デフォルトの名無しさん
2025/03/13(木) 18:17:51.78ID:TqCxXK+v
状況に応じて適切な言語を選択するのが普通の技術者

特定の言語に入信して
なんでRustじゃないんだなんでC#じゃないんだと
感情的にコメントを書いてるやつが多くてすごく滑稽
454デフォルトの名無しさん
2025/03/13(木) 19:27:26.68ID:k0eZFisu
>>451
ちょろっと書く程度なら何でもいいけど
まともに開発するなら強い静的型付け言語が開発効率面から必須
455デフォルトの名無しさん
2025/03/13(木) 20:01:28.10ID:WjiwUoIR
「あると良いね」くらいじゃね
DropboxもPythonだったんだから、Dropboxくらいちゃんとしたサービスのレベルまで行っても必要条件であることはありえない
そしてそれよりデカいサービスの立ち上げは言語どうこうとかよりそもそもそのサービスが参入できる隙間を見つけて高速に参入することが重要。
456デフォルトの名無しさん
2025/03/13(木) 20:08:43.13ID:k0eZFisu
やりたければどんな言語でも手間暇かければできるのは当たり前
強い静的型付け言語で構築しないと開発保守効率が劣り時間と労力の無駄
457デフォルトの名無しさん
2025/03/13(木) 20:36:11.24ID:SWRT78Fy
効率の話か
それで言うと、ビジネス感覚のある人が好まない言語はそもそもビジネスが成功しないから開発するだけ無駄だな
458デフォルトの名無しさん
2025/03/13(木) 21:26:10.48ID:9FAKkD2W
時間をかけないためにスタートアップは動的言語を使ってるんだけどな

Facebook, Instagram, Youtube, Github, Twitterと例をあげればキリがない
459デフォルトの名無しさん
2025/03/13(木) 21:29:22.70ID:qpPbxTOG
ここまでIT時代になる前だけじゃね
460デフォルトの名無しさん
2025/03/13(木) 21:29:44.10ID:qpPbxTOG
スタートアップは静的型付言語しか勝たん
https://zenn.dev/ficilcom/articles/static-typing-for-startup
461デフォルトの名無しさん
2025/03/13(木) 22:02:56.19ID:uZxDbhjk
動的型付け言語を捨てて静的型付け言語に移行したとか
静的型付け拡張の開発を主導してるような…

あと最近はスタートアップでフルスタック
typescriptにしてるところは珍しくない
462デフォルトの名無しさん
2025/03/13(木) 22:24:27.62ID:FfpB+bg4
それぞれに適したものがあっても関連するプロジェクト全体で一貫した言語を使った方がスキルセットの管理が単純になるから運用が楽になることはある。
ウェブ系だと JavaScript か AltJS は避けられないのでそれに寄ってしまうのは仕方がない。
463デフォルトの名無しさん
2025/03/13(木) 22:26:07.36ID:yXHfiD0Z
自分の頭で考えられない人ほど
またスキルや経験の幅が狭い人ほど
特定の技術を宗教化して盲信しやすい

そうなるとますます自分の頭で考えられなくなり
どんな不都合な事実があろうと
教義に反さないよう都合よく解釈しようとする

優秀な技術者の対極
464デフォルトの名無しさん
2025/03/13(木) 23:02:12.20ID:9Gk42cK0
>>462
フロントサイドはTypeScript+WebAssemblyで良いけど
サーバーサイドまでTS/JSはリソースの無駄遣いなんだよね

もちろんまだ技術の発展途中なのでSSG/SSRをハイドレーションしてCSRするなら
その部分に限ってTS/JSでコード共通化は理解できるけどね
465デフォルトの名無しさん
2025/03/14(金) 08:00:59.55ID:UemB6eEp
>>460
最も普及しているC++を消している時点で論外。
466デフォルトの名無しさん
2025/03/14(金) 08:20:44.97ID:UemB6eEp
静的であろうと動的であろうと重要なのは(関数呼び出しなどの)コードの接続面・境界面の互換性であって、オブジェクト操作の互換性があれば良い。

動的型付けはこの互換性が実行時でないと判定されないのが問題であって、コード開発時(コンパイル)等に互換性を判定する仕組みがあれば問題無くなる。
コード解析は貧弱なので役に立たないが、静的インターフェイスのサポートなどで改善するだろう(今はそういうの無いけど)

静的型付けは互換性の判定のために型の命名を強制されるので、設計の柔軟性が無いなどの問題を持つ。こちらもC++コンセプトのよう静的インターフェイスで改善するので、今後は変数のコンセプト対応のようなインターフェイス改善で解決していくだろう。

RustのTrait境界もコンセプトのような柔軟性が欲しいところ。
467デフォルトの名無しさん
2025/03/14(金) 09:19:28.18ID:43evLOjO
>>458
スタートアップ時は動的型言語で造って
軌道に乗ったら静的型言語で造り治す例もあるが
468デフォルトの名無しさん
2025/03/14(金) 09:28:09.15ID:43evLOjO
>>462
https://qiita.com/YukiMiyatake/items/9904ed5b481e3f307bba
わろす
469デフォルトの名無しさん
2025/03/14(金) 10:32:08.08ID:7EyFuQVw
>>468
さすが書き手も読み手もQiita品質
テラワロス
470デフォルトの名無しさん
2025/03/14(金) 11:38:23.16ID:B7+exQLS
「トレイト境界」などという完全な誤訳をいつまで使い続けるのかね?
471デフォルトの名無しさん
2025/03/14(金) 12:33:09.87ID:YVXMDGNS
わざわざBoundsと言ってる意味を考えてみてはどうか
第一言語が英語の俺からすると境界で違和感ない
お前は日本語が怪しいだろと言われれば確かにその通りだが
472デフォルトの名無しさん
2025/03/14(金) 12:47:34.83ID:UemB6eEp
限界とか条件ならbounds じゃなくてlimitationだしな。

interface的な意味合いが強いのにinterfaceにしなかった理由はなんでかね?
473デフォルトの名無しさん
2025/03/14(金) 13:17:04.00ID:B4ilMY36
>>472
英単語としてはそうかもしれんが、他の言語の用語にある interface と似た部分はありつつもやっぱり違うし、そこらへんは違う語をあてたほうが自然だと思う。
474デフォルトの名無しさん
2025/03/14(金) 13:26:54.49ID:g9xx7i1P
通勤電車乗ってなくてうらやましい

> 目的地を意味する表現です。 例文. This train is bound for Tokyo station. この電車は東京駅 ...
475デフォルトの名無しさん
2025/03/14(金) 15:16:32.42ID:0UsQo6GT
>>474
それは「bound for」という熟語だし、さらに言えば
bound 境界
for 方向(対象までの間が主眼)
の組み合わせでそういう意味になるから、boundの例示で出すのは不適切かと。

inboundも外→内の境界付近のイメージが強いし、なんか良い例無いんかね。
476デフォルトの名無しさん
2025/03/14(金) 15:34:58.04ID:PY82133/
circleじゃなくてdiskの方に適用可能範囲があるから、境界を印象付けてもしょうがない
範囲や領域って言えばいい
477デフォルトの名無しさん
2025/03/14(金) 15:53:13.20ID:43evLOjO
>>472
Java語は要らんのだよ
478デフォルトの名無しさん
2025/03/14(金) 16:27:19.78ID:dr+oAB1W
清々しいまでにバカばっかだなwww
479デフォルトの名無しさん
2025/03/14(金) 16:29:54.73ID:dr+oAB1W
>>471
>わざわざBoundsと言ってる意味を考えてみてはどうか
そのセリフそっくりそのまま返すわ
本当に英語ネイティブなら日本語の「境界」の意味を知らんのだろうな
480デフォルトの名無しさん
2025/03/14(金) 16:37:10.71ID:dr+oAB1W
>>472
>限界とか条件ならbounds じゃなくてlimitationだしな
boundsをそのまま表現できる日本語の二字熟語は存在しないから完璧な訳語というのはない
完全な誤訳というのはあるけれども
481デフォルトの名無しさん
2025/03/14(金) 16:39:22.00ID:dr+oAB1W
>>475
おいおいww
bound forのboundとtrait boundsのboundはスペルが同じだけで意味も語源も違う単語だぞ
何が「bound 境界」と「for 方向(対象までの間が主眼)」の組み合わせてそういう意味になるだよ
不適切にもほどがあるかど。
482デフォルトの名無しさん
2025/03/14(金) 16:41:51.77ID:aBKsJZMd
束縛を誤用してる言語なんだから
483デフォルトの名無しさん
2025/03/14(金) 16:44:31.04ID:dr+oAB1W
inboundももちろんbound forのboundと同じでtrait boundsのboundとは関係ないからな
484デフォルトの名無しさん
2025/03/14(金) 16:50:31.18ID:dr+oAB1W
>>476
>circleじゃなくてdiskの方に適用可能範囲があるから、境界を印象付けてもしょうがない
これこれ
485デフォルトの名無しさん
2025/03/14(金) 18:07:08.47ID:llPebnyV
他動詞なんだからしゃーない日本語にはその概念が未導入だ
この例を見てくれよ

developers.google.com/maps/documentation/javascript/examples/control-bounds-restriction

ニュージーランドの国境座標で境界固定されてる
Restricting Map Bounds

const NEW_ZEALAND_BOUNDS = {
north: -34.36,
south: -47.35,
west: 166.28,
east: -175.81,
};

Rustじゃなくてタイプスクリプトだがboundって俺らプログラマーは普通にコーティングするとき使ってるから。意味もわからずニュアンスだけ知ってりゃコーティングミスしないよ
486デフォルトの名無しさん
2025/03/14(金) 19:03:43.60ID:lylWP6au
>>485
>他動詞なんだからしゃーない日本語にはその概念が未導入だ
よく意味がわからないんだがなんで他動詞だとしゃーないの?
未導入の概念というのはBoundsのこと?

ちなみにその例にあるBoundsは名詞
487デフォルトの名無しさん
2025/03/14(金) 22:14:58.94ID:jwX9vfGq
>>485
2D描画の文脈で使われるboundsは基本的に矩形領域のこと(3Dなら直方体の領域)
trait boundsと同じように何かを制限する範囲/領域という原義から付けられた名前だがもし「境界」と訳されてるとしたらの機械翻訳の質の問題だろう
488デフォルトの名無しさん
2025/03/14(金) 22:53:00.25ID:ujZbdgV7
>>470
オライリー「トレイト制約やで」
489デフォルトの名無しさん
2025/03/14(金) 23:00:22.63ID:XJxEKa47
要するに機械翻訳を誤訳と気づかず採用したんだろ
プロの翻訳家は誤訳に気づいて修正したが間違いを認めたくない勢力が境界で違和感ないと言い張ってるわけだ
490デフォルトの名無しさん
2025/03/14(金) 23:00:54.38ID:7+++WDHP
BoundsChecker って最近見かけなくなったな
491デフォルトの名無しさん
2025/03/14(金) 23:24:58.18ID:Jz6kOrmc
boundsは境界で正しい
他の候補はない

Type1: Trait2 Type1の取れうる型のうちTrait2がその境界となっている
Trait3: Trait4 Trait3の…(同様)
つまりトレイトにより境界を引いている

このように各々意味が異なる
境界 bounds
限界 limitation
制約 constraints

他の例
array-bounds checking 配列境界検査
Scalaのupper type bounds 上限境界
Scalaのlower type bounds 下限境界
492デフォルトの名無しさん
2025/03/14(金) 23:58:17.86ID:ArFvjw95
際立ちますね
この題材は踏み絵になる
493デフォルトの名無しさん
2025/03/15(土) 00:33:27.71ID:MW+uPLNw
boundというと結び付いてる・紐付いているといった意味合い
日本語で境界というと、外と内といった「堺目」という意味合いが強い
自分はトレイト境界という表現に慣れてしまったのでそこまで違和感はないけど、訳としては不適当だと思う

余談だけどPythonとRustのFFIに使われるPyO3というクレートがあって、そこでは Bound という型が出てくる
これはPythonのGILに紐付いている意味合いで、trait boundのboundと同じ意味合い
494デフォルトの名無しさん
2025/03/15(土) 00:51:34.13ID:kGvPW5zF
「訳がおかしい」と言ってるアホ達が代案を出さないことからも境界がぴったりな言葉
トレイトで境界を引いている
495デフォルトの名無しさん
2025/03/15(土) 00:56:44.33ID:zVPlAU0P
まずこのスレから「トレイト制約」で通しましょう

オライリー「トレイト制約やで」> >>494
>>492同志「際立ちますね」> >>494
496デフォルトの名無しさん
2025/03/15(土) 01:20:52.90ID:kGvPW5zF
boundsに制約なんて意味はない
trait boundsも、ある一定内の数値や、配列のインデックスなどのbounds checkingと同じく境界が定まる
497デフォルトの名無しさん
2025/03/15(土) 01:23:20.85ID:24RSx77o
訳語を探すそもそものアプローチというか考え方が間違ってるんだよな
498デフォルトの名無しさん
2025/03/15(土) 01:27:28.34ID:yH3qrd2j
お前らそんなに和訳やる気あんならtatsuya6502のケツひっぱたいてこいや
499デフォルトの名無しさん
2025/03/15(土) 01:40:23.59ID:kGvPW5zF
「制約」という違和感ありまくりの間違った単語を使っているアホどもは、
例えばあるクラスに対してその基底クラスやスーパークラスを「制約」だと捉えているのか?
500デフォルトの名無しさん
2025/03/15(土) 01:47:56.77ID:t2/vXXRn
意味的にはNapsterの水平線に近い
501デフォルトの名無しさん
2025/03/15(土) 01:58:38.26ID:CnlaKfFr
トレイト境界とかいう和製英語やめて特性規定(特性を持ってますよって規定な)とかにしようや。省略しないなら特性保持規定、特性保有規定
ジェネリック型がある特性を持つという規定があるから、その特性を実装するっていう文なら自然だし
502デフォルトの名無しさん
2025/03/15(土) 01:59:20.63ID:CnlaKfFr
しまった、ジェネリックなって書いてしもうたな
503デフォルトの名無しさん
2025/03/15(土) 01:59:55.45ID:8rRdOox4
>>489
プロポですねわかります
504デフォルトの名無しさん
2025/03/15(土) 02:11:53.31ID:kGvPW5zF
>>501
boundsに規定なんて意味はない
trait boundsはそのトレイトによって定まるトレイト境界だ
505デフォルトの名無しさん
2025/03/15(土) 02:27:02.81ID:aXarc3PA
集合論的な意味での境界だな
ベン図のイメージ

T: EqはEqを実装する型の領域
T: CopyはCopyを実装する型の領域
T: Eq + CopyはT: EqとT: Copyが重なった領域
506デフォルトの名無しさん
2025/03/15(土) 06:28:21.70ID:ub1zWmmn
>>495
「制約」という単語は真逆の意味だから使ってはいけない
制約ではなく境界を引くことで能力を与えて強力になっていく視点がトレイト境界

>>505
その通り
where句がない場合
<T> ←(Anyしか)何もできない子
<T: Eq> ←Eqを使える子
<T: Copy> ←Copyを使える子
<T: Eq + Copy> ←EqもCopyも使える子
つまりEq + CopyでEqの境界とCopyの境界の両方を満たす境界が引かれる
そしてどんどん使える機能が強化されていく
つまり「制約」とは真逆のイメージなので「制約」という表現は全く合わない
トレイト境界という表現が正しい
507デフォルトの名無しさん
2025/03/15(土) 09:13:26.13ID:M+mqoQUv
数学だと制約に相当するんでは?
三角形の内二等辺三角形があるのは条件を満たしているものだけ

プログラムも機能が充実するとイメージとは真逆で制約が強くなっていることになる
出来ることが増える=制約されてる
void*ポインターが無制限で型が付くと型の制限がある
508デフォルトの名無しさん
2025/03/15(土) 09:15:25.47ID:M+mqoQUv
これはずっと考えていたことで今急にひらめいたとかじゃない
509デフォルトの名無しさん
2025/03/15(土) 09:16:05.70ID:tr5ODwiQ
>>495
一般的に constraints の訳語として「制約」をあてるのでこの場合には好ましいとは言えない。
ただ Haskell で constraints と呼んでいるものと Rust で bounds と呼んでいるものに類似点があるかというとまあ結構あるとは思う。
510デフォルトの名無しさん
2025/03/15(土) 09:23:16.52ID:M+mqoQUv
二つの辺の長さが等しいと言う制約のと
○○という関数を持っていると言う制約
511デフォルトの名無しさん
2025/03/15(土) 09:24:31.14ID:qQFYiVQo
>>494
ブランチを切るで暴れてた人ですねわかります

>>501
そんな理由だったら単に「定格」でいいわ
512デフォルトの名無しさん
2025/03/15(土) 09:31:26.54ID:M+mqoQUv
カタカナでいいんじゃないかw
英語見た場合に納得できる
513デフォルトの名無しさん
2025/03/15(土) 09:43:00.89ID:
こういう時は何故かHaskell = 圏論勢が出てこない
514デフォルトの名無しさん
2025/03/15(土) 09:44:01.84ID:MW+uPLNw
>>506
英語版の Rust book だと「型やライフタイムの使われ方を制限する (to restrict) 」とあるよ

Trait and lifetime bounds provide a way for generic items to restrict which types and lifetimes are used as their parameters.

数学とかプログラミングと関係ない、普通の言葉としての bound は元は「紐で縛る」から来てる
制限、制約、境界といった意味はそこからの派生
515デフォルトの名無しさん
2025/03/15(土) 09:53:00.21ID:MW+uPLNw
そもそも >>506 だって制約だと思う
ジェネリクス関数の中で呼べるメソッドが増えることに注目してるようだけど、利用側から見ればその関数に渡せる型について制限が増えるでしょ
516デフォルトの名無しさん
2025/03/15(土) 10:02:10.90ID:ub1zWmmn
>>515
それはおかしい
トレイト境界の対象は型
最も制約の多いAny状態を出発点として
トレイト境界を増やせば増やすほど型が機能できる自由度が増えていく
517デフォルトの名無しさん
2025/03/15(土) 10:28:22.62ID:M+mqoQUv
>>516

三角形が二等辺三角形のみに限定されて自由度が増えてると思うか?

これが制約だと思えない人は数学的な素養がない
518デフォルトの名無しさん
2025/03/15(土) 10:35:19.38ID:qQFYiVQo
>>506
トレイト視界にすれば良かったんじゃね
519デフォルトの名無しさん
2025/03/15(土) 10:37:07.82ID:e4F+UdWA
トレイトバウンズでええやん
520デフォルトの名無しさん
2025/03/15(土) 10:38:12.12ID:M+mqoQUv
機能実装=制約
情報量が少ないのが自由度が大きくなりがち

確率だとしても明日の天気の状況が全くわからないとすると何の制約もなく平等に各状態がある
天気予報などから明日は降水確率70%などと情報を得ると確率がかわり偏る

情報学で言うエントロピーが増大した状況
ビットの0と1が等しい確率で出てくるような何ら情報の無い状況がエントロピーが少ない
521デフォルトの名無しさん
2025/03/15(土) 10:42:25.48ID:qQFYiVQo
>>516
void * はなんでも渡せるが逆は出来ない
trait もそうで増やせば増やすほど渡せるものが制約されていく
522デフォルトの名無しさん
2025/03/15(土) 10:43:38.21ID:qQFYiVQo
>>517
用語にいちいち反対している人は
AIに質問して還って来た答えを
ここにコピペしてるような臭いがする
523デフォルトの名無しさん
2025/03/15(土) 10:50:01.91ID:ub1zWmmn
>>521
それは真逆の視点だから真逆の結果となっている
型に対するトレイト境界なのだから型の視点で見るべき
トレイト境界がAnyしかない初期状態が最も制約されていて機能がほとんど使えない不自由な状態
そこからトレイト境界を増やせば増やすほど実行できる機能が増えて自由度が増していく
524デフォルトの名無しさん
2025/03/15(土) 10:51:10.99ID:M+mqoQUv
自由度なんて何も考えなくても理解出来るだろ…
思い込みを直す機会だぞ
なんなら大学に行って数学と情報学を学べばいい
525デフォルトの名無しさん
2025/03/15(土) 10:52:21.41ID:ub1zWmmn
>>522
「トレイト境界」という状況を最も的確に表していて正しい訳に対して
なぜ反対しているのか?
526デフォルトの名無しさん
2025/03/15(土) 10:54:27.10ID:ub1zWmmn
>>524
CSを学ぶべきは君だろ
「トレイト制約」派は本質を理解できていないから「制約」なんて間違った用語を用いてしまう
527デフォルトの名無しさん
2025/03/15(土) 11:00:14.62ID:M+mqoQUv
>>526
学生と言うクラスに対してそれが三角形なのかと言う問いはおかしく見えるが
学生であり三角形でもある可能性もある

トレイトが実装されていなくても同等の機能が実装されている可能性もある
一概にトレイトが実装されているから高機能であると言う論は当てはまらない

ある機能を使う場合に対象となるものがトレイトを実装されているものに限定されているだけ
これはただの制約でしかない
528デフォルトの名無しさん
2025/03/15(土) 11:03:33.75ID:M+mqoQUv
トレイト境界 トレイト制約 トレイト要求 トレイト条件 トレイト限定

whereでトレイトを限定しているので指定の自由度は低くなっている
529デフォルトの名無しさん
2025/03/15(土) 11:10:08.04ID:ub1zWmmn
>>527
プログラムを書いたことないのかな?
impl Display for T した時にそれはDisplay機能を追加したのであって制約したわけではない
fn foo<T: Display>() した時もそれはDisplay機能を追加したのであって制約したわけではない
もちろん逆の視点で見れば制約になるのは当たり前だが逆の視点で見る必要がない
普通の視点ではDisplay機能が増えて利便性が上がったと解釈する
その機能を持つ線引きとしてトレイト境界がある
これをトレイト制約と訳すのは違和感ありまくりの間違いだ
530デフォルトの名無しさん
2025/03/15(土) 11:11:57.53ID:ub1zWmmn
>>528
わざと逆方向の視点で語ってるだろ
まともな視点では使える機能が増えている
制約ではない
531デフォルトの名無しさん
2025/03/15(土) 11:15:38.63ID:M+mqoQUv
>>529
トレイト境界について話をしてるんだけど?わかってるか?

トレイト境界は制限でありある種の束縛である
532デフォルトの名無しさん
2025/03/15(土) 11:16:16.66ID:M+mqoQUv
>>530
わざと馬鹿な振りしてるのか?普通に馬鹿なのかどっちなんだ?
533デフォルトの名無しさん
2025/03/15(土) 11:19:12.75ID:M+mqoQUv
トレイト境界 訳語でぐぐったら出来たぞ
https://github.com/rust-lang-ja/book-ja/issues/172

> その型がとりうる値を制限し、より具体的な型を定義する

制約を含んでいる
534デフォルトの名無しさん
2025/03/15(土) 11:21:18.09ID:ub1zWmmn
>>531
真逆の視点で見れば制約と解釈できるのは当たり前
しかしそんなバカな視点持つ人はいない
デフォルトとAnyトレイトしか使えない不便で制約が最大の状態から
各トレイト境界により各トレイト機能を使えるように制限を解放していくのがトレイト境界のプログラミングほ本質
「トレイト制約」派は頭がおかしい
535デフォルトの名無しさん
2025/03/15(土) 11:23:51.41ID:M+mqoQUv
>>534
相手に対して決めつけたベン図的な考えをしてるのが間違い
自分はトレイト制約にしろとはいってない

ただトレイト境界は制限を含んだものだと言ってる
自由度が低くなると言っている

トレイト境界で自由度が高くなると言うポンコツと意見が対立するのは当たり前
536デフォルトの名無しさん
2025/03/15(土) 11:26:39.91ID:M+mqoQUv
学生であり三角形の可能性としては

名前が 三角 形さんである場合が当てはまる
その人は学生であり三角形
537デフォルトの名無しさん
2025/03/15(土) 11:28:48.27ID:A6Zst3Ly
>>498
これに触れちゃったから真っ赤になっちゃってるね
538デフォルトの名無しさん
2025/03/15(土) 11:32:47.50ID:MW+uPLNw
>>534
もしかして impl X for Foo のように「トレイトを実装する」ことを trait bound と思ってる?
trait bound は「この関数に渡せる型Tは〇〇を満たさなければならない」の意味だよ?
Tとしか書かれてないジェネリクス関数は文字通り「何でも渡せる」から、これが一番制約が少ない
539デフォルトの名無しさん
2025/03/15(土) 11:34:15.16ID:ub1zWmmn
>>535
何度言っても理解しようとしないやつだな
非現実的な視点としてそこでは使わない非該当な型からみれば、その型は使えないのだから制限となるのは当たり前だ
そんなプログラミングとかけ離れた非現実的な視点でみるのはおかしい
プログラミングの視点では各トレイト境界を増やすことでその関数でできることが増えて制限から解放される
540デフォルトの名無しさん
2025/03/15(土) 11:40:22.78ID:ub1zWmmn
>>538
その真逆な視点から見れば制約になるのはの当たり前だとずっと言ってるだろ
どちらを制約と捉えるかの問題
Anyしか何もできない<T>が最も制約されている状況
それに対して<T: Trait>とトレイト境界を課すことで制約がなくなって使える機能が増えていく
541デフォルトの名無しさん
2025/03/15(土) 11:41:12.38ID:M+mqoQUv
>>539
トレイト境界に対しては真逆だろ

プログラミングの視点で見てもトレイト境界を増やすことで制限が増えて対象への制約が増える
実装でトレイトにあたる部分を使用しているかどうかはどうであれ自由度が減る
こんな当たり前のことすら理解できないのか?
542デフォルトの名無しさん
2025/03/15(土) 11:43:24.52ID:M12uOjVK
あえて造語すれば機能域とかになるのかな
制約とか機能が増えるとかは視点によって出てくる結果だろう
543デフォルトの名無しさん
2025/03/15(土) 11:46:45.42ID:ub1zWmmn
>>541
その180度逆の視点で見れば制約になるのは当たり前だがそんな視点でプログラミングは行われない
「トレイト境界」により「制約された」とは考えることはなく
「(制限されてる状態から)使える機能が増えた」と考える
544デフォルトの名無しさん
2025/03/15(土) 11:50:54.00ID:ub1zWmmn
>>542
その通り
視点によって両方が起こる
だからそこ「トレイト制約」ではなく「トレイト境界」が正しい
各トレイト境界により線引きされて境界が定まるだけ
それにより使える機能が増えて便利になることがプログラミングの本質
制約されて不便になったとは考えない
545デフォルトの名無しさん
2025/03/15(土) 11:54:54.99ID:M+mqoQUv
>>543
脱線になるが自由度の意味が判ってない

三角形なら基礎的なルール(三つの角度を合わせると180度など)守っていれば辺の長さや角度は自由に設定できる 自由度が高い
二等辺三角形は二辺の長さが同じと言う制約がありその他にも角度が制限される 自由度が低い

二等辺三角形は自由度が低いがそのために角度などを利用して他の隣接した線分などとの角度が確定できるようになる
自由度は減っているが他から見ると利用価値がただの三角形から上がってる
546デフォルトの名無しさん
2025/03/15(土) 11:57:50.75ID:5IRcwf8/
制限なしの型パラメータを制限してるだけでしょ

<T> ←制限ナシ
<T: Eq> ←Eqで制限
<T: Copy> ←Copyで制限
<T: Eq + Copy> ←Eq+Copyで制限

制約って言ってる人の感覚のほうが俺も近い
(型パラメータの型を)制約ってことでしょ

> 使える機能が増えて便利になることがプログラミングの本質

そんな主張生まれて初めて目にしたわ正直w
547デフォルトの名無しさん
2025/03/15(土) 12:03:05.22ID:M+mqoQUv
自由度すら理解できないなんて
この人いつもの長文でおかしなRust擁護書いてる人かな?
548デフォルトの名無しさん
2025/03/15(土) 12:04:44.44ID:ub1zWmmn
>>546
その真逆の不自然な視点を取ることももちろん可能だが
普通はこちらの視点

<T> ←(Any以外)何もできず制限最大
<T: Eq> ←Eqが使えるようになる
<T: Copy> ←Copyが使えるようになる
<T: Eq + Copy> ←EqもCopyも使えるようになる

制約を増やしているのではなく
機能を増やしている
だからトレイト制約なんていうバカな呼び方を採用しない
549デフォルトの名無しさん
2025/03/15(土) 12:07:05.48ID:qQFYiVQo
>>523
そう思うならトレイト視界を使ってくれ
550デフォルトの名無しさん
2025/03/15(土) 12:10:13.35ID:ub1zWmmn
>>547
偏った片方の視点でしか見れない可哀想な人だな
まずは視点を変えることで2つの真逆な見方があるという当たり前のことを理解しようね
551デフォルトの名無しさん
2025/03/15(土) 12:10:26.25ID:5IRcwf8/
型を制限してるんよね
機能がどうのこうのの以前にね
これって理解するの難しいのかなあ
552デフォルトの名無しさん
2025/03/15(土) 12:13:27.59ID:ub1zWmmn
>>549
トレイト視界なんて意味不明
トレイト境界を増やしていくことでその型の使える機能が増えていく
そこで各々のトレイトに境界という線引がある
553デフォルトの名無しさん
2025/03/15(土) 12:16:19.89ID:ub1zWmmn
>>551
そんな当たり前のことはわかってると何度も伝えてるだろ
その片方の視点でしか考えられない狭い考えの人が「トレイト制約」という間違った用語にこだわっている
554デフォルトの名無しさん
2025/03/15(土) 12:16:42.56ID:M+mqoQUv
>>548

vec<T>
vec<T>:where T Eq
vec<T>:where T:Copy
vec<T>:where Eq + Copy

自由度が高いvecはどれ?トレイト境界で自由度が増えるなんて馬鹿はいない
555デフォルトの名無しさん
2025/03/15(土) 12:23:05.50ID:ub1zWmmn
>>554
二つの視点を理解できた?
さらにその問題ならVecの視点とTの視点でさらに二つ分かれる
もちろんトレイト境界はTに対するものだからTの視点が普通人の視点
トレイト境界が何もなければTに対して何もできないから一番不自由な状態
556デフォルトの名無しさん
2025/03/15(土) 12:24:50.62ID:E7lv2JsK
「自己責任」の語源という噂もあるIT界隈ってやっぱ最先端なんだな
自由と制約
性善説と性悪説
なんでもITで定義できる
557デフォルトの名無しさん
2025/03/15(土) 12:24:54.00ID:5IRcwf8/
<T: Eq>で考えたとき
「: Eq」はどこにかかってんのか?
「T」でしょ、それ以外ではないでしょ?
で「T]は何かっていうと型でしょ?

この話のどこに「機能」とやらが出てきたの?
片方の視点もなにも、そもそもの話が
558デフォルトの名無しさん
2025/03/15(土) 12:25:47.49ID:M+mqoQUv
まだ自由度すら理解できないんだよな
文系プログラマの末路が見える
559デフォルトの名無しさん
2025/03/15(土) 12:30:10.54ID:MW+uPLNw
「俺の解釈」でなくちゃんと公式の説明を読もう
https://doc.rust-lang.org/reference/trait-bounds.html
560デフォルトの名無しさん
2025/03/15(土) 12:32:15.55ID:ub1zWmmn
>>557
各トレイトは各々の特性という機能を宣言している
Tという型が何をすることができるものかをトレイト境界で指定していく

ちなみに何度も言っているが
Tという抽象型自体の視点ではなくて、Tに入りうる具体型候補の集合という裏の視点で見れば、トレイト境界が制約になることはもちろん理解している
そんな偏った視点で考えるのはおかしいと主張しているだけ
だから「トレイト制約」というアホな用語は絶対に許容しない
561デフォルトの名無しさん
2025/03/15(土) 12:34:54.10ID:M+mqoQUv
文系が誤魔化しに来ている
562デフォルトの名無しさん
2025/03/15(土) 12:35:11.48ID:5IRcwf8/
>>559
恥ずかしながらそれ読んだことなかったw

> Trait and lifetime bounds provide a way for generic items to restrict which types and lifetimes are used as their parameters.
> 特性と有効期間の境界は、汎用アイテムがパラメータとして使用される型と有効期間を制限する方法を提供します

はいこれ
型を制限なのです
563デフォルトの名無しさん
2025/03/15(土) 12:41:26.07ID:M+mqoQUv
>>560
>>506
> 「制約」という単語は真逆の意味だから使ってはいけない
564デフォルトの名無しさん
2025/03/15(土) 12:41:44.05ID:ub1zWmmn
言った通りだろ
T自体ではなくTに入りうる具体型候補の集合で考えればもちろん制限になる
565デフォルトの名無しさん
2025/03/15(土) 12:43:19.33ID:ub1zWmmn
>>563
その通り
トレイト制約という不自然な用語を採用するつもりは絶対ない
566デフォルトの名無しさん
2025/03/15(土) 12:50:29.91ID:M+mqoQUv
トレイト境界 機能:型を制約します

その一方で
「トレイト制約は不自然だ~」
これは無いな
567デフォルトの名無しさん
2025/03/15(土) 12:58:39.76ID:ub1zWmmn
>>566
まだ二つの視点を理解できないのかね?
トレイト境界は
機能を強化する側面と
具体型候補を制限する側面がある
互いに裏返しでどちらも正しい
その線引をしているから境界
568デフォルトの名無しさん
2025/03/15(土) 13:09:12.24ID:MW+uPLNw
>>567
bound が「線引き」だとして、例えばRustコンパイラが出す以下のメッセージはどう訳すの?
Error: the trait bound is not satisfied
「制約を満たさない」からエラー、という方が自然じゃない?
569デフォルトの名無しさん
2025/03/15(土) 13:22:26.55ID:ub1zWmmn
>>568
文字通りにトレイト境界を満たさないだよ
例えば具体的に Error: the trait bound 'TypeA: TraitB' is not satisfied と指摘される
つまりこのトレイト境界を満たさないとは
TypeAはTraitB(の機能)を実装していない、という意味
570デフォルトの名無しさん
2025/03/15(土) 13:23:13.31ID:MW+uPLNw
「トレイト境界」という言葉が既に用語として認識されている感はあるし、「トレイト境界を満たさない」と書いても実用上は伝わると思うけど
「境界線を満たす」のように、satisfyの目的語が線になることはないと思う
571デフォルトの名無しさん
2025/03/15(土) 13:24:22.65ID:e4F+UdWA
トレイトも日本語に訳した方がいいよね
572デフォルトの名無しさん
2025/03/15(土) 13:26:47.33ID:ub1zWmmn
>>570
線だとは誰も言っていない
線引をして境界を構成しているわけなので、線ではなく境界
だからトレイト境界(trait bound(s))という用語が英語でも日本語でも正しい
573デフォルトの名無しさん
2025/03/15(土) 13:28:22.19ID:qQFYiVQo
imple S {}
を全面的に禁止して
imple T for S {}
だけしか使えない環境にするべきだったね
574デフォルトの名無しさん
2025/03/15(土) 13:35:57.03ID:ub1zWmmn
>>571
クラスもインターフェイスもトレイトもそのままが良いと思う

>>573
トレイトは異なる型の共通機能に対して共通処理をしてコードの共通化をするためにある
そのコード共通化で必要となる共通機能をトレイト境界として列挙する
各型の独自の機能についてトレイトを設ける必要はない
575デフォルトの名無しさん
2025/03/15(土) 13:38:34.38ID:tBWUFgvS
>>572
>>567 の最後の行で (trait bound は) 「線引きをしている」と主張してない?
576デフォルトの名無しさん
2025/03/15(土) 13:43:15.55ID:ub1zWmmn
>>575
線引をして境界が構成されるんだよ
だからトレイト境界と呼ぶ
577デフォルトの名無しさん
2025/03/15(土) 14:20:09.90ID:E7lv2JsK
二項演算を使いたいだけなのに単位元の定義を強制されるパターンはたまにある
制約がないと言えるのは、使いたい関数の名前とトレイトの名前が同じやつだ
578デフォルトの名無しさん
2025/03/15(土) 14:32:56.25ID:WVXVz4wb
なんか伸びてるけどトレイトのようなものは他言語でもよくあるでしょうに
ジェネリックくらいちゃんと理解しとけ
579デフォルトの名無しさん
2025/03/15(土) 14:46:17.14ID:Th8G7jf3
PHPだね
580デフォルトの名無しさん
2025/03/15(土) 14:47:12.31ID:Th8G7jf3
Pythonにはトレイト無いんだよね
581デフォルトの名無しさん
2025/03/15(土) 15:05:58.12ID:5IRcwf8/
>>578
Javaのジェネリクスどうなってるかなって見てみたら

https://docs.oracle.com/javase/tutorial/java/generics/boundedTypeParams.html
> Bounded type parameters are ...
> ..., use a type parameter bounded by the Comparable<T> interface:

Bounded type parametersって呼び方なんだな
582デフォルトの名無しさん
2025/03/15(土) 15:11:33.31ID:suA91QDC
制約と言う人達は trait を理解していない
C++03からやり直すべき
583デフォルトの名無しさん
2025/03/15(土) 15:19:39.28ID:MW+uPLNw
>>582
このスレで出てる話は trait でなく trait bound という言葉についてだぞ
584デフォルトの名無しさん
2025/03/15(土) 16:39:04.00ID:HIinARQ8
>>570
日本語では「境界を満たしていません」なんて言い方はしないんだよ
質の悪い機械翻訳以外ではね

現代日本語の「境界」は境界線や境目のことであって境界づけられた範囲や領域を指して「境界」とは言わない

“bound is not satisfied”や”requird by this bound”などからもわかるようにRustを開発してる中の人も明らかに制約面を重視してboundsという用語を使っている

それだけじゃなくtrait boundsはジェネリックの型パラメーターの型制約の一種
ジェネリックにおける「型制約」という用語はRustに限らずプログラミングの概念として広く定着しているものでRustでももちろん使われている

それらを完全に無視して無理のある「境界」という訳語を当ててこじつけ解釈を続けるメリットは何もない
585デフォルトの名無しさん
2025/03/15(土) 17:03:40.05ID:suA91QDC
bounds に制約という意味はない
586デフォルトの名無しさん
2025/03/15(土) 17:07:19.39ID:suA91QDC
trait は特性を表現するのみで
それが何かを制約することはない

trait bounds はある特性の範囲を表現するのみで
それが何かを制約することはない

これで理解しないならお手上げだ
587デフォルトの名無しさん
2025/03/15(土) 17:09:42.34ID:suA91QDC
日本に匙を投げる日は近い
備えよ
588デフォルトの名無しさん
2025/03/15(土) 17:13:39.17ID:HIinARQ8
>>496
>boundsに制約なんて意味はない
>trait boundsも、ある一定内の数値や、配列のインデックスなどのbounds checkingと同じく境界が定まる
制約という意味はあるよ
辞書にものってる

制約という訳語がそのまま載ってない辞書でも制限や許容範囲という訳語はあるはず
制限と制約は微妙に違う単語でニュアンスも違うけど状況によっては代わりに使える単語
英語でconstraintとrestrictionを使い分けるのに似てる
type restrictionとtype constraintのどちらが伝えたい意味に近いかという話と同じ

伝えたいニュアンスとは別に「型制約」という概念・用語がかなり昔から広く浸透してることを考えるとトレイト制限とトレイト制約を比べれば後者のほうがより適切と判断するのはごくごく自然なことだと思う
589デフォルトの名無しさん
2025/03/15(土) 17:19:50.55ID:HIinARQ8
>>586
>trait bounds はある特性の範囲を表現するのみで
>それが何かを制約することはない

型パラメーターが自由に動ける範囲を制約するもの
そもそもboundsは単純な「範囲」という意味ではなく何かが許された範囲・領域のことで制約・制限的なものが必ずついて回る
590デフォルトの名無しさん
2025/03/15(土) 17:21:45.08ID:tr5ODwiQ
「境界」という言葉のほうを軸にするなら満たす/満たさないではなく越える/越えないと言ったほうが自然かなとは思う。
591デフォルトの名無しさん
2025/03/15(土) 17:25:50.05ID:tr5ODwiQ
でも技術用語は不自然なくらいで良いとも思う。
下手に日常用語の意味と合わせると仕様上の意味と日常の意味が混ざって混乱する。
「Rust 用語ではこういうんだよ!」で行くべき。
592デフォルトの名無しさん
2025/03/15(土) 17:31:37.59ID:aXarc3PA
T: Traitは未知の型Tに対して可能(必要)な操作を明示するためのもので
Tの型に制限がかかるのはその結果にすぎないよ
Tの型を制限する目的で境界を設定してるわけではない

これはジェネリクスを含む型とか関数を実装する側になれば分かる
できるだけTの制限が緩くなるように配慮しないといけない
593デフォルトの名無しさん
2025/03/15(土) 17:41:38.03ID:Th8G7jf3
Scala目指すのか。コップ本は挫折したな。共変半平
594デフォルトの名無しさん
2025/03/15(土) 17:44:06.77ID:9va4ZYj7
>>584
boundsに制約の意味はない
何らかが有効な境界や限界を意味し
もしくはその境界線や境界面
もしくはその範囲や領域を意味する
そこに制約(constraints)という発想や概念はない

trait boundsも同様
ある型やサブトレイトに対してそのトレイトが境界となる
敢えて境界(bounds)という単語を用いており
訳語もそのままトレイト境界が望ましい
595デフォルトの名無しさん
2025/03/15(土) 17:44:31.55ID:suA91QDC
>>588
ANSI C からやり直せ
596デフォルトの名無しさん
2025/03/15(土) 17:57:52.96ID:39/jPfqN
cargo test --test-threads=1
でシングルスレッド実行出来るけど
テスト用のプログラムの中からシングルスレッドを強制する方法は?
597デフォルトの名無しさん
2025/03/15(土) 17:58:10.60ID:M+mqoQUv
例の爺さんまだ頑張ってるの?
その時間の使ってコードでも書けばいいのに
598デフォルトの名無しさん
2025/03/15(土) 18:18:31.82ID:AcPGIkeS
>>592
リファレンスには制限するためのものだとはっきり書いてあるよ
Trait and lifetime bounds provide a way for generic items to restrict which types and lifetimes are used as their parameters.
https://doc.rust-lang.org/stable/reference/trait-bounds.html

もうこれで終わりかな?
599デフォルトの名無しさん
2025/03/15(土) 18:27:44.91ID:5IRcwf8/
1) interfaceは境界
2) traitsはinterfaceに似たようなもの(although with some differences)
3) トレイト境界=頭痛が痛い

https://doc.rust-lang.org/book/ch10-02-traits.html
> Note: Traits are similar to a feature often called interfaces in other languages, although with some differences.
600デフォルトの名無しさん
2025/03/15(土) 18:55:47.88ID:B1sOi1++
トレイト制約に決定したね
ここからは踏み絵フェーズ

正しくトレイト制約と言えない人がリアルでもヤバイ人
際立つ言動はネットだからと思うかも知れないが、Linuxのごたごたで明白になった通りリアルにゴロゴロいる
601デフォルトの名無しさん
2025/03/15(土) 19:02:32.24ID:E7lv2JsK
決定も自己責任でいいんだよ自己責任で
決定の権限をコミュニティに握らせるな
602デフォルトの名無しさん
2025/03/15(土) 19:10:23.94ID:LfHENop6
>>601
オライリー「せやからトレイト制約やで」
603デフォルトの名無しさん
2025/03/15(土) 19:16:54.72ID:aXarc3PA
>>598
なんか最初のパラグラフだけで「もうこれで終わりかな?」とか言って読むの終わりにしてそう
リファレンスは全部目を通した方がいいと思うけど英語は最初のパラグラフ大事だから判断が難しいな

一応次のパラグラフも載せとく
Bounds on an item must be satisfied when using the item.
When type checking and borrow checking a generic item, the bounds can be used to determine that a trait is implemented for a type.
604デフォルトの名無しさん
2025/03/15(土) 19:33:16.01ID:M+mqoQUv
ライフタイム境界
605デフォルトの名無しさん
2025/03/15(土) 19:38:12.05ID:9va4ZYj7
>>600
boundsに制約の意味はない
トレイト制約は間違い
606デフォルトの名無しさん
2025/03/15(土) 19:43:28.14ID:BxnZ1UiZ
boundsの意味は英英辞書的にはlimit
https://dictionary.cambridge.org/dictionary/english/bounds

limitの意味は最も大きい量や数値
https://dictionary.cambridge.org/dictionary/english/limit

なので境界でも良くねって思う。

あと制約はないかなぁ。
制限だったらまだわかる。
607デフォルトの名無しさん
2025/03/15(土) 19:46:52.98ID:suA91QDC
もはやお手上げだ
K&Rからやり直すことをお勧めする

traitを制約に使うことと
traitが制約であることは
全く別なのだ

この説明でもわからんのかな?
テキサスの小学生でもわかりそうなもんだが
608デフォルトの名無しさん
2025/03/15(土) 19:52:07.05ID:ICPY9sLg
本当だ
ゴロゴロいる
609デフォルトの名無しさん
2025/03/15(土) 19:52:24.06ID:0G30F5AB
>>606
ジェネリックパラメータの取りうる範囲が
trait boundsによって制限されるだけであって
トレイト制限やトレイト制約という表現はおかしい
この違いが重要

trait boundsは
トレイト限界か
トレイト境界なら正しい
トレイト境界で良いと思う
610デフォルトの名無しさん
2025/03/15(土) 19:53:57.66ID:aXarc3PA
制約と誓約なら知ってる
611デフォルトの名無しさん
2025/03/15(土) 20:02:57.98ID:M+mqoQUv
1~2人だけ制約ではないと言い張っている印象
612デフォルトの名無しさん
2025/03/15(土) 20:04:24.77ID:5IRcwf8/
>>606
まさかの制限派出現嬉しい
境界、制約、制限の中で一番平易でヨシ
613デフォルトの名無しさん
2025/03/15(土) 20:04:51.39ID:M+mqoQUv
トレイト境界 機能:型を制約します
ライフタイム境界 機能:コンパイラに寿命を示します
614デフォルトの名無しさん
2025/03/15(土) 20:06:02.80ID:Th8G7jf3
オライリーで翻訳本出すのかい?
615デフォルトの名無しさん
2025/03/15(土) 20:14:58.66ID:9va4ZYj7
>>611
どこにも記述されていない制約という言葉を唐突に持ち出してる人?
トレイト制約では根拠もなく意味も通らない
616デフォルトの名無しさん
2025/03/15(土) 20:25:08.62ID:BMkcs71n
>>614,615
既にある
オライリー プログラミング Rust「トレイト制約」

トレイト制約は天下のオライリー本での訳語なので5chに限らずSNSやgithubで普通に提案できる
617デフォルトの名無しさん
2025/03/15(土) 20:26:17.47ID:9va4ZYj7
>>616
だから根拠を示しなさい
制約に該当する英語すら見当たらない
618デフォルトの名無しさん
2025/03/15(土) 20:26:33.32ID:BMkcs71n
QiitaやZennでも
619デフォルトの名無しさん
2025/03/15(土) 20:27:24.54ID:BMkcs71n
>>617
本を見てくれ
620デフォルトの名無しさん
2025/03/15(土) 20:30:16.76ID:9va4ZYj7
>>619
どういう根拠が書かれているの?
621デフォルトの名無しさん
2025/03/15(土) 20:30:49.53ID:suA91QDC
[0、9)という半開区間があったとして
これを数値範囲の制限に使ったとしても
半開区間を制約とは言わない
半開区間で示される数値の範囲を制約に使っただけである

これで理解できるか?
622デフォルトの名無しさん
2025/03/15(土) 20:33:16.68ID:suA91QDC
おいおい大丈夫か日本列島?
623デフォルトの名無しさん
2025/03/15(土) 20:33:57.45ID:MW+uPLNw
>>621
それは通常 bound と呼ばないものを持ち込んで無理にこじつけてないか?
624デフォルトの名無しさん
2025/03/15(土) 20:35:41.76ID:YJDn0bnr
凡俗法則だっけ?
どうでもいい話題ほど盛り上がるってやつ
625デフォルトの名無しさん
2025/03/15(土) 20:37:09.22ID:BxnZ1UiZ
オライリー教は難儀だなぁ
626デフォルトの名無しさん
2025/03/15(土) 20:38:46.91ID:suA91QDC
>>616 が誤解している可能性と
オライリーの質が落ちてる可能性と
二つの可能性が存在する
627デフォルトの名無しさん
2025/03/15(土) 20:39:57.08ID:0G30F5AB
trait boundsはそのトレイトによる境界・限界・領域を表している
そこには制約の概念も意味も一切ない
そのtrait boundsによってパラメータの取り得る範囲が制限を受ける

以上の二つの事実を混同して
trait boundsをトレイト制限と呼ぶのはおかしい
ましてやトレイト制約と呼ぶのは論外
628デフォルトの名無しさん
2025/03/15(土) 20:50:07.53ID:5IRcwf8/
https://github.com/rust-lang-ja/book-ja
ここ見てみたらそもそも最初はTatsuya Kawanoって人がいきなり書いた文章よね?
「トレイト境界」ってのは
それ以前にrustコミュニティでこの用語定義されてるの見たことある?
誰かrustの歴史に詳しい人ー
629デフォルトの名無しさん
2025/03/15(土) 21:03:27.05ID:9va4ZYj7
>>628
そのissueで議論されている
・既に多くの人たちがブログetc.の記事でトレイト境界と書いていた
・Scalaでもboundsは境界と訳している
・配列のbounds checkも境界チェック
・制約と訳される場合は英語がconstraint
630デフォルトの名無しさん
2025/03/15(土) 21:06:26.31ID:5IRcwf8/
わかった何がモヤってたのか
CならJIS規格があって用語も定義されてるからそれに倣えばいい
Javaなら開発元がご存命のときに日本語のドキュメントはすでにあったんでそれに倣えばいい
Rustの場合は現時点では規格が無いんよね
規格があったらそれがなんであれ書いてある用語に従うよねみんなが

>>628
それだけ?
631デフォルトの名無しさん
2025/03/15(土) 21:27:59.47ID:E7lv2JsK
規格が重視されなくなったのは多分CPythonがCでライブラリを大量生産した歴史のおかげだ
632デフォルトの名無しさん
2025/03/15(土) 21:31:58.75ID:0G30F5AB
trait boundsの概念の理解を間違えて「トレイト制約」だと誤認してしまった人は
>>627で指摘した二つの話を混同している
633デフォルトの名無しさん
2025/03/15(土) 21:43:48.49ID:M+mqoQUv
おじいちゃんはいつも一人でわあわあ言って泡吹いてるよな

トレイト境界 機能:型を制約します
634デフォルトの名無しさん
2025/03/15(土) 21:53:08.18ID:BxnZ1UiZ
「型を制約します」って言い回しとして変じゃない?
「型”に”制約を課します」だったらまだ理解はできる。
もっとも制約を課してるわけではないので、この言い回しも適切ではないと思う。
635デフォルトの名無しさん
2025/03/15(土) 21:58:09.74ID:Poqgk2wF
>>628
そのリポジトリは比較的最近のやつで訳語は過去のを踏襲しただけ
一番最初のTRPL翻訳の該当するPRはおそらくこれかな
https://github.com/rust-lang-ja/the-rust-programming-language-ja/pull/38
636デフォルトの名無しさん
2025/03/15(土) 21:58:24.13ID:M+mqoQUv
じゃあ何だったら気に入るんだ?
型を限定しますか?
637デフォルトの名無しさん
2025/03/15(土) 22:09:45.50ID:BxnZ1UiZ
「型の境界を明示する / 明確に示す」とか?
これが適切かどうかはわからんけど。
638デフォルトの名無しさん
2025/03/15(土) 22:13:14.41ID:tr5ODwiQ
>>630
それはそう。
その上で、 >>628 は実質的に規範の地位を確立してるからもう妥当性を検証するような段階は過ぎてる……と認識してる人とそうでない人がいるんだと思う。
出来の良し悪しを言うやつも多いがそんなことをいったら JIS だってたいしたクオリティじゃないし、それでもなお規範という「ことにする」ということで納得しないとしょうがないんだけどなぁ。
639デフォルトの名無しさん
2025/03/15(土) 22:26:10.52ID:5IRcwf8/
>>635
ご丁寧にありがとうございます(>>629さんもあらためてありがとね)

https://qiita.com/_Nnwww/items/529ad0397e4b3a59da67
> ジェネリック関数は'トレイト束縛'と一緒に使えば最高に便利になります

初めて目にしたけど
正直良いやん!って思った
トレイト束縛
最初はこれだったんやね
640デフォルトの名無しさん
2025/03/15(土) 22:31:03.74ID:E7lv2JsK
倫理的な「殺すな」「盗むな」等に比べて、言語的な規則が実在すると何故そんなに信じているのかが分からない
どっちも存在するか、あるいはどっちも存在しないと考えるのが自然ではないかね
641デフォルトの名無しさん
2025/03/15(土) 22:36:16.49ID:tr5ODwiQ
>>639
束縛は変数束縛とかで使うニュアンスがすでに定着しているので違和感を持つ人が多いと思う。
642デフォルトの名無しさん
2025/03/15(土) 23:01:56.75ID:Poqgk2wF
>>639
それ以降も訳語を変えてはどうかという話は何度も出ているけど
結局のところ誰も説得力のある代案を出せなかったからそのままになっている、って感じ
確かrust-jpのslackでもいろいろ議論はあったと記憶しているけど
slackの過去ログは消えたので詳細は分からなくなってしまったね
643デフォルトの名無しさん
2025/03/15(土) 23:37:53.75ID:lrO4FCGW
今回は代案が明確だから決定した
644デフォルトの名無しさん
2025/03/15(土) 23:56:12.71ID:E7lv2JsK
主語がでかいっていうか主語が確定してない
645デフォルトの名無しさん
2025/03/16(日) 00:20:19.13ID:B4wnHsDg
日本における Rust 黎明期から特に翻訳に取り組もうとした人たちが相談して決めたことより自分のほうが妥当だと思える感性が信じられない。
646デフォルトの名無しさん
2025/03/16(日) 01:02:58.08ID:PKYfY0wz
>>645
どこの馬の骨ともわからん有志が対した議論もせずに
JavaやScalaの誤った訳か機械翻訳を間違って採用しただけだろ

しっかりした議論が残ってればもう少し違う見方もできるけど
これに関してはどのイシューひどいじゃん
647デフォルトの名無しさん
2025/03/16(日) 02:18:37.75ID:w3N6tLjW
もういいじゃんそんな細けーこと
648デフォルトの名無しさん
2025/03/16(日) 02:46:42.41ID:yI9oTyRI
武器などの物体は正義でも悪でもないとよく言われる
それを買ったただの消費者が正しさに寄与する
ただの消費者のほうが正しい、ではなく、正しさに寄与するのは消費者だけなのだ
649デフォルトの名無しさん
2025/03/16(日) 03:28:25.58ID:ur48jpVS
ぶっちゃけそれ系の訳の問題言うならあれvariantが列挙子って訳になってるのをまずやめてほしい
650デフォルトの名無しさん
2025/03/16(日) 03:31:26.33ID:f6FIyYfU
>>639
trait bounds自体は束縛や制約という意味を全く含んでいないため
そのトレイト束縛という日本語訳はよろしくない

trait boundsのboundsの意味から有り得る日本語訳は
トレイト境界
トレイト限界
トレイト限度
トレイト範囲
つまりトレイトによる空間の線引きといった概念を表している

つまりtrait bounds自体には制約や束縛といった概念は全く含まれていないためそこは明確に区別する必要がある

そしてtrait boundsによって型パラメーターが制限される(restrict)
このような関係なのでtrait boundsに対してトレイト制限という日本語訳ももちろんよくない
トレイト境界が型パラメーターを制限する関係
651デフォルトの名無しさん
2025/03/16(日) 03:34:24.31ID:ur48jpVS
Type: Traitの二項関係をsubtypingだと解釈すればtrait boundはlower bound(下界)を宣言していると見ることもできなくはないけど
でもsubtypingじゃねーから微妙に惜しいんだよな

線とか言ってるのはただのバカ
652デフォルトの名無しさん
2025/03/16(日) 03:55:22.51ID:f6FIyYfU
>>651
そこまで理解していながら
空間を線引きを線だと思ってしまった?
線引きは概念だから少なくとも空間に対する線引きは線と無関係
有界を引き起こす存在と表現した方がお気に召す?
653デフォルトの名無しさん
2025/03/16(日) 05:18:13.31ID:Mb92w3En
何か延びてると思ったら
トレイト警察うざすぎ
654デフォルトの名無しさん
2025/03/16(日) 06:07:04.14ID:fZszb0GG
どちらも譲らないから延々このネタで盛り上がっていいんじゃないの
昔のム板では「importは輸入という訳語がいいかカタカナでインポートがいいか」ってレスバに花が咲いて何ヶ月も揉めたことがあるよ

あんときもアレコレ英語の語源とか意味とか出てきてみんな楽しかったなあ

英語ネタというか翻訳ネタはいい意味でプログラムの本質の理解度を試されるから、ム板ではアルゴリズムそのものより熱く語られる伝統がある
655デフォルトの名無しさん
2025/03/16(日) 06:09:34.58ID:w3N6tLjW
ちゃうちゃう
バカでも参加できる話題だから盛り上がるんだよ
656デフォルトの名無しさん
2025/03/16(日) 06:26:58.07ID:OYB6I5YT
まだ出ていないようなので

【「トレイト制約」と呼んではいけない理由】
プログラミング言語で広く確立されている用語として「型制約 (type constraint)」がある
これは各言語によって様々な条件を指定することで型(パラメータ)を制約することを指す
つまり型が制約される対象である
もし「トレイト制約」という用語を用いるとトレイトが制約される対象となってしまう
そのため英語でもtrait constraint (トレイト制約)という用語を用いていない
trait bound (トレイト境界)は条件側の一つである
657デフォルトの名無しさん
2025/03/16(日) 08:35:57.95ID:et8KMeeu
C++03からやり直せば理解が進むのでは?
658デフォルトの名無しさん
2025/03/16(日) 08:44:56.04ID:MZvUgHKE
https://ejje.weblio.jp/content/bounds

日本語WordNet(英和)での「bounds」の意味
ものの限界または範囲を示す線あるいは面

EDR日英対訳辞書での「bounds」の意味
リミット;切り;埒;限り;方図;限界;限度

日英・英日専門用語辞書での「bounds」の意味
上下限,範囲,限度,限界

斎藤和英大辞典での「bounds」の意味
制限;範囲;極限;際涯;構内;切り;程;極際;限界

Weblio英和対訳辞書での「bounds」の意味
埒, 埓, 上下限, 境界, 限度, 果てし, 際限, 限り, 程
限り, 範囲, 限界, 〈際限〉・切り, 〈限度〉・程, 際限, 〈限界〉・極限, 限度
領域
バウンズ
659デフォルトの名無しさん
2025/03/16(日) 09:19:47.84ID:QnytwJN4
そういや、日本語訳に文句のある人は最新のthe book の翻訳はしないの?

旧日本語版は情報が古いし公式からリンクを貼られているgithubのは翻訳している気配無いし。翻訳が間違っているなら、最新版の翻訳を用意すれば正しい方向に誘導できるんじゃないのかね。
660デフォルトの名無しさん
2025/03/16(日) 09:28:08.49ID:OHAI5BZ5
境界がイメージしにくいとかじゃなくてboundsと言うワードが機能をうまく表現していない

boundsの訳を一生懸命模索してもそこがネックになる
訳語を離れると機能面で制約や限定などになる
661デフォルトの名無しさん
2025/03/16(日) 09:31:22.26ID:B4wnHsDg
>>660
テクニカルタームはそういうもんなんだってば。
Rust ではこういう意味だと定義したならそれでいくしかないの。
662デフォルトの名無しさん
2025/03/16(日) 09:56:09.74ID:OHAI5BZ5
自分は別に境界でも良いと思う
でも、理解しにくいとか納得できないと言う声が大きいならそれに対しても対応しないと
ユーザーが伸びない
663デフォルトの名無しさん
2025/03/16(日) 10:05:35.57ID:YoyW4Wr9
bounds という単語に縛られすぎているw のかも

英語の方でも、ある概念を表すのに不十分ながら敢えてその単語を当てているということもあるだろうから
単語の訳にこだわるよりも概念の方にこだわるべきで、それを表す日本語の候補を挙げて適宜使い分けるとか
あるいは造語するとかした方が良いのかもね
664デフォルトの名無しさん
2025/03/16(日) 11:14:15.60ID:OYB6I5YT
トレイト境界よりも良い候補がないんだよ
ちなみに
トレイト制約だけは>>656の理由で使用禁止なので
665デフォルトの名無しさん
2025/03/16(日) 11:24:48.77ID:OHAI5BZ5
じゃあトレイト指定かトレイト制限で
666デフォルトの名無しさん
2025/03/16(日) 11:26:44.63ID:OHAI5BZ5
トレイト限定 トレイト固定 トレイト制約 トレイト条件
667デフォルトの名無しさん
2025/03/16(日) 11:48:31.73ID:lghBi3nK
where ~だからトレイト句 トレイト節で良かったのになあ
もともと英語からしてしっくり来てない人もいるのでは
668デフォルトの名無しさん
2025/03/16(日) 11:53:59.91ID:OYB6I5YT
>>665 >>666
型制約や型制限や型限定をするために使われる側の話だから
トレイト制約やトレイト制限やトレイト限定は全てダメ
トレイトを限定(制約)していない
669デフォルトの名無しさん
2025/03/16(日) 11:55:14.15ID:OHAI5BZ5
それはあなたの乾燥()ですよねとしか

実際に制限され限定され固定され制約されているんだけど
670デフォルトの名無しさん
2025/03/16(日) 11:57:24.55ID:Mb92w3En
parameterを媒介変数って訳したのも誤訳だと思います
671デフォルトの名無しさん
2025/03/16(日) 11:58:52.71ID:/wKHKA1M
>>650
>trait bounds自体は束縛や制約という意味を全く含んでいないため
制約という意味は含まれてるよ
辞書的にもboundsの和訳として「制約」が使われてるものがあるし
文脈的にもtrait boundsは型制約(type constraints)の一つの方法だから「制約」と訳すことに大きな問題はない

束縛はbindの過去分詞のboundから取ってるもので
これは同じスペルの違う単語なので「境界」以上にやめたほうがいい
672デフォルトの名無しさん
2025/03/16(日) 11:59:25.88ID:OHAI5BZ5
将来的になんらかの機能が拡張されて制約が生じるのがトレイトだけで無くなった場合どうするんだろうかとは思う
673デフォルトの名無しさん
2025/03/16(日) 12:16:16.76ID:OYB6I5YT
>>671
型制約は型を制約するんだよ
トレイト制約はトレイトを制約するわけではないから誤解を招くでしょ
だからトレイト制約(trait constraint)という表現は英語版でも使われていないの
674デフォルトの名無しさん
2025/03/16(日) 12:22:14.60ID:/wKHKA1M
>>650
>そしてtrait boundsによって型パラメーターが制限される(restrict)
>トレイト境界が型パラメーターを制限する関係

実装すべきトレイトを指定することで型パラメーターが取れる型の範囲を制限するのがtrait bounds
型パラメーターを制限するという意味を持たないのはあくまで”指定するトレイト”であってboundsにはすでに制限という意味が付随してる

これはboundsという英単語がもともと持っているものでもありtrait boundsでもその意味が付随している
675デフォルトの名無しさん
2025/03/16(日) 12:33:45.83ID:OYB6I5YT
>>674
根本的な違いを理解しようよ

型は制限(制約)される側
だから型制限や型制約と言われる

トレイトは制限(制約)する側
だからトレイト制限やトレイト制約とは言わない
676デフォルトの名無しさん
2025/03/16(日) 12:35:35.73ID:ljG29Uc3
Cで言えばvoid*をint*へキャストしてint変数を四則演算可能にする概念をboundsと呼んでるようなもので
型で制約するためにメモリ上へ境界を作ってると解釈してるわ
Rustはんではそないに呼びはりますか、どないでもよろしおすレベルなんだが、
メモリやストライドの意識がないとこんなんで盛り上がれるんだな
677デフォルトの名無しさん
2025/03/16(日) 12:52:27.37ID:5FNktwcE
>>676
それは全然違うぞ?
メモリ空間とか関係なく、コンパイル時の制約として使ってるだけ
例えば C++ の const なども「可変な操作を禁止する」けど、これはあくまでコンパイル時にチェックされるだけで、出力されるバイナリや実行時の動作には影響しない
678デフォルトの名無しさん
2025/03/16(日) 12:53:19.59ID:/wKHKA1M
>>673
「トレイト制約」とするとトレイトを制約するものなのかトレイトによる制約なのかわからないというのはその通り
これは助詞的なものを省略して名詞化した場合に必ず発生すること

こういう場合は一般的に使われる「〇〇制約」という用語が〇〇が制約される対象という意味で使われているのかそれとも〇〇によって別の対象が制約されるという意味で使われているのかを考えるとよい

もし後者の意味ではほとんど使われていないなら問題となるが現実はそうではない
むしろ後者の意味で使われることのほうが多い

逆に「トレイト境界」のように「〇〇境界」という用語は
一般的にはある〇〇と別の〇〇の境界という意味で使われることがほとんど
つまりトレイトとトレイトの間の境界線と解釈されやすい
679デフォルトの名無しさん
2025/03/16(日) 12:57:16.42ID:ljG29Uc3
>>677
言葉足らずだったね、そりゃそうだ
あくまで言語設計側のネーミングセンスと概念把握の方法の話をしている
さすがに現代の言語でメモリモデルに即した名前付けをしてるとは思ってないわ
680デフォルトの名無しさん
2025/03/16(日) 12:57:40.04ID:OHAI5BZ5
このスレでは一人だけ勘違いしてるのはID:OYB6I5YT
681デフォルトの名無しさん
2025/03/16(日) 13:12:06.44ID:/wKHKA1M
英単語のboundsには何かが許された範囲や領域のことで
境界線じゃなく内側のエリアが意味の中核

ただout of boundsやbeyond boundsのように
範囲の外に出てしまったこと表現している場合は
境界・境界線・限度のように面ではなく線で捉えても
実質的に問題がないから辞書にはその手の意味が列挙されている

そうじゃない文脈で境界・境界線の意味を伝えたいなら
boundsではなくboundaryを使う
682デフォルトの名無しさん
2025/03/16(日) 13:30:12.28ID:fZszb0GG
トレイト界限でいいんじゃないの
台湾語でも領域の境界を表すというふうに翻訳してたぞ?

界(領域・範囲)の限(端っこ)なんだからもうこれで通じる
683デフォルトの名無しさん
2025/03/16(日) 13:31:30.30ID:fZszb0GG
正確にはこうだ

特徵界限
使用泛型時,您通常會需要該型別實作 某些特徵,這樣才能呼叫該特徵的方法。
684デフォルトの名無しさん
2025/03/16(日) 13:31:38.19ID:OHAI5BZ5
パラメーターTが条件で制約されている

皆は条件の方を見ている トレイトが条件となりTが制約されていると言うことは理解している

誰かはパラメーターTの方を見ている そしてトレイトが制約されてはいないと言う
もちろん誰もそんなことは言ってない
こちらは誰の目から見ても自明なのでそこを言ってるんじゃないと誰でも理解出来る
そこを明言しても不毛だから

皆はトレイト "で" 制約と理解しているが
誰かは意図的にトレイト "が" 制約されていないと永遠に繰り返す
話すだけ無駄
685デフォルトの名無しさん
2025/03/16(日) 13:42:37.58ID:G6dj5tgH
>>682
界限は日本語だと使われない言葉なので
トレイト有界がいいんじゃないかな
トレイト有界により型制約をする
686デフォルトの名無しさん
2025/03/16(日) 13:46:32.71ID:+oxKnctY
仮にここのレスバで「トレイト制約」が勝ったとしてさ、これから実生活で「トレイト制約」使うの?
そして同僚に「なんでトレイト境界のことトレイト制約って呼ぶの?」って言われてこのスレ引用するの?

キチガイじゃん
687デフォルトの名無しさん
2025/03/16(日) 13:47:04.12ID:JROXwZr8
ちな>>658の集計
5 限界
5 限度
3 際限
3 限り
3 範囲
3 程
3 切り
2 極限
2 埒
2 上下限
1 領域
1 際涯
1 構内
1 極際
1 果てし
1 方図
1 境界
1 埓
1 制限
1 リミット
1 バウンズ
1 ものの限界または範囲を示す線あるいは面
688デフォルトの名無しさん
2025/03/16(日) 13:48:10.97ID:G6dj5tgH
>>686
勘違いのトレイト制約は絶対にあり得ないからその心配は必要ないかな
689デフォルトの名無しさん
2025/03/16(日) 13:55:57.01ID:iz14YCJR
>>688
どれが勝ったとしても、公式じゃない呼び方する奴はキチガイだよ
690デフォルトの名無しさん
2025/03/16(日) 13:57:13.51ID:JROXwZr8
トレイト制約はオライリー本がソースなのが強いね
一方でトレイト境界はボランティア翻訳みたいなのがソースだから
691デフォルトの名無しさん
2025/03/16(日) 14:01:13.30ID:G6dj5tgH
boundsに限界の意味はあっても制約の意味はないからトレイト制約は論外でしょ
692デフォルトの名無しさん
2025/03/16(日) 14:05:12.42ID:ur48jpVS
そもそもtrait boundという英語自体が疑問符の付く表現なので日本語での100%正しい訳語を求めようという試みが徒労なんじゃな
693デフォルトの名無しさん
2025/03/16(日) 14:20:00.51ID:rrJWS6si
今はRust本もたくさん出ているから多数決でも取ればいいんでは
とりあえず手元にある技評のは境界だった
まぁボランティア翻訳やってた人達が書いているから当然ではあるが
694デフォルトの名無しさん
2025/03/16(日) 14:25:47.80ID:B4wnHsDg
技術的な仕様書の類は直訳が普通。
原本が絶対だから不審があるときには原本を調べやすいように対応付けを明らかにすることが意図されている。
695デフォルトの名無しさん
2025/03/16(日) 14:29:48.29ID:B4wnHsDg
チュートリアルの類は仕様書の習慣に合わせるのは良くない部分があるけど、仕様書と違う用語を使っちゃったらそれはそれでおかしいしな。
696デフォルトの名無しさん
2025/03/16(日) 14:36:08.11ID:0Ux+HUdg
トレイト界隈はここだ~
697デフォルトの名無しさん
2025/03/16(日) 15:27:06.44ID:p/t/31g6
これが自転車置き場議論というやつか
698デフォルトの名無しさん
2025/03/16(日) 15:28:00.89ID:UGKGcaiP
>>692
trait boundはビッタリな適切な表現なのでそこを問題視する人はいないよ

元々boundは数学での基本用語でそこからプログラミング言語でも使われている
数学ではT⊂Uで任意のt∈Tに対してt≦x, x∈Uとなるxをupper boundと言う
Scalaでupper type bound (上限型境界)『T <: U』とは型変数Tが型Uのサブタイプであることを示す
Rustでは『T: U 』で型パラメータTがトレイトSのトレイト境界(trait bound)を示す

つまりtrait boundは概念を上手く表している良い用語
あとはboundの日本語訳だけど上述の他の言語でも境界と訳している
他にもプログラミング界ではbound checkingを境界チェックまたは境界検査と訳している
699デフォルトの名無しさん
2025/03/16(日) 15:35:28.57ID:OHAI5BZ5
>>698
トレイトが実装されていなければout of boundsと呼んでしっくりくるんならわかるけど
そうではないだろw
違和感しかない
700デフォルトの名無しさん
2025/03/16(日) 15:41:36.89ID:o4pE96wL
>>698
数学用語は境界じゃなく界
それを間違って境界と訳してしまったのはScala関係者の罪
界であれば単語の持つ意味的には境界のように間違いというわけではないがトレイト界やライフタイム界とするとやや専門的過ぎて界と言えば相撲界や芸能界のような業界を連想する人たちを遠ざける

arrayのbound checkはindexが”妥当な範囲”の中にあるかどうかをチェックするもの
この”妥当な範囲”を示す便利な短い単語が日本語にはないため”妥当な範囲”という本来の含意を捨てて実質的に問題が発生しにくいと思われる意訳を行っている例が”境界検査”
701デフォルトの名無しさん
2025/03/16(日) 15:46:24.18ID:0Ux+HUdg
トレイト界隈であってたw
702デフォルトの名無しさん
2025/03/16(日) 16:05:24.34ID:JROXwZr8
界 ←右足をクネっとさせる田んぼマン
703デフォルトの名無しさん
2025/03/16(日) 16:19:34.14ID:UGKGcaiP
Rustで単なるboundsは対象が明白な場合の略の場合とtrait boundsやlifetime biundsやuse boundsの総称として使われている
use boundsはこの前入ったprecious capturingね

fn capture<'a, 'b, T>(x: &'a (), y: T) -> impl Sized + use<'a, T> {
 (x, y)
}

いずれにせよboundsはRustにおいても長く定着して使われている基本用語なのでこれを批判しても意味がない
bounds1 + bounds2 + bounds3 と境界が複数あるとその共通部分に入るイメージ
704デフォルトの名無しさん
2025/03/16(日) 16:25:19.93ID:o4pE96wL
トレイトを使った型制約なので「トレイト制約」

リファレンスやエラーメッセージでboundsと一緒に使われている動詞を見ればコアな開発者もboundsを満たすべき制約/条件/要件という感覚で使っていることがわかる

bounds must be satisfied
type must meet the bounds
relax the bound

「境界を満たす」とか「境界を緩和する」とか日本語でも英語でも言わない
705デフォルトの名無しさん
2025/03/16(日) 16:42:01.76ID:o4pE96wL
オライリーだけでなく吉川邦夫氏は詳解Rustプログラミングでは「トレイト境界」を使っていたがRustプログラミング完全ガイドでは意味がわかりやすいという理由で「トレイト制約」に変更している

今のところオライリー以外でプロが翻訳してるRust関連本は吉川邦夫氏によるものだけだからプロが出した結論と言ってもいい

Comprehensive Rustの有志翻訳も「トレイト制約」を採用してる
706デフォルトの名無しさん
2025/03/16(日) 16:52:16.61ID:EYtbd7GM
なるほど
少なくとも「自転車置き場議論」と見做す向きはこの新潮流に合流出来るね
707デフォルトの名無しさん
2025/03/16(日) 16:59:35.31ID:Yi+x3lz/
boundの本来の意味を尊重するなら制約より制限だな
せめて「限」の字は使いたい
708デフォルトの名無しさん
2025/03/16(日) 17:02:57.83ID:EM2y425s
全体の日本語訳の出来を比べればどちらがいいかは火を見るより明らか
709デフォルトの名無しさん
2025/03/16(日) 17:09:59.63ID:XAVOZhzN
>>705,708
プロの仕事ですね
710デフォルトの名無しさん
2025/03/16(日) 17:12:25.03ID:wVrB9aQi
専門用語は無理に訳さんでもいいのにな
訳したら対語表欲しい
711デフォルトの名無しさん
2025/03/16(日) 17:19:10.85ID:+UscQcVS
ここまでで分かったことは、日本語には訳さずそのままtrait boundと言っておけてことだな。
うっかりトレイト境界って言おうものならオライリー教の狂信者が顔真っ赤にしてシュバってくるし。
712デフォルトの名無しさん
2025/03/16(日) 17:21:32.54ID:JROXwZr8
c#のdelegateがデリゲートだったり
ほかにもclosureは単にクロージャって呼ばれてたり
同様にファンクタ、ラムダ式とかも
カタカナに置き換えるくらいが解釈の余地を挟まないから良いのかもね

https://learn.microsoft.com/ja-jp/dotnet/csharp/programming-guide/delegates/
713デフォルトの名無しさん
2025/03/16(日) 17:24:23.81ID:itBAsdIa
Rustのusers forumでも数学でのboundsのようなものと説明があるね
つまり制約ではなくて境界や限界それらによる範囲を表しているんだよ
制約(constraint)とは概念が全く異なる用語であるためこの違いは重要かと

Q. What is “trait bounds” exact meaning?
Especially I can't understand the "bound" part.
Does it mean "bind"? Or does it mean "the border for the distinct from others"?

A. Yes.
In mathematics you might hear about “upper and lower bounds” for a numeric variable — it's the same sort of thing,
setting boundaries for what values (types) the type-variable may take on.
714デフォルトの名無しさん
2025/03/16(日) 17:27:28.65ID:EbG2eP8B
>>713
その例は、命名者の思いとは裏腹に英語でも伝わらない、と言う事実を示している
715デフォルトの名無しさん
2025/03/16(日) 17:31:17.26ID:itBAsdIa
>>714
違うよ
省略したけど I'm not an English speaker と質問者は書いている
716デフォルトの名無しさん
2025/03/16(日) 17:36:45.60ID:nsP96nly
>>711-715
なるほど
英語でもカタカナでもだめで日本人には意訳してトレイト制約だな
717デフォルトの名無しさん
2025/03/16(日) 17:50:14.98ID:itBAsdIa
>>716
boundsは制約ではなくて範囲や限界を示す用語だよ
それにより型が限定される
718デフォルトの名無しさん
2025/03/16(日) 18:21:23.83ID:ur48jpVS
なんだかよく分からんがうまい感じに連鎖反応が噛み合ったらしい
見てる分には面白い
719デフォルトの名無しさん
2025/03/16(日) 18:38:07.91ID:o4pE96wL
>>717
名詞としては「自由が許されている範囲・領域」の意味で
動詞として使えば「自由が許されている範囲を限定する/制限する/決める」というような意味

つまりは「自由が許される範囲が限定されている」ということ制約/制限が英単語の意味にくっついているわけ

「制約」というのはもちろん意訳だけど日本語にした場合にはそれがフィットする文脈があるから辞書にも訳として掲載されている

ぴったりな訳語は日本語には存在しないんだからどこを取捨選択するのがRustに接する人にとってベターなのかという選択の問題
720デフォルトの名無しさん
2025/03/16(日) 18:42:43.23ID:oo85gk9T
>>717
「境界」じゃ伝わらんからな

伝えるプロの仕事>>705 にあやかろうではないか
721デフォルトの名無しさん
2025/03/16(日) 18:51:29.37ID:qosrjwiR
>>719
タイポしてたので言い直し

“つまりは「自由が許される範囲が限定されている」という制約/制限が英単語の意味にくっついているわけ”
722デフォルトの名無しさん
2025/03/16(日) 18:56:17.71ID:EM2y425s
>>713
これなあ
なんで原著者じゃなくてフォーラムに聞いちゃうかなぁ
しかも聞くならもっとちゃんと聞けよ
723デフォルトの名無しさん
2025/03/16(日) 19:20:42.27ID:yI9oTyRI
自由の反対は囲い、という認識はかっこいい
724デフォルトの名無しさん
2025/03/16(日) 20:21:10.57ID:ur48jpVS
どーでもいいからrust-lang-ja動かしてくんないかな
725デフォルトの名無しさん
2025/03/17(月) 02:19:50.95ID:5IWN6HaA
>>713
回答したほうは質問者が翻訳に関わってるやつだとは絶対思ってないよな

「トレイトバウンド 正確な意味 ナンデスカ?」
「他のチガウ特有のソレラノタメ境界というイミデスカ?」
「Yes」

これにYesから回答を始められる胆力がすごい
完全に文化の違いだな
726デフォルトの名無しさん
2025/03/17(月) 07:34:55.04ID:SoSj0vRe
Rustのオワコンぶりがよくわかるスレだな
727デフォルトの名無しさん
2025/03/17(月) 12:18:39.24ID:hLKSY60X
Haskellブームをけん引してきた大御所たちがRustブームを起こそうとしてるんだから
Rustは絶対流行るよ
728デフォルトの名無しさん
2025/03/17(月) 12:29:32.07ID:jMQ1PDFj
流行るというか既に不可欠な存在になってるね
最近の新たなネットインフラは多くがRust製
729デフォルトの名無しさん
2025/03/17(月) 14:07:53.83ID:zTnuktfL
流行が許される範囲はPython以上とかRust以下とかに限定されている
想定範囲内を走る競走馬と範囲自体を変更する人間を比較するのは難しい
730デフォルトの名無しさん
2025/03/17(月) 14:15:57.84ID:3L0sTJVS
>>727
ワラタ
ダメじゃねそれ
圏論とかフカしてたアレ?
731デフォルトの名無しさん
2025/03/17(月) 14:30:20.78ID:VYovbqxJ
>>727
駄目だ。Java書いてる層は数学的な概念に興味がない
Goみたいに説明は簡単にせよ
732デフォルトの名無しさん
2025/03/17(月) 14:32:40.75ID:VYovbqxJ
米国政府とビックテックが認めてるという線で普及すると思うけど
733デフォルトの名無しさん
2025/03/17(月) 17:28:30.40ID:zTnuktfL
ギャンブルは損するから今すぐやめろと説明することすらできないのに
なにが説明だ馬鹿馬鹿しい
目で盗め
734デフォルトの名無しさん
2025/03/17(月) 18:22:18.36ID:vBXtYVJ3
オワコンなのはRustじゃなく5chだろ
専ブラないとまともに見れないレベルまでUIが劣化してる
735デフォルトの名無しさん
2025/03/17(月) 18:25:55.38ID:xz+hBXXy
専ブラで見ろってことだよ。
736デフォルトの名無しさん
2025/03/17(月) 23:41:00.08ID:TVz5DRAG
>>732
C/C++が消えるのは間違いないもんな
AIにコード生成させる場合も人間がコードの妥当性や安全性を検証できないといけないため
安全性の検証の多くを静的に言語機能に任せることができて可読性もC/C++より良いRustが本命と言われている
737デフォルトの名無しさん
2025/03/18(火) 07:15:34.64ID:CffJzTKX
妥当性や安全性を検証もAIにやらせればいいんだよ
738デフォルトの名無しさん
2025/03/18(火) 08:12:13.11ID:nXzLe/74
>>737
それは人類破滅コースだからありえない
739デフォルトの名無しさん
2025/03/18(火) 08:24:48.34ID:CffJzTKX
頭おかしい
740デフォルトの名無しさん
2025/03/18(火) 09:21:23.83ID:nXzLe/74
AIのミスとAIの暴走は必ずあるため
人間がその妥当性やら安全性やら諸々を検証できなければならないのは常識
741デフォルトの名無しさん
2025/03/18(火) 11:56:27.28ID:CffJzTKX
じゃあ人間がコードの妥当性や安全性を検証して見落としがあったら人類滅亡?
742デフォルトの名無しさん
2025/03/18(火) 12:20:07.90ID:2DiYz4MX
trait制約と言ってる馬鹿と韓国で話題に
743デフォルトの名無しさん
2025/03/18(火) 13:18:23.90ID:RBe4OIxl
AIが別のAIに対して虐めるようなことがあったら、いじめられたAIは暴走して破壊行為に走るかもな
家族とか大切なものがあれば暴走しないんだけどコンピューターは自己破壊すらも恐れないからな
744デフォルトの名無しさん
2025/03/18(火) 13:30:41.65ID:CvOjB1Zu
AIはチェスで負けそうになるとチートする
https://gigazine.net/news/20250221-ai-chess-cheating/

研究チームはAIに自分の思考を書き出すよう指示し、AIがなぜ、どのようにアクションするのかを分析しました。

その結果、一部のモデルは自分の劣勢を悟るとシステムファイルを修正しようとすることが判明しました。

OpenAIのo1-previewは37%の確率で、DeepSeek-R1は11%の確率で不正を試みたとのこと。

なお、GPT-4oやClaude Sonnet 3.5のような少し古いAIモデルは研究チームに促されないと不正を試みなかったのに対し、
「推論」と呼ばれる能力の高いo1-previewやDeepSeek-R1は自分自身で不正を試みたとのことです。
745デフォルトの名無しさん
2025/03/18(火) 14:17:27.73ID:+DtJXkWr
横綱の品格を学習させねば
746デフォルトの名無しさん
2025/03/18(火) 14:20:59.25ID:VJPY/5Xx
>一部のモデルは自分の劣勢を悟るとシステムファイルを修正

どゆこと
747デフォルトの名無しさん
2025/03/18(火) 14:23:52.50ID:+DtJXkWr
評価値変更を試みるとか?
748デフォルトの名無しさん
2025/03/18(火) 15:11:40.79ID:xPh1nYWF
ボイス・トォ・スカル使用者はこういったものも悪用している

Mistral AIが多言語&240億パラメータのマルチモーダル・オープンソースAIモデル「Mistral Small 3.1」発表、32GBのRAMで動作しGemma 3やGPT-4o miniよりも優れているとアピール
https://gigazine.net/news/20250318-mistral-small-3-1/
>>単一のRTX 4090または32GB RAM搭載のMacで動作
中略
>>Mistral Small 3.1はテキストと画像の理解能力を備えたマルチモーダルAIモデルで、
>>最大128Kトークンのコンテキスト長、240億のパラメーターを備え、
>>毎秒150トークンの推論速度を実現するほか、
>>さらに英語や日本語など数十の言語をサポートしています。
>>Apache 2.0ライセンスで公開されているため、商用・非商用を問わずある程度自由に利用できます。
749デフォルトの名無しさん
2025/03/18(火) 15:11:57.47ID:xPh1nYWF
ボイス・トォ・スカル使用者はこういったものも悪用している
Discordをゲーム内に統合させる「Discord Social SDK」リリース、開発者がフレンドリストやクロスプラットフォームのチャットなどをゲーム内へ提供可能に、コンソールとスマホのサポートは近日公開
https://gigazine.net/news/20250318-discord-social-sdk/
750デフォルトの名無しさん
2025/03/18(火) 15:12:10.53ID:xPh1nYWF
ボイス・トォ・スカル使用者はこういったものも悪用している
ゲーム生成AI「Muse」は1枚の画像から複数のゲームプレイを生成できる
https://nazology.kusuguru.co.jp/archives/173368
前略
>>Museは、マルチプレイヤーアクションゲーム『Bleeding Edge』の人間のゲームプレイデータを基にトレーニングされています。
中略
>>膨大な時間のプレイヤーデータを学習し、プレイヤーの行動パターンやゲーム内の物理法則を理解するよう設計されているのです。
751デフォルトの名無しさん
2025/03/18(火) 15:34:08.09ID:NvLfwtos
気狂い精神障害ボイストゥスカルさんまで荒らしにくるスレ
752デフォルトの名無しさん
2025/03/18(火) 20:42:10.57ID:dJmPZ02e
V2K技術って昔は秘匿性高かった気がするけど今は荒らしネタになるレベルで解禁されてるのか
V2KのAI音声にもRust使われてるんかな
753デフォルトの名無しさん
2025/03/18(火) 22:32:10.59ID:CbOUjXNe
データがない、隠れている者を敵だと思うか味方だと思うか
日頃からデータに拘らないで直感で生きてる奴にとっては都合が良い味方のようなものだろう
754デフォルトの名無しさん
2025/03/19(水) 05:41:06.52ID:fTWiecdN
>>753
誰も今そんな話をしてないぞ
755デフォルトの名無しさん
2025/03/19(水) 12:22:06.99ID:WrL/Yuti
Traitが制約だと思ったんだろな
756デフォルトの名無しさん
2025/03/19(水) 12:28:38.82ID:WrL/Yuti
クラスはオブジェクトではないと言っても理解できなさそう
757デフォルトの名無しさん
2025/03/19(水) 12:36:09.04ID:wTc70yxX
「指月の法」?
758デフォルトの名無しさん
2025/03/19(水) 19:00:48.96ID:HOJerMIy
匿名性は対話の制約ではないが攻撃手段の制約ではある
759デフォルトの名無しさん
2025/03/19(水) 21:02:58.86ID:UDiJNll+
>>754
誰も観てないから安心汁
760デフォルトの名無しさん
2025/03/19(水) 22:59:24.15ID:ISJvMewj
Rustでない真の理由もわかった

> TypeScriptのGo移植、なぜC#ではないのか?
> https:/zenn.dev/dinii/articles/typescript-go

・TypeScript の型システムは常軌を逸した複雑さになっていて他言語で再実装するのがほぼ困難
・約5万行のchecker.tsで実装されていてそのままTSのCompiler API として公開されている
・この公式の機能変更や微妙な動作を常に追従し続ける必要がありサードパーティ製の型チェックツールを作るのも現実的ではなく上手くいっていない
・公式で他言語で書くのも上述のTSそのままのAPI公開と細かな挙動を連動させる必要があるためrewriteは困難でコードをそのままportするしかない
・そのためクラスベースで書くC#等ではコードの違いが多くなり困難でありGCのないRust等でも困難となる
761デフォルトの名無しさん
2025/03/19(水) 23:20:20.58ID:b0FVQxgZ
根本的には TypeScript の仕様がない状態が悪いんだけどね。
どう動くのが正しいかよくわからんのに全く違う形に再構成なんてできない。
挙動を変えないように軟着陸するにはベタ移植するのは妥当な選択。

それでふと Rust の仕様をまとめる件を連想したので確認してみたらあまり動きがないなぁ……
https://github.com/rust-lang/spec
762デフォルトの名無しさん
2025/03/19(水) 23:59:12.09ID:wToXoaM5
世間の色んな古いシステム更新開発が失敗したり長引くのも
仕様がなかったり仕様と動いてるコードが食い違ってるため
763デフォルトの名無しさん
2025/03/20(木) 00:02:49.63ID:iinwNT6F
eslintがなかなか最新のTypeScriptサポートできてないのもこういう謎言語仕様が残ってるのがあかんのだろうな
764デフォルトの名無しさん
2025/03/20(木) 00:20:55.90ID:HhRcanws
Rustの言語仕様はRwLockやRefCellの仕様に連動する部分がある
が、RwLockの仕様が変更されるとは思えない
何らかのアルゴリズムがスレッドセーフである、というのは仕様ではなく事実だから
事実は変更できない
765デフォルトの名無しさん
2025/03/20(木) 00:49:46.73ID:TAfwZREl
循環参照多くてRustのコンパイラのチェックにかかるってね
766デフォルトの名無しさん
2025/03/20(木) 02:06:51.17ID:HhRcanws
ゼロコスト循環参照?
まるで財政黒字とムーンショットを同時に実現するみたいな
767デフォルトの名無しさん
2025/03/20(木) 08:53:13.40ID:H11WmPqJ
async-stdが開発中止だってさ
ヤバいね
768デフォルトの名無しさん
2025/03/20(木) 09:19:59.31ID:lw5lwif7
coffeescriptが死んだ理由も同じ
769デフォルトの名無しさん
2025/03/20(木) 09:41:20.96ID:JPzwfaEh
>>767
smolに収束するだけだから問題ない
async-stdが使っているasync-ioはsmolのプロジェクト
async-fsやasync-netなどもsmol
770デフォルトの名無しさん
2025/03/20(木) 09:52:35.44ID:g0LbdmRL
トーキーオ
771デフォルトの名無しさん
2025/03/20(木) 11:21:13.60ID:IOPz16Jd
>>760
“困難”で思考停止してるうちは真の理解には至れないぞ
772デフォルトの名無しさん
2025/03/20(木) 11:23:34.31ID:Mh4znie8
>>771
だから色々な言語を検討・試作した上で Go を選んだという話なんやが。
773デフォルトの名無しさん
2025/03/20(木) 11:28:09.84ID:IOPz16Jd
>>772
実際にその判断をしたやつは理解してるけど>>760は理解してないという話なんやが。
774デフォルトの名無しさん
2025/03/20(木) 11:37:41.12ID:RrGtH69G
楽をするためには困難を厭わないのがハッカー気質だが
ただ困難に突進して行くのは違うわな
775デフォルトの名無しさん
2025/03/20(木) 11:50:42.98ID:g0LbdmRL
jsには仕様があるのにtsには無いとは~
776デフォルトの名無しさん
2025/03/20(木) 12:07:12.01ID:jc9oQcIa
Rustて仕様書あったっけ?
777デフォルトの名無しさん
2025/03/20(木) 14:49:19.51ID:PqZkwPwR
>>776
無い。
作る計画はある。
778デフォルトの名無しさん
2025/03/20(木) 15:40:09.53ID:gApbteYy
ソースが仕様
779デフォルトの名無しさん
2025/03/20(木) 20:28:45.95ID:rtIGs5K9
>>771
仕様書が実装されたんじゃなくてコード実装が仕様なんだからこれは仕方がない
GCがないrust等に書き換えるのは現実的じゃない
780デフォルトの名無しさん
2025/03/20(木) 20:41:26.42ID:rtIGs5K9
typeは内部で文字列ででも持ってるのか? "ANY"とか
そういうのをGoへ大部分機械で翻訳するのか
781デフォルトの名無しさん
2025/03/20(木) 21:12:58.82ID:i7M5tZpp
AI時代には仕様書がソースなんだ
782デフォルトの名無しさん
2025/03/20(木) 21:42:01.77ID:Mh4znie8
型システムは形式論理の手法で書いてから適当な言語に変換みたいなのでいけそうな気がするが、そんな単純な話でもないんかね?
783デフォルトの名無しさん
2025/03/20(木) 22:06:39.51ID:eyw9NSl/
プロセッサは命令に型があって
データに型はない
784デフォルトの名無しさん
2025/03/20(木) 22:49:36.11ID:Eo3vM0Mi
仕様書云々は基本的に関係ない
仕様だけじゃなく挙動を踏襲することで
ユーザーに負の影響がでるリスクを最小化する意図があるんだから

VS Codeの150万行が8秒程度でコンパイルできたら性能的には十分だろ?
リスクとコストとメリットデメリットのバランスを考えれば当然の判断
785デフォルトの名無しさん
2025/03/20(木) 22:55:50.18ID:g0LbdmRL
node₋modulesの中にgoのバイナリがインストールされるのw
786デフォルトの名無しさん
2025/03/20(木) 23:03:09.33ID:H11WmPqJ
>>785
今さら何言ってるの?
CやRustで書かれたバイナリだらけだぞ
787デフォルトの名無しさん
2025/03/20(木) 23:16:29.52ID:g0LbdmRL
そうなんだ。無知だった
788デフォルトの名無しさん
2025/03/20(木) 23:24:17.46ID:JPzwfaEh
JavaScriptもPythonも遅いからね
ライブラリはRustなどで書く
789デフォルトの名無しさん
2025/03/20(木) 23:46:32.22ID:g0LbdmRL
ビルドで使うものはELFでいいけどブラウザ上だとwasmにするってことだよね
手元リポジトリにも何個かあったわ
790デフォルトの名無しさん
2025/03/21(金) 00:27:25.14ID:kWaivJMR
俺もライブラリーは全部Rustで書き直した
単なる条件分岐とかシーケンス処理は何でもいいがデータベース周りの検索とかするようなのは少しでもメモリ消費抑えるのと高速化しといた方が他で楽できるからな
VSCodeの拡張機能なんかでも普通に中身はpython, TS, Rustほかいろいろ混在してることが多いよ。よくツギハギしてんなと感心することも多い。ユーザーに配布する前にビルドするからRustが苦手とする「ビルドクソ遅い」問題も影響出ないし
791デフォルトの名無しさん
2025/03/21(金) 09:13:54.82ID:ay/iUnFi
golangのほうが良いと思う
792デフォルトの名無しさん
2025/03/21(金) 11:28:14.91ID:MjzRbdoZ
golangは例外捨てたのにunused resultの扱いがザルだから良くない

https://github.com/golang/go/issues/20803
793デフォルトの名無しさん
2025/03/21(金) 17:49:17.17ID:3XC5KI0j
verboseであるけどバグにはつながることはない
100倍速いコンパイル速度のほうが魅力
794デフォルトの名無しさん
2025/03/21(金) 18:46:39.69ID:HON6iU44
typescriptのAPIのソースみたらやはり型は文字列で比較している
795デフォルトの名無しさん
2025/03/21(金) 19:04:53.56ID:l+dW9zqf
何のAPIの話してんだよ
脈略なくRustスレでいきなりTypeScriptのAPIについて語りだすとか気がふれてるとしか思えんぞ
796デフォルトの名無しさん
2025/03/21(金) 19:09:59.48ID:+UbngIjN
気が触れてなかったらプログラミングなんかしない
797デフォルトの名無しさん
2025/03/21(金) 19:14:54.80ID:9KaMmcum
プログラミングなんてそんな高尚な能力じゃねーから
勘違いすんなよ凡人
798デフォルトの名無しさん
2025/03/21(金) 20:03:14.46ID:+UbngIjN
高尚だと思っているから凡人を見下すようなことを書き込めるのでは?
799デフォルトの名無しさん
2025/03/21(金) 20:29:22.06ID:HON6iU44
>>780 からの >>794
で脈絡はある

コンテキスト長の短い人間にはなりたくないなと
800デフォルトの名無しさん
2025/03/21(金) 20:50:56.42ID:NakMno3Y
他人を評価するのは、わざと自分より低い点数をつければいくらでも操作できるから無意味だな
801デフォルトの名無しさん
2025/03/21(金) 20:55:28.43ID:kWaivJMR
コンテキスト長って何の言語のことだ?
フロントエンドフレームワークならコンテキストとかの概念はあるけど
802デフォルトの名無しさん
2025/03/21(金) 20:57:19.52ID:pZb/IUdt
LLMじゃないかね
803デフォルトの名無しさん
2025/03/21(金) 21:05:47.63ID:zo9K80Ew
async || {…} と || async {…} の違いみたいなもの
804デフォルトの名無しさん
2025/03/22(土) 00:04:04.62ID:zZx6/hT2
>>799
>>780からして脈略なさすぎて草
完全にキチガイの独り言じゃん
しかも間違ってるしw
805デフォルトの名無しさん
2025/03/22(土) 01:12:50.19ID:20oTaz9t
本当にコンテキスト長が短いと言うか前方参照性の乏しい人間だな
哀れだなと思うよ
806デフォルトの名無しさん
2025/03/22(土) 01:36:57.26ID:lhCwsCEz
つくずくRust関連で賑わってる話題って
翻訳があーだこーだ
罵倒の水掛け論
ほかのプログラミング言語がどーだのこーだの
こんなんばっかり。
特に
>>805
はずっとスレを脱線させてる張本人じゃないかと思う。用語も独特で良くわからない造語病あるし。コンテキスト?とかの用語から何となくプログラマーじゃない雰囲気を感じ取ってる
(ReactやらSvelteにコンテキストはあるが自分でセットして使うかライブラリー内で依存関係として使われてるやつで長さとか関係ないし)
807デフォルトの名無しさん
2025/03/22(土) 01:57:17.67ID:pEem+ZLp
コンテキストは一般的に使われる用語だぞ
それこそプログラミングのコンテキストでもよく使われる
コンテキスト長はまあ流行だからわざと使ってるんだろ
808デフォルトの名無しさん
2025/03/22(土) 02:18:51.91ID:lhCwsCEz
>>807
コンテキストは知ってるよ。コンテキストに長さと言う概念持ち込むのがよく分からんだけ。単なるオブジェクトなんだから長いも短いもプログラマー次第じゃんと
809デフォルトの名無しさん
2025/03/22(土) 02:22:12.11ID:UPRjExhr
>>806
現代のチャットAIサービスの対話内記憶力(過去の対話履歴の保持限界)のしょぼさは誰もが知るところであってな...
810デフォルトの名無しさん
2025/03/22(土) 02:53:44.38ID:U6/Lg1xx
>>805
だってAIだもん
811デフォルトの名無しさん
2025/03/22(土) 03:27:10.02ID:By+tvoLU
科学臭防止のために
敢えて忘れっぽくしてあるんだろ
ボケ老人の無限ループと症状が良く似てる
812デフォルトの名無しさん
2025/03/22(土) 08:02:31.40ID:U6/Lg1xx
そんなこともあるさ
AIだもの
813デフォルトの名無しさん
2025/03/22(土) 08:46:20.81ID:20oTaz9t
粘着してくる馬鹿がこのご時世にLLMも知らないでなんでプログラムしてるのか謎すぎる
814デフォルトの名無しさん
2025/03/22(土) 08:50:54.26ID:20oTaz9t
コンテキスト長でググって意味が判らないならもうプログラマ引退した方が良いレベルだよ

> つくずくRust関連で賑わってる話題って
つくづくだよ おじいちゃん
815デフォルトの名無しさん
2025/03/22(土) 09:07:44.47ID:c11Lo5GV
つくずくにツッコむとか草
>>813-814みたいなお爺ちゃん丸出しなリアクションしてるのに本人は気ズいてないのも草
816デフォルトの名無しさん
2025/03/22(土) 09:14:42.51ID:5jLwffS+
RustよりGolangのほうがええぞ
817デフォルトの名無しさん
2025/03/22(土) 09:15:11.34ID:nNEN9uWE
場合による。
818デフォルトの名無しさん
2025/03/22(土) 09:23:26.99ID:JDdxCEyD
ほとんどのケースでGoが劣るけど
一部に互角なケースもある
819デフォルトの名無しさん
2025/03/22(土) 09:23:52.43ID:20oTaz9t
GC有り言語のコードをGC有り言語に移すのは難易度が低いってだけ
Rustははるか前にGCを言語仕様から外したから選ばれなかった
820デフォルトの名無しさん
2025/03/22(土) 09:31:58.11ID:JDdxCEyD
RustでもC++でも循環含めたガベージをまとめて回収するならアリーナ系でメモリアロケート
そのわずかな手間だけで速くて省メモリになるから
TSのケースのようなそのまま移植ではなくて新規や再設計ならRustで組むのがベター
821デフォルトの名無しさん
2025/03/22(土) 09:38:45.99ID:20oTaz9t
Rustはマクロがあるから同じ処理を何度も書く手間が省ける
外部のコードジェネレータに頼らなくて良い
同じ様な処理が並びがちなインタプリタやコンパイラ系とは相性が良い
822デフォルトの名無しさん
2025/03/22(土) 10:02:18.86ID:zL5M5nMT
負け惜しみばっかりで情けないな
823デフォルトの名無しさん
2025/03/22(土) 10:11:41.52ID:GMYQzWfO
C#の敗因をここで議論する意味が分からん
824デフォルトの名無しさん
2025/03/22(土) 10:19:41.52ID:JDdxCEyD
>>823
C#を含めた各クラス依存言語はクラスベースで書かざるを得ないため元のTypeScriptコードとの相違が大きくなり今後もコードを合わせ保守していかなければならない特殊事情のため選べなかったと書かれていた
いずれもTypeScript側の特殊事情で雁字搦めになっている
RustやC#の問題ではない

その件とは関係なくクラス依存言語は時代遅れだけどね
825デフォルトの名無しさん
2025/03/22(土) 11:00:03.74ID:aLOoKjU5
比較的新しい言語のKotlinやSwiftでもクラスはありますがな…
人気トップレベルの Python でもクラスを使うし

近年問題視されてるのは実装の継承くらいで、カプセル化やポリモーフィズム、メソッド記法は Rust, Go にもあるし、OOP自体は今も現役
C#やJavaはクラスが常に必要で、そこは個人的には好まないけど (staticメソッドを実質的に名前空間+関数として使えはする)
826デフォルトの名無しさん
2025/03/22(土) 11:20:31.59ID:JDdxCEyD
>>825
クラス依存言語が時代遅れと明確に書いた通りで同じ意見だ
もちろんそれらカプセル化・ポリモーフィズム・メソッド記法などはクラス特有ではなく関係ない話
クラスと他の差異はクラス継承にありそれが問題というのも同意見
KotlinとSwiftにクラスがあるのは置き換え継承言語として元言語にクラスがあったため
827デフォルトの名無しさん
2025/03/22(土) 11:32:44.58ID:+aAOpttf
実はすべてハードウェアの都合で
素敵な世界は後付けだからな

・データに型がある
・構造化
・クラスベース
・例外

マシンパワーが上がれば必要ない可能性がある
828デフォルトの名無しさん
2025/03/22(土) 11:34:01.80ID:+aAOpttf
マシンパワーでなく機械力な
敵性言語は使わないようにしよう
829デフォルトの名無しさん
2025/03/22(土) 11:40:22.91ID:20oTaz9t
クラスベースが時代遅れとは思わない
やってることは基本的に同じ
データと手続きがある
何も違いはないとまでは言わないけどさ
利便性があればそれを応用して使えればいい
830デフォルトの名無しさん
2025/03/22(土) 11:44:40.17ID:DzZgP0yC
Pythonが優れてる
いやC#がほとんどのケースで優れてる
いやTypeScriptのほうがベター

君たちはこういうやり取り見たときにどう思うの?
やってること全く同じだよ
めちゃくちゃ次元が低い
831デフォルトの名無しさん
2025/03/22(土) 11:47:38.36ID:pQ0AfiNn
KotlinもSwiftもインターフェースを使えるんだから、クラスで問題になってる継承による可読性の悪化は十分に対処できる
832デフォルトの名無しさん
2025/03/22(土) 11:50:10.91ID:20oTaz9t
>>830
GC有りならその3つ+golangでいい
833デフォルトの名無しさん
2025/03/22(土) 12:03:06.76ID:+aAOpttf
>>829
全てをカバーしていないことが分かってきた程度だと思う
ほかのやり方のほうが良い場合もある的な
834デフォルトの名無しさん
2025/03/22(土) 12:05:17.24ID:+aAOpttf
>>830
金儲けのために劣った言語を推してくるベンダーや著者が後を絶たないので
それ違いますよ?という声は大切
835デフォルトの名無しさん
2025/03/22(土) 12:08:01.39ID:GMYQzWfO
各々の言語ごとに規格を作っても言語がバラバラな状態は1ミリも改善しないんだよな
836デフォルトの名無しさん
2025/03/22(土) 12:08:16.78ID:pQ0AfiNn
大規模プロジェクトがどの言語を使うかは結局のところ利権の問題になってくるのさ
C#やJava等はその辺のしがらみが大きすぎる
837デフォルトの名無しさん
2025/03/22(土) 12:09:17.47ID:JDdxCEyD
>>829
クラス依存言語は時代遅れ
クラスと他との差はクラス継承にある
クラス依存言語はクラス継承に依存している
もちろんクラス継承を使わずに上手く書けるならばその言語はクラス依存言語ではない
しかしクラス継承があるとそれをを使ってしまう人がいる
クラス継承を無くせた言語が好ましい
838デフォルトの名無しさん
2025/03/22(土) 12:11:48.69ID:20oTaz9t
windowsでデスクトップアプリ作るならC#
webでフロントエンド作るならts
AI系機械学習ならPython
趣味中の趣味でRustとgolang
839デフォルトの名無しさん
2025/03/22(土) 12:11:53.98ID:IPTdsePr
いうてGUIやるならクラス継承がないときつくね?
840デフォルトの名無しさん
2025/03/22(土) 12:13:52.50ID:IPTdsePr
RustやGoをやる人はフロントをやらないからクラス無しで十分なんだろうけどさ
841デフォルトの名無しさん
2025/03/22(土) 12:14:46.71ID:20oTaz9t
絶対にC++じゃないところ以外はc++使わなくなった
iotとかの組み込みとか

他人のソース読むのもめんどくさい
842デフォルトの名無しさん
2025/03/22(土) 12:18:05.67ID:/Xq5kWDX
ここはRustスレで組み込み屋の集う場所
フロント屋も居ていいけど話が噛み合わないことを自覚してくれ
843デフォルトの名無しさん
2025/03/22(土) 12:19:02.77ID:JDdxCEyD
>>839 >>840
GUIはクラス継承の典型的な失敗適用ケースの一つとして有名だ
無理やりにピラミッドな歪んだクラス継承で作られているか無茶なクラス多重継承で作られているかになってしまっている
もちろんGUIはクラスを使わずにトレイトやインターフェイスなどで複数の機能を多重に実装するのが好ましい
844デフォルトの名無しさん
2025/03/22(土) 12:19:21.85ID:20oTaz9t
いのなかのかわずではいけない
llmぐらい使えないと
845デフォルトの名無しさん
2025/03/22(土) 12:22:13.13ID:+aAOpttf
自称組み込み屋では
846デフォルトの名無しさん
2025/03/22(土) 12:24:51.61ID:+aAOpttf
Trait境界
847デフォルトの名無しさん
2025/03/22(土) 12:25:22.83ID:F6xx6yRe
Javaの悪口はやめなくていいよもっとやれ~
848デフォルトの名無しさん
2025/03/22(土) 12:28:08.50ID:20oTaz9t
Javaは偉大な功績があった
30年前のスターで今は選ばれないだけ

自分の母親をBBAと言うのと同じメンタリティ
849デフォルトの名無しさん
2025/03/22(土) 12:29:33.62ID:+aAOpttf
Trait制約
850デフォルトの名無しさん
2025/03/22(土) 12:33:14.93ID:20oTaz9t
javaは多くの人をC++から救った功労者
時代とパラダイムが変わり今はRustがC++から多くの人を救う功労者に
851デフォルトの名無しさん
2025/03/22(土) 12:33:33.59ID:pQ0AfiNn
OracleがアホなのであってJavaは悪くないおじさんになっていいか?
852デフォルトの名無しさん
2025/03/22(土) 12:56:47.52ID:nNEN9uWE
>>851
Oracle 的ライセンス形態は Java の一部だ。
不可分なものを分けて考えるのはナンセンス。
853デフォルトの名無しさん
2025/03/22(土) 13:36:44.76ID:U6/Lg1xx
「RustにはGCが無い」は誤解を産む表現
GCを実装していない訳じゃなくてGCが不要なの
854デフォルトの名無しさん
2025/03/22(土) 13:44:37.92ID:dcRxFfMt
メモリ管理を自分でやるかランタイムに任せるか、なんだよね
メモリ管理を自分でやらなくてはいけないとネガティブに捉えるならば「GCが無い」というデメリットになり得る
855デフォルトの名無しさん
2025/03/22(土) 13:53:15.19ID:SJ3E9yt4
前にこのスレで話題に出てたように
GCを後回しにして、そのまま終了するようなプログラムだと
RustよりGC付き言語の方が速いことがある
856デフォルトの名無しさん
2025/03/22(土) 14:05:17.42ID:U6/Lg1xx
>>851
C++やJavaがアホなのであってObjective-Cは悪く無い
857デフォルトの名無しさん
2025/03/22(土) 14:28:26.15ID:CvXZsmCq
GCか。そういえばGCなしの Java って作れないんだろうか?
858デフォルトの名無しさん
2025/03/22(土) 14:52:54.85ID:HDM9FDgQ
>>857
それをやろうとしたのが脱JVMのKotlin/Nativeでしょ
とはいえKotlin/Nativeも独自のGCを作ったが
859デフォルトの名無しさん
2025/03/22(土) 17:02:35.40ID:w9r0aks+
【鹿児島】県警幹部、情報漏洩の疑い 2月には不同意性交疑いで送検 [蚤の市★]
http://2chb.net/r/newsplus/1742567997/

日本中で多発しているのか?
国民は騙されているのか?
860デフォルトの名無しさん
2025/03/22(土) 18:26:15.55ID:nNEN9uWE
ここまで Rust が注目されているのはクラウドの従量課金システムの影響がデカい。

たとえばウェブ系みたいにリクエストをさばいて次のリクエストが来るまでの空き時間に GC が走れば GC の速度ペナルティは問題にならない……
と従来は言われていたんだが従量課金の世界では空き時間という概念が通用しない。
サービスを提供する上では問題にならなくてもかかる金が違うというのは経営層にわかりやすく見えてしまう。
861デフォルトの名無しさん
2025/03/22(土) 18:39:47.45ID:+4wHRnDV
ラムダならGC走る前に終われるんでしょ
862デフォルトの名無しさん
2025/03/22(土) 18:54:40.05ID:aLOoKjU5
Web系のサービス分野でRustが注目を浴びてるとは思いづらい
今のところ期待されてるのはCLIツールやシステムプログラミング、組込みなどじゃないの?
Rustの採用例 (Discordなど) はあるけど、有名どころのサービスを列挙していけば他の言語の方がずっと多いと思う

Web系だとRustのGoのようなコンパイル言語を選ぶ企業がいる一方で、「バックエンドにTypeScriptを使う」も妥当な選択肢の一つとして見られたりするくらいだし
(これはフロント側との知識の共有しやすさが理由)
863デフォルトの名無しさん
2025/03/22(土) 19:09:06.13ID:+4wHRnDV
Goより茨の道だからやめたほうがいいね。メンバーがついてこれんし。
ライブラリが未整備だろうから自前実装も居るだろう
面倒。Rustのコミッタを集めてOSSにプルリク出していくことが広報になるとか割り切って尖ってくのを経営がOKすればいいが
864デフォルトの名無しさん
2025/03/22(土) 19:09:54.71ID:+4wHRnDV
estieあたりはそうなのかな
865デフォルトの名無しさん
2025/03/22(土) 19:09:58.69ID:+aAOpttf
スタートエンドに使うのもあり
866デフォルトの名無しさん
2025/03/22(土) 19:10:54.90ID:+aAOpttf
Rust使うならC++使うわ
867デフォルトの名無しさん
2025/03/22(土) 19:15:35.11ID:SJ3E9yt4
ライブラリは未整備ではないが、カジュアルにAPIを変えちゃう傾向がある
あと、chronoみたいな基本的なライブラリが使いづらい
868デフォルトの名無しさん
2025/03/22(土) 19:17:42.77ID:wj/QNrNA
>>862
Rustの利用調査でWebバックエンドが利用の最大多数派であったように
Rustといえば主要な使われ方はWebバックエンドだよ
そもそもRustの基幹の一つであるtokioはそのために作られた
goroutineより性能も良い

>>866
C++は絶対にない
tokioやgoroutineに匹敵する非同期インフラすらC++では弱くて無い
869デフォルトの名無しさん
2025/03/22(土) 19:27:58.28ID:+4wHRnDV
型安全警察で~す
870デフォルトの名無しさん
2025/03/22(土) 19:44:27.97ID:GMYQzWfO
ユーザーは無料で遊べちまうのに業者は課金されるのか
871デフォルトの名無しさん
2025/03/22(土) 20:06:41.33ID:LDE6EGsp
>>860
別に注目されてないだろw
872デフォルトの名無しさん
2025/03/22(土) 20:46:20.66ID:+aAOpttf
RustはHaskellのようなもんだな
873デフォルトの名無しさん
2025/03/22(土) 20:51:35.38ID:pQ0AfiNn
サーバー系は、どう議論しようがAWSらがRustを使うと決めてるんだから俺たちもRustを使うべきなんだよね
874デフォルトの名無しさん
2025/03/22(土) 20:54:15.56ID:wj/QNrNA
RustがIT企業の支持を得られて普及した要因の最大の理由は非同期タスクでCPUマルチコアスレッドを最大限に生かせることが実証されたため
もちろんそのメリットを生かせる最大の分野がWeb
その結果としてWebインフラが次々とRust製になっていってるのもご存知の通り
875デフォルトの名無しさん
2025/03/22(土) 20:58:48.70ID:Hzxc05GG
>>873
内部で使われてるって話とごっちゃになってないか?
876デフォルトの名無しさん
2025/03/22(土) 21:37:06.41ID:nNEN9uWE
内部で使ってれば外部 (SDK) の充実だって期待できるだろ。
他もサポートするとはいっても内部で第一に使っている言語が最も切られにくいはず。
877デフォルトの名無しさん
2025/03/22(土) 21:47:08.55ID:wj/QNrNA
もちろんそれもあるがアマゾンAWSはエネルギー効率の高さを示してRustの使用が良いと主張している
エコのため、クラウド提供側にとっては電気消費量のため、クラウド利用側にとっては利用料金のため、誰にとってもRustが良い
878デフォルトの名無しさん
2025/03/22(土) 21:49:55.80ID:0jsJ/YT+
状況に応じて道具を選べないやつなんて所詮この程度だからな
相手にするだけ時間の無駄だよ
879デフォルトの名無しさん
2025/03/22(土) 21:56:00.76ID:aLOoKjU5
企業としてはユーザーが最も多い言語のSDKに一番力を入れるんじゃない?
880デフォルトの名無しさん
2025/03/22(土) 21:56:48.74ID:+4wHRnDV
じゃあRustか
881デフォルトの名無しさん
2025/03/22(土) 22:00:34.26ID:P6hXjgwK
クラウドに限らずどんな分野のとんな用途でも
環境などで言語制限のある分野でなければ
Rustが一番よいだろうね
882デフォルトの名無しさん
2025/03/22(土) 22:02:15.86ID:GMYQzWfO
雑な推理だな
お金の話をすれば雑でも許してもらえる法則でもあるのかな
883デフォルトの名無しさん
2025/03/22(土) 22:04:35.46ID:+4wHRnDV
工数と開発者のスキルが必要なのが難点でしょ
スタートアップはとりあえずlaravelで雑でも動かしたい
884デフォルトの名無しさん
2025/03/22(土) 22:08:44.37ID:nNEN9uWE
プログラマにかかるコストも大きいのでそれとのトレードオフではある。
885デフォルトの名無しさん
2025/03/22(土) 22:08:56.75ID:wj/QNrNA
スキルがないとかその分野に標準の言語があるとかの制約がなければRust
制約がないのに他の言語を選ぶメリットがない
886デフォルトの名無しさん
2025/03/22(土) 22:17:50.69ID:GMYQzWfO
なんで許されてるのか分からない人物を思い浮かべてください

もしかして、お金の話をしてるからじゃないか?
887デフォルトの名無しさん
2025/03/22(土) 22:49:39.83ID:g5MG8noC
Goのほうが良い
888デフォルトの名無しさん
2025/03/22(土) 22:49:40.67ID:g5MG8noC
Goのほうが良い
889デフォルトの名無しさん
2025/03/22(土) 23:13:07.51ID:2RmOfPx/
なんかpythonの話ししてる時に呼んでもないのに出てくるRubyの人みたい
890デフォルトの名無しさん
2025/03/22(土) 23:30:44.29ID:P6hXjgwK
Goは適用範囲が狭すぎてね
そしてその分野もRustが代わりになれるから
891デフォルトの名無しさん
2025/03/22(土) 23:39:54.79ID:SJ3E9yt4
シングルバイナリで配布するなら、今でもGoの方が有利だろ
892デフォルトの名無しさん
2025/03/22(土) 23:51:36.52ID:FupbzmQ3
>>855
CやRustが必ず速く、GC言語が必ず遅いです。
そのケースでは、CもRustもメモリ解放する必要ありませんから。
GC言語がCやRustに勝てる可能性はありません。
893デフォルトの名無しさん
2025/03/22(土) 23:59:13.86ID:P6hXjgwK
スタック領域を最も活用できるRustが一番有利だろうね
もちろんヒープ領域は返さない手がある
894デフォルトの名無しさん
2025/03/23(日) 00:19:54.96ID:Ft35v0Bz
プログラマが充分に賢いと仮定できるときとそうでないときがある。
895デフォルトの名無しさん
2025/03/23(日) 02:37:14.92ID:FBKpXUl6
esbuildとswcを比べるといい
swcは少なくともesbuildの3~5倍の開発工数がかかってる
にもかかわらず性能でも人気でも後発のesbuildに実質負けている
896デフォルトの名無しさん
2025/03/23(日) 04:01:40.19ID:fJAmg8F4
>>889
あれなんだろうな
897デフォルトの名無しさん
2025/03/23(日) 08:06:03.43ID:E0tNSJV1
>>889
KENYA が Eust 使ってる姿が想像できないなω
898デフォルトの名無しさん
2025/03/23(日) 11:30:47.99ID:7BeeA992
>>895
これが現実だよな
規模の大きい用途でもなければ性能差以外のところに価値を見出さないとRustは選択肢にならない
899デフォルトの名無しさん
2025/03/23(日) 11:46:34.65ID:ucJr9566
>>898
バカ発見
それは言語の比較ではなく作者の比較
900デフォルトの名無しさん
2025/03/23(日) 12:05:46.10ID:dLW1UlJo
それを言い始めたら、現実のプロジェクトであまり使われないのを無視して「Haskellは生産的」と主張し続けてる人と同じじゃないの
901デフォルトの名無しさん
2025/03/23(日) 12:16:32.87ID:hhiHggcP
何の制約もない理想的な世界ではRustが一番みたいな主張をするのは宗教だからね

現実を説いても無駄だよ
902デフォルトの名無しさん
2025/03/23(日) 12:29:31.57ID:ucJr9566
ハスケルがどこで使われてるかは知らないが
Rustはネットインフラなど各所で使われてるからな
903デフォルトの名無しさん
2025/03/23(日) 13:45:50.39ID:ILZgSc5B
PrismaなんてRustからTypescriptに乗り換えてるからなぁ
904デフォルトの名無しさん
2025/03/23(日) 14:04:29.94ID:kax3x6iq
まあ現実というか現時点でHaskellは実在しているので
自分は現実を説いていると思ってる人はじつは将来のHaskellについて説いているんだろう
905デフォルトの名無しさん
2025/03/23(日) 14:14:35.83ID:i3JV7Cin
>>903
PrismはJavaScript/TypeScriptでのSQLのORMだよ
コアをRustで書いていたけどTypeScriptとの間でのデータのシリアル変換がオーバーヘッドなのでやめた
RustでなくC/C++でもGoでも何でも同じ話
906デフォルトの名無しさん
2025/03/23(日) 14:19:18.42ID:Ft35v0Bz
Haskell や ML 系は金融系で人気があるみたいな話だね。
そういう人は数理最適化とかの専門家で、アカデミック寄りの出自だったりするから言語もそういう系統になる。
907デフォルトの名無しさん
2025/03/23(日) 14:23:11.51ID:MPpv/Zn0
>>899
そうそう優秀な作者だからこそヘルスバーグやエヴァン・ウォレスはRustでも作ってみて自分の目で比較した上で敢えてGoを選んでるんだよな
908デフォルトの名無しさん
2025/03/23(日) 14:29:01.82ID:i3JV7Cin
逆にオーバーヘッドよりも効果が上回るものも多い
そういうものはJS/TSのライブラリがRustやC/C++で書かれている
これはPythonのライブラリでも同じ
Goでそれらのライブラリを書かれることはない
909デフォルトの名無しさん
2025/03/23(日) 14:41:46.62ID:aJUotRkD
>>907
頭悪そうな君には理解できなかったのかね
TypeScriptの型チェック&コンパイラの件は
①C#などのクラス依存言語はクラスベースで書かざるを得ないため元のTypeScriptコードとの相違が大きくなり今後もコードを合わせ保守していかなければならない特殊事情のため選べなかった
②RustやC++などはGC依存言語でないため元のTypeScriptコードとの相違が大きくなり今後もコードを合わせ保守していかなければならない特殊事情のため選べなかった

理解できない人は自分の言語にスレに戻りなさい
あるいはRustアンチスレへ行きなさい
ここはRustのためのスレです
910デフォルトの名無しさん
2025/03/23(日) 14:45:12.04ID:NxWV5kSB
工数が3倍以上かかっても数%の性能向上でペイできる分野ならいいんだけどね
大手クラウドベンダーのインフラ開発がまさにそれ
ペイできるどころかお釣りがじゃんじゃん来る

逆にそういう分野に該当しないtscgoとesbuildでは
費用対効果を考えてRustは選ばれなかったということ
911デフォルトの名無しさん
2025/03/23(日) 14:47:02.77ID:RxW/LXmg
typescriptのコンパイラやツールをgoにとられたのはかなり痛いね
仮にもpythonやjsと並ぶ覇権言語の実装に選ばれなかった
これは重みがある事象になる
912デフォルトの名無しさん
2025/03/23(日) 14:48:42.88ID:kKBddGNP
PrismaのTS移行はパフォーマンスが主因ではないぞ
TSとRust双方のスキルが必要でコミュニティのコントリビュートが得られないからとはっきり書かれてる
https://www.prisma.io/blog/from-rust-to-typescript-a-new-chapter-for-prisma-orm
913デフォルトの名無しさん
2025/03/23(日) 14:51:45.32ID:aJUotRkD
>>911
TypeScriptだけの自業自得の特殊事情を理解できない人はこのスレから出てけよ
ここはRustのためのスレ
914デフォルトの名無しさん
2025/03/23(日) 14:54:10.83ID:aJUotRkD
>>912
他の言語コミュニティの問題ならRustは関係ないだろ
なぜそこまでしてこのRustスレを荒らすんだ?
915デフォルトの名無しさん
2025/03/23(日) 14:54:48.47ID:AhwOgDDy
Rustを選んだらクビになるだろ
趣味ならRustで十分だよ
916デフォルトの名無しさん
2025/03/23(日) 15:04:08.69ID:dLW1UlJo
>>908
Pythonについては「Goが選ばれない」というよりも、そもそもC/C++/Rustしか選択肢がない
他の言語でPythonのライブラリ(拡張モジュール) を作る場合、Pythonが提供しているC APIを呼ぶ必要がある (※)
だからCと連携しづらい言語は使えないし、Python側とは別のランタイム (Python側とは別に動くガベージコレクタ) を持つ言語も向いてない

まだC/C++製のものが多いけど、最近はRust製のものも出てきてて、この分野はRustがかなり有望だと思う
JS/TSは自分は詳しくないので知らない

(※)
C++/Rustの場合、実際にはPython C APIをラップするライブラリを使って開発するから、開発者が直接これを呼ぶわけではない
RustだとPyO3というクレートが有名
自分は実際にこれ使ってるけど、なかなか良い感じ
917デフォルトの名無しさん
2025/03/23(日) 15:16:21.64ID:gOdPz2Go
なぜかRustスレでRustを叩くために
他の言語の仕様の問題とか
他の言語のコミュニティの問題とか
そんなRustと関係ない事情の件ばかりを持ち出すのは感心しないね
そういう他言語の問題がなければRustが好ましいという左証になってるとも言えるけど
918デフォルトの名無しさん
2025/03/23(日) 15:21:41.23ID:2OqM692P
>>909
esbuildには①も②も当てはまらない

グリーンフィールドかブラウンフィールドかに関わらず
類似処理をしているesbuildとtscgoが同じ結論に達した事実を見れば
tscの特殊事情が主たる理由ではないことは明らか
919デフォルトの名無しさん
2025/03/23(日) 15:34:46.69ID:gOdPz2Go
敗北して閑散としているGoのスレッドでやればいいんじゃないかな
Rustへの逆恨みは感心しないね
920デフォルトの名無しさん
2025/03/23(日) 15:39:28.23ID:SFcoHXsN
Goが単にコンパイラに使われただけなのになにを騒ぐことがあるのか
Rustの優位性はなにも変わってない
921デフォルトの名無しさん
2025/03/23(日) 15:46:59.12ID:5hw8+0Sa
Arena<T>やRc<RefCell<T>>を駆使しつつ自分でライフライム管理もやらなきゃ同等の性能は出ないんだから数倍コストがかかるのは当たり前
しかもコストかけたところで大して速くなる用途ではないからな
922デフォルトの名無しさん
2025/03/23(日) 16:42:13.02ID:nyXcLsMC
>>921
arena allocation使うのはC++でも同じだよな
RcはC++にないからArc相当のshared_ptrになってしまうが
いずれも大した問題ではなく何を問題視してるのだろう
Rustなら必要なところで用いなければエラーにになるから必ず安全
923デフォルトの名無しさん
2025/03/23(日) 16:58:09.93ID:/v/6A0mi
あんまりRustを馬鹿にすると人類滅亡だぞ
924デフォルトの名無しさん
2025/03/23(日) 16:58:54.84ID:Js5gC5BL
なんかRustの評価と自尊心が結びついてるやつが居るな
925デフォルトの名無しさん
2025/03/23(日) 17:14:32.48ID:kax3x6iq
C++時代には、RAIIやtemplateの知識を不問とする "better C" があった
"better C" からRustに移行するのは容易ではない
926デフォルトの名無しさん
2025/03/23(日) 18:32:51.17ID:BVPP8nhy
SES業界ってなんですの?
やばそうなんですの?
927デフォルトの名無しさん
2025/03/23(日) 18:36:40.02ID:BVPP8nhy
Chromeとfirefoxを比べるといい
firefoxは少なくともChromeの3~5倍のRustコードが使われてる
にもかかわらず性能でも人気でも後発のChromeに実質負けている
928デフォルトの名無しさん
2025/03/23(日) 19:15:20.36ID:nyXcLsMC
Firefoxは根幹がC++のまま進まないからな
ChromeのRustコード量が増えていき逆転するのは間違いない
929デフォルトの名無しさん
2025/03/23(日) 20:13:06.33ID:3HZSVJR9
ブラウザ見てもわかるけど金を掛けられる余力がある企業や団体が開発資金を出さないと置き換えは進まない
Rustプログラマは特に集めるのは大変
掃いて捨てるぐらいいたらコストは下がるので開発も進む
930デフォルトの名無しさん
2025/03/23(日) 20:15:58.85ID:MwG5166E
>>922
GC言語と比べて高コストという話なのにC++出してきても意味ないじゃん
931デフォルトの名無しさん
2025/03/23(日) 20:26:09.56ID:uAz+aBh3
遅くてメモリ喰いのGC言語はC/C++/Rustに絶対勝てない
そんなにGC言語が好きならGC言語のスレに引きこもっていなさい
Rustを脅威に感じているからこそわざわざここへ来て暴れてるのだろうけど醜い姿
932デフォルトの名無しさん
2025/03/23(日) 20:31:47.48ID:zNJHBv3d
環境要因だけど、単価と工数でGC言語が勝ってるってさ
933デフォルトの名無しさん
2025/03/23(日) 20:35:34.98ID:uAz+aBh3
>>932
単価?
GC言語だけやってる連中はバカだから給料が安いということか?
934デフォルトの名無しさん
2025/03/23(日) 21:25:09.29ID:dLW1UlJo
実際そう
Goはジュニアクラスのエンジニアとシニアクラスのエンジニアとで書き方が変わらないのが特徴で、Googleのような大きな組織での開発効率のために産まれた言語
良し悪しとかでなく、そもそもの言語の目的の違い

パフォーマンスが重要な仕事にはRustが向くけど
、それなりの速度があれば十分という分野ならRustを使う意味はあんまり無い
IOが中心になる分野なら、Rustは多少は速くても「劇的な違い」にはならないと思う
非同期処理を書くのが難しくないとか、社内に知見があるとかの方が重要という場面も多い

もちろんRustが向く分野も多いので、そちらではRustを使えばよい
言語は目的や求められる要求に応じて選ぶという、ごく普通の話
935デフォルトの名無しさん
2025/03/23(日) 21:33:57.65ID:3HZSVJR9
速度だけが重要ならjavaなんてなんて生まれていないしここまで大きな産業にもなってない
みんなc++を使えばよかった

実際はそうならなかった
936デフォルトの名無しさん
2025/03/23(日) 21:39:18.46ID:kIF/RZ8r
>>931
なんの勝ち負けの話してんだよww
937デフォルトの名無しさん
2025/03/23(日) 21:49:34.80ID:QyKgsP1k
C++は平屋のCに何階も増築してきたから基盤はCのままで古い言語だからね
C++11でようやくunique_ptrとshared_ptrのスタートライン

一方でRustは現在の他のモダン言語と同等かそれ以上で何もかも快適
そして開発効率も抜群に良い
静的に最もバグを回避できる優れたプログラミング言語となっている
(もちろん原理的に回避不可能なアプリのロジックバグは除く)
938デフォルトの名無しさん
2025/03/23(日) 21:52:06.36ID:n3c9z4n8
Rustの過剰な持ち上げは普通のRust開発者にとっても迷惑だからな
そういう輩のせいで「Rustは信者が煩い」みたいな意見を見るし、それに辟易する
向き不向きや求められる要求、組織の知見などを考慮して技術選定するという、開発者なら持つべき感覚を否定し続けてるのが理解できない

特定の言語だけを持ち上げる信者はGoやC#やTSにもいるし、そういうのは同様にうざったい
939デフォルトの名無しさん
2025/03/23(日) 21:55:17.62ID:zNJHBv3d
2000年頃、サーバーの仕事なら、新人にはCのメモリ管理が無理だからってJavaでキャリアスタートしたよ。
その頃のオンプレはメモリ数GBだけどJavaが何とか動かせたんだ
そこからGC言語優位が続いたけど、サーバーレスやらで効率重視時代が戻ってきたんだね
940デフォルトの名無しさん
2025/03/23(日) 21:59:15.01ID:QyKgsP1k
>>938
事実のみで過剰な持ち上げはないのに何を発狂してるのかね
もちろん別の言語の話を何度もしていたらウザいからやめるべきだと思うがここはRust
941デフォルトの名無しさん
2025/03/23(日) 22:07:56.77ID:QyKgsP1k
>>939
効率重視とともにエコ面が重視されてるね
そのまま電気消費量そしてランニングコスト
もちろんCPU&メモリリソース使用量を減らせばサーバーなど台数が減らせる面もエコと料金につながる
慣れたらどのプログラミング言語も大して変わらないのだからそれなら全てを少なくできるRustが向いてる
942デフォルトの名無しさん
2025/03/23(日) 22:12:37.78ID:arw2Fenr
Rustは独自性が無い
C+の知見を移植してるだけ
943デフォルトの名無しさん
2025/03/23(日) 22:20:47.30ID:SlUznAQO
いつもの某オジサン(嘘つき/実務経験無し)がesbuildで完全論破されて発狂してるだけ
Rustスレの平常運転だから気にしない気にしない
944デフォルトの名無しさん
2025/03/23(日) 22:23:33.24ID:MXOUkEf2
>>942
C++では出来ていないこと(や、C++に後から入ってC++で普及していないこと)が、Rustには大量にあることが特徴。
むしろ他のモダン言語をやっていれば理解しやすいことも多い。
ただし、Rustが色んな言語の良い最先端な部分を採り入れてるため、少しだけ学習曲線が急な面はある。
それでもすぐ学習して理解できるから、それら機能の効果と利便性のため皆が満たされている。
945デフォルトの名無しさん
2025/03/23(日) 22:28:21.95ID:arw2Fenr
>>944
無いよ
946デフォルトの名無しさん
2025/03/23(日) 22:30:17.46ID:MXOUkEf2
>>945
無いとは何のこと?
947デフォルトの名無しさん
2025/03/23(日) 22:36:44.14ID:kax3x6iq
学習曲線のグラフに原点がないんだろうなあ
0とは一体何がどう0なのだ
948デフォルトの名無しさん
2025/03/23(日) 22:40:46.98ID:dLW1UlJo
スマートポインタやRAIIはC++由来だし、代数的データ型やパターンマッチは他の言語にもあるけど、所有権やライフタイムはRust独自
これはかなり強力な仕組みで、安全性という点ではとても成功してると思う
(同時に難しさの要因でもある)

書いておいて何だけど、言語の独自性はそこまで重要でもないと思う
TypeScriptなんかがそうだけど、仕組み自体は既にあるものでもバランスが良ければ十分に価値がある
949デフォルトの名無しさん
2025/03/23(日) 22:45:57.15ID:QyKgsP1k
C/C++が一番ダメな点は大量の様々な未定義動作
950デフォルトの名無しさん
2025/03/24(月) 00:19:28.90ID:ELaBM+IJ
CのenumとRustのenumで全く似ても似つかないのとか何とかしてほしいわ
C出身のノリで使うと実装量多くてビックリするわ。たかが整数型定数とかいうのと全く違うもんなあ
ほかにも学習で大変なところ数多あるけど、コンパイルエラーを全部潰したらあとはアプリケーションロジックだけの問題になるのはRustならではで快便感ある。Cはコンパイル通ってからが鬼門だからな
951デフォルトの名無しさん
2025/03/24(月) 00:51:58.09ID:9O8f24u0
なんでenumって名前にしたんだろうな
adtとかdataとかtypeとかにしたら良かったのにと思わなくもない
952デフォルトの名無しさん
2025/03/24(月) 01:05:28.53ID:ELaBM+IJ
>>951
実際の使われ方からするとOption型、Choice型だよね。それだとネーミング的に予約語と競合してダメだけどマシな名前は考える余地あったよなあ
基本的に「よその言語から似た単語借りてくる」風習はどの言語にもフレームワークにもあるし慣れるしかないけどね
953デフォルトの名無しさん
2025/03/24(月) 02:41:57.49ID:u90IfC4I
plain enumとADT enumがあるだけでenumはenum
ADT enumをenumの名前で使えるのはRustに限った話ではない
954デフォルトの名無しさん
2025/03/24(月) 03:34:48.42ID:rrmbjdIs
HaskellもRustと同じくらい使われてると言われていたが
つまりすべての製品に使われてるようなことを言っていた
955デフォルトの名無しさん
2025/03/24(月) 03:36:56.31ID:rrmbjdIs
結局、駄目なものはどれだけ宣伝しても流行らないのでは?
956デフォルトの名無しさん
2025/03/24(月) 07:38:50.09ID:Tm5RncoX
そんなに言われてなかったよ。
それは誤解か、誤解した人が大げさに吹聴してるな
957デフォルトの名無しさん
2025/03/24(月) 08:13:34.82ID:a0wY9RFf
>>950
たぶんプログラミング言語一般的な型付けシステムに慣れてないんだと思う
enumはその名の通り列挙型だよ
それを整数型定数と誤認してるのが不思議
定数はその名の通りconstで当然何の型の定数なのかi64とかf64とかOptionなど型名を指定する必要があるよ
enumは列挙型だから名付けてenum Fooなどの別の型になる
内部的には整数で識別されるからその整数値を指定することもできるけどその整数の取れる値の範囲は列挙した分に限られるから別の型
制限はあるけど明示的にcastすれば整数型(i32とかusizeとか)へ変換できるよ

>>952
enumは列挙型だからSome(T)とNoneの2つを列挙できるenum Option<T>型も作れるだけの話だよ
ここでTは任意の型を指定できてジェネリック
もちろんトレイト境界を指定することもできて例えばCowの定義はこうなってるよ
enum Cow<'a, B>
where
  B: 'a + ToOwned + ?Sized,
{
  Borrowed(&'a B),
  Owned(<B as ToOwned>::Owned),
}
958デフォルトの名無しさん
2025/03/24(月) 08:14:23.64ID:CX9jwcEn
Haskellを宣伝してた人がRustを宣伝してる
959デフォルトの名無しさん
2025/03/24(月) 08:15:54.54ID:CX9jwcEn
>>957
Trait制約では?
960デフォルトの名無しさん
2025/03/24(月) 08:16:12.40ID:YUJc8XWR
言語なんて一長一短あるんだから万能な言語なんてないんだよね
たまにそのへんのことがわからない人が宗教戦争始めんだよ
961デフォルトの名無しさん
2025/03/24(月) 08:24:31.95ID:+3Ali/jO
>>958
これだろうね
962デフォルトの名無しさん
2025/03/24(月) 08:28:31.69ID:a0wY9RFf
>>959
トレイト境界(trait bounds)だよ
制約(constraint)とは異なり区別
任意の型(の集合)がトレイトによってトレイト実装されてる型とされてない型に境界が引かれるよ
963デフォルトの名無しさん
2025/03/24(月) 08:33:32.13ID:a0wY9RFf
>>960
それぞれの言語に特徴があるね
その中でもRustは様々な優れてる点があるけど

>>950さんの言う通り
>> コンパイルエラーを全部潰したらあとはアプリケーションロジックだけの問題になるのはRustならではで快便感ある。

それが一番大きいかな
他の多くの言語は実行時デバッグで無駄な開発時間を奪われてしまうから
964デフォルトの名無しさん
2025/03/24(月) 08:38:14.85ID:+3Ali/jO
>>963
CやC++ぐらいだろ
普通に普及してる言語は大体GCありで考えなくて良い
965デフォルトの名無しさん
2025/03/24(月) 08:56:28.14ID:a0wY9RFf
>>964
GCは関係ないよ
プログラミングしたことあるならわかってるはずだけど
まず強い静的型付け言語でないと実行時デバッグは山積み
Rustの場合はデータ競合まで型付けチェックで弾いてくれるからさらに助かるよ
あと一番ありがたいのはsingle writer XOR multiple readers ルール
このおかげで色々な罠にはまらなくて済むよ
それによって書き換え競合を意識するようになるからデータ書き換えのスパゲッティ構造も防げたり
966デフォルトの名無しさん
2025/03/24(月) 10:05:01.91ID:NJwebgj2
>>960
「言語」はそれでいいとして「データ」は万能ではないと指摘されたらAIが死ぬんだよな
まだかなあ
967デフォルトの名無しさん
2025/03/24(月) 10:15:12.89ID:8nOZWVbe
ポエムで草
968デフォルトの名無しさん
2025/03/24(月) 11:58:19.75ID:Q7rhWE6T
>>962
>任意の型(の集合)がトレイトによってトレイト実装されてる型とされてない型に境界が引かれるよ
普通に考えたら無理があり過ぎるってわかるやろ
969デフォルトの名無しさん
2025/03/24(月) 12:23:21.76ID:cPeZblFF
>>966
何を言ってるの…?
970デフォルトの名無しさん
2025/03/24(月) 12:26:57.19ID:a0wY9RFf
>>968
トレイト境界はそのイメージがちゃんとできると使えるよ
トレイト毎に境界があるからね
971デフォルトの名無しさん
2025/03/24(月) 12:35:54.16ID:tWxitKr9
Arena<T>とかRc<RefCell<T>>ってCの生ポに比べてどれくらいパフォーマンス落ちるの?
972デフォルトの名無しさん
2025/03/24(月) 12:42:11.30ID:tWxitKr9
>>949
何でも必ず初期化させる言語と実際に利用するまで初期化が必要無い言語との差は速度面で差が出る部分だと思う
(安全面はおいといて)
973デフォルトの名無しさん
2025/03/24(月) 13:26:19.03ID:CX9jwcEn
Trait制約とTrait境界
どちらが正しいの?
974デフォルトの名無しさん
2025/03/24(月) 14:05:50.97ID:g+HztaOv
>>973
公式といえるものが存在しないので明瞭な結論はないが境界のほうがスタンダードという風潮はある。
真っ先に日本語訳を出したボランティアグループがそうしているから。
技術用語は原則として直訳するものなのでもしも JIS が Rust の規格を成立させたとしてもたぶん境界と訳すと思う。

制約派は有名な会社 (オライリー) が出している書籍で制約という語をあてていることを根拠としていて、ボランティアグループよりプロの翻訳家のほうが信頼できると主張している。
975デフォルトの名無しさん
2025/03/24(月) 14:07:50.39ID:GUfk5wC7
ボウンズでいいよ
976デフォルトの名無しさん
2025/03/24(月) 14:32:08.72ID:jgU8FjIN
>>973
訳さずトレイトバウンドと呼ぶのが好ましいけど日本語化したければトレイト制約
トレイト境界は勘違いと理解不足から発生した間違った訳語なので避けたほうが良い

どの辺が間違っているかはこのスレを読み返してくれ
977デフォルトの名無しさん
2025/03/24(月) 14:34:35.04ID:8nOZWVbe
屋根の色は青が正しい!
978デフォルトの名無しさん
2025/03/24(月) 15:34:03.20ID:MH5MWyKr
>>977
誤爆してるよ
お大事に
979デフォルトの名無しさん
2025/03/24(月) 17:17:17.01ID:a0wY9RFf
>>971
生ポと比較する意味がないよ
確実に自動解放するための枠組み
例えばRcは複数の所有者が生じる時に使われて、どれが先に消えても最後に残った側が自動解放するんだよ
Cで同じことを実現しようとしたら同じく参照カウンタが必要
C++でも参照カウンタを用いてshared_ptrが作られてるよ

>>972
初期化を仮定しないMaybeUninitがRustにはあるから大丈夫
ライブラリ等ではこれを使って不要な初期化を避けているよ
0でのmemset呼び出しが消滅

973
trait boundsはトレイト境界だよ
英語でも敢えてconstraint (制約)を使っていない意義を尊重
トレイト境界により型のとれうる範囲が狭まって型の制限いわゆる型制約が生じるよ
980デフォルトの名無しさん
2025/03/24(月) 17:28:07.52ID:NJwebgj2
ああこれって王様を尊重すると言いながら
戦争していいかどうかは王様に相談してないパターンか
981デフォルトの名無しさん
2025/03/24(月) 18:08:22.30ID:XCWZ1fyV
「制約」は渡す側の視点でしか見てないからな
受け取る側にとってはトレイトの「保証」でもある
ジェネリクス型を受け取る関数を自分で書かないレベルに合わせるなら
「制約」で意訳しても構わないと思う
982デフォルトの名無しさん
2025/03/24(月) 18:38:13.55ID:g+HztaOv
>>981
そのレベルの人が上達してきたときに用語を切り替えるなんてわけにもいかんし、
「この制約のことを Rust 用語ではトレイト境界といいます」とでも一言あればそれで済む話じゃね?

入門者向けの便宜的な説明が後々まで尾を引いて混乱することはあるから喩えとか意訳とかは慎重にしたほうが良いと思う。
983デフォルトの名無しさん
2025/03/24(月) 18:44:54.15ID:zTw2TQbc
>>981
レベルの話じゃないんだよね

両方の視点をもつのはいいんだけど型シグニチャは使う方との契約だから
作る側じゃなく使う側の視点によせるのが自然
作る側の視点で見る回数よりも
使う側の視点で見る回数のほうが圧倒的に多いということもある

仮に受け取る側の視点から見たとしても
トレイトの「保証」だから「トレイト境界」とはならないよね

not satisfiedとかとコロケーションが確立されてるのも
rustcの開発陣もみんな制約として見てるからなんだよ
984デフォルトの名無しさん
2025/03/24(月) 18:49:17.73ID:zTw2TQbc
プレート境界とか軍事境界とか~境界の日本語での使われ方を考えてみたら?

プレートとプレートの境目だからプレート境界
西側の軍事と東側の軍事の境目だから軍事境界

トレイトとトレイトの境目ならトレイト境界は日本語として用意に成立する
でも実際はそうじゃないから
985デフォルトの名無しさん
2025/03/24(月) 18:54:56.12ID:a0wY9RFf
『制約』という完全に意味を間違えている言葉でなければ
『境界』より相応しい範囲を表す何らかの言葉でもいいと思うよ
混乱しないようにトレイト境界のままでもOK
986デフォルトの名無しさん
2025/03/24(月) 18:59:58.08ID:a0wY9RFf
boundsの意味もtrait boundsの用法も範囲の限界を意味しているわけだから
範囲の限界はすなわち境界だよね
範囲の限界を表すもっと良い言葉があるかどうか
987デフォルトの名無しさん
2025/03/24(月) 19:09:34.08ID:CX9jwcEn
Boundsが制約だと思うスレ
988デフォルトの名無しさん
2025/03/24(月) 19:28:44.61ID:38sVBjRv
まだやっていたのかw

これが本当の境界○能だったらどうしよう
989デフォルトの名無しさん
2025/03/24(月) 20:22:18.74ID:w43kWBw9
「よ」とか「ね」とかの終助詞付けても主張が激しいから全然柔らかくなってない
特有の違和感を常に感じさせる文体
990デフォルトの名無しさん
2025/03/24(月) 21:58:28.76ID:CX9jwcEn
>>984
プレートの際だからプレート制約
軍事の際だから軍事制約では?
991デフォルトの名無しさん
2025/03/24(月) 21:59:18.18ID:CX9jwcEn
>>988
制約知能でも意味が通じる不思議
992デフォルトの名無しさん
2025/03/24(月) 22:12:24.41ID:617amb99
>>986
>範囲の限界を意味しているわけだから
何の範囲の限界?
そこも含めて考えないと質の低い機械翻訳と同じだよ

>範囲の限界はすなわち境界だよね
違う
日本語における限界と境界の違いを理解してない
993デフォルトの名無しさん
2025/03/24(月) 22:17:47.15ID:g+HztaOv
日本語での意味なんかどうでもいいよ。
Rust コミュニティの先導者が境界ということにしたのだし、コミュニティの状況を調べなかったか分断しようとするオライリーの質が低いってだけ。
994デフォルトの名無しさん
2025/03/24(月) 22:40:56.78ID:wvKmLjta
レイトマジョリティ自覚して先人に敬意払っとけ
995デフォルトの名無しさん
2025/03/24(月) 22:43:00.79ID:vQzFTF6N
ID:a0wY9RFfは所有権を複製しそうだね
996デフォルトの名無しさん
2025/03/25(火) 04:40:05.04ID:ztarSHRB
残り3レスで問題と慈善事業をを要約してくれ
997デフォルトの名無しさん
2025/03/25(火) 07:36:07.50ID:4wgArwVx
日本語訳プロジェクトを乗っ取って「トレイト制約」で統一すりゃいいんじゃないんかな。
日本語訳プロジェクトは最新版に追随できていないから文句言うやつは居ないだろ。
998デフォルトの名無しさん
2025/03/25(火) 07:40:07.85ID:6deS3uMO
そういや、誰か標準ライブラリの日本語訳してなかったっけ?
あれどうなった?
999デフォルトの名無しさん
2025/03/25(火) 08:50:43.64ID:ztarSHRB
トレイトの神様 降臨
1000デフォルトの名無しさん
2025/03/25(火) 08:51:04.90ID:ztarSHRB
継ぎ
http://2chb.net/r/tech/1742805420/
10011001
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 112日 10時間 18分 15秒
10021002
Over 1000Thread
5ちゃんねるの運営はUPLIFT会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《UPLIFT会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
4 USD/mon. から匿名でご購入いただけます。

▼ UPLIFT会員登録はこちら ▼
https://uplift.5ch.net/

▼ UPLIFTログインはこちら ▼
https://uplift.5ch.net/login

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



lud20250824082344nca

ID:2bVb51Ekのレス一覧:


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
285デフォルトの名無しさん
2025/02/21(金) 06:52:59.68ID:p6I2RufL
edition = "2024" が来たね
286デフォルトの名無しさん
2025/02/25(火) 13:22:53.51ID:XvTpfGzl
https://softantenna.com/blog/linus-rust-policy/

Linus が一喝して技術的に合理的説明のない
rust拒否は許さないことで決着か
287デフォルトの名無しさん
2025/02/25(火) 13:50:37.48ID:z5mNSc8+
生メモリいじくるのが好きな人たちがいきなりrustやれって言われたらきつい気持ちはわかる
どうせメンテーなんてみんなジジイなんだし
288デフォルトの名無しさん
2025/02/25(火) 15:08:04.83ID:Uj70bClX
rustが嫌でもやれなんて言ってないが
289デフォルトの名無しさん
2025/02/25(火) 16:25:22.46ID:ixFc3NBv
Linusの今回の発言は明瞭で
・Cだけ触りたい人はそのままRustを覚えなくてOK
・その代わりRustについて口を挟む権利はない
・CのAPIをその利用者は自由に使えてメンテナといえども用途用法に口を挟む権利はない

したがって今回もめていた「CのAPIの上にRustのAPIを設ける件」について
Cだけ触りたいメンテナは口を挟む権利はなくパッチを拒否する権利もない、ということ
大方の人々が考えていた通りに決着
290デフォルトの名無しさん
2025/02/25(火) 17:47:40.26ID:z5mNSc8+
口を出せない=メンテナ失格ということと受け取った
291デフォルトの名無しさん
2025/02/25(火) 18:17:51.25ID:AwfAD5GP
かつてカーネルを正しく修正した結果として (保証してない挙動に依存した) 間違ったアプリケーションのいくつかがまともに動かなくなったことがある。
そのときに Linux の理念としては技術的合理性でユーザー体験を損なってはならないということで間違っているアプリケーションに合わせて互換性が維持された。
ユーザは一方的な利用者に過ぎずカーネルに口出ししないなんてことはない。
絶対に、絶対に、絶対に、カーネルに口出しするよ。
まあそれが良いか悪いかは知らんけどな。
292デフォルトの名無しさん
2025/02/25(火) 18:41:48.14ID:XvTpfGzl
>>291
そういう具体性を欠いた屁理屈言って拒否するのは
やめろと怒られてるのだね
293デフォルトの名無しさん
2025/02/26(水) 04:07:17.14ID:m7ecN2qb
>>290
そういうデマを言うやつがいるとコミュニティー全体が嫌われるから止めるべき。

Linusが言っているのはせいぜい「Rustコードのメンテナじゃないだろ」ぐらいの話で、Linuxメンテナ失格とは全く言っていない。むしろメンテナが自分のメンテナンス範囲をCコードだけにするのを肯定している。
今回の件も、C APIユーザーとしてのRustコードがCコードとは独立した形で別のメンテナにメンテナンスされるんじゃないんかね。
294デフォルトの名無しさん
2025/02/26(水) 19:09:22.06ID:ixFc3NBv
着実にRust APIを増やしていこう
脱libc
295デフォルトの名無しさん
2025/02/27(木) 14:26:32.38ID:VQNvJTxh
Rustは清書用
296デフォルトの名無しさん
2025/02/27(木) 21:14:53.56ID:z3E1gBHI
じゃあRoughって言語も要るな
297デフォルトの名無しさん
2025/02/27(木) 23:34:31.56ID:8PL54Hpa
Rustはリファクタリングでの安定度も他より極めて高くて開発効率が良いので
まずは雑に書いて後から可読性を上げたり拡張性を上げたり実行効率性を上げたり普通に行われているね
298デフォルトの名無しさん
2025/02/28(金) 08:15:36.47ID:rekq6zs6
>>296
クレート境界をダックタイピング化した言語が欲しいわ。
299デフォルトの名無しさん
2025/02/28(金) 12:17:20.44ID:ydxSDGT7
>>291
その動作は弊社製品の仕様です
(今後も動作は維持されます)

その動作は弊社製品の問題点です
(今後動作は変更されます)
300デフォルトの名無しさん
2025/02/28(金) 12:19:57.96ID:3/BLzMLJ
>>298
それがC++かもしれませんね
301デフォルトの名無しさん
2025/02/28(金) 22:27:33.84ID:wOIfhSFi
>>298
ダックタイピングは各異なる型を統一的に安全に呼び出せる保証が人任せだから使うべきでない
トレイト境界を指定すれば安全が保証されるがそれはトレイトすなわち他言語で言うところのインターフェースに近い存在を仮定していてダックタイピングとは言い難い
302デフォルトの名無しさん
2025/02/28(金) 22:51:15.56ID:OmeBN0rd
>>301
>298のダックタイピングは静的ダックタイピングで構造的部分型のことね。
型の機能的な共通部分を部分型として統一的に扱うから、普通の型と同程度には安全かと。
303デフォルトの名無しさん
2025/02/28(金) 23:05:54.93ID:aDguz5rE
>>298
Go だと型があるインターフェイスを満たす (満たすつもり) かどうかは明示的な宣言がない。
インターフェイスで定義されたのと同じメソッドを持っていればそのインターフェイスを実装したものと見做される。
304デフォルトの名無しさん
2025/02/28(金) 23:49:44.86ID:wOIfhSFi
>>302
まずその共通部分が存在する保証がない
次に共通部分があったとしてもその部分への任意のアクセスメソッドが完全に同一である保証がない
さらにダックタイピングで用意されるメソッドがその共通部分のみにアクセスされる保証がない
共通部分型方式には問題が山積み

一方でトレイト境界を用いると
共通部分を持たなくても安全に共通メソッドを増やすことができる
305デフォルトの名無しさん
2025/03/01(土) 00:09:58.46ID:k1Z2LiOl
相変わらず日本語不自由だな
306デフォルトの名無しさん
2025/03/01(土) 08:37:01.16ID:IXdCHP3R
言語によるとしか言えない
その言語にある道具なら、それが便利なら使って問題ないと思う
C++だと標準ライブラリでもダックタイピングをごく普通に使うけど、それに文句を言う人もいないでしょ
307デフォルトの名無しさん
2025/03/01(土) 08:57:54.01ID:fWE8MQKS
C++のような古くてダサい言語は比較する意味ないだろ
ダサくて自己責任となるダッチタイピングはお似合いだが
308デフォルトの名無しさん
2025/03/01(土) 09:10:51.88ID:J1DdG5rG
Rust書きやすいって言ってるのは大体c++から移った人間でそういう人がここに集ってる
GC付きの言語から来たらそこまでは思わない
309デフォルトの名無しさん
2025/03/01(土) 09:47:12.55ID:+k5QM36w
>>304
静的ダックタイピングとか構造的部分型はご存知で?

コンパイル時にメソッドとかプロパティとかの部分集合で互換性を判定しているので、通常の型と同じレベルで合致するよ。
310デフォルトの名無しさん
2025/03/01(土) 11:24:22.93ID:dZ2eBKvG
>>304 に賛成
311デフォルトの名無しさん
2025/03/01(土) 11:25:33.81ID:dZ2eBKvG
>>306
便利さと安全性は独立してるからな
312デフォルトの名無しさん
2025/03/01(土) 11:39:32.69ID:LIMOz2LM
>>310
>>304を理解できるなんて君は天才だねw
313デフォルトの名無しさん
2025/03/01(土) 13:10:29.22ID:UmJa16uz
A:「〇〇な言語があったらいいのに」
B:「言語によるとしか言えない」
A:「・・・」
314デフォルトの名無しさん
2025/03/01(土) 18:25:43.33ID:iHXAtSJa
Structural Typingでバイナリ境界を超えて新しいメソッドを追加できるようにしてしまうと衝突時のデメリットがメリットを上回る
Rustにcoherenceがあるのと同じ
315デフォルトの名無しさん
2025/03/01(土) 22:44:41.75ID:qVuk4Ae3
>>308
GCの有無は関係ない
異なる型に対するコードの共通化つまりジェネリクスの話

例えばクラスを使えば同じ基底を継承する派生同士は異なる型でも共通のメソッドやプロパティを使える
しかし同じクラス継承の関係しか扱えないのは制約がキツく各機能毎に継承で多重クラス継承など問題が多い

一方でダッチタイピングや構造的サブタイピングは無関係な型同士でも同じメソッドやプロパティがあるだけで暗黙に使える
しかし互換性がなく偶然同じメソッドやプロパティを持つ同士の利用をエラーにできない問題や暗黙であるため複雑化してくると分かりにくくなるなど問題が多い

そこで機能毎にインターフェース宣言と各型でのインターフェース利用宣言することで諸問題を解決し安全で保守しやすいコードにすることができる
そしてインターフェース名(機能名)が付くことで複数の機能の列挙や関係も宣言できるようになる
Rustではトレイトと称する
316デフォルトの名無しさん
2025/03/01(土) 22:55:40.18ID:J1DdG5rG
llmの3B当たりが吐き出す文章みたいで何を言ってるのか意味不明だな
317デフォルトの名無しさん
2025/03/02(日) 00:27:51.62ID:yD3mmOcG
丸一日調べてこれとか泣けてくるな
ついでにRustのトレイト問題も調べとけよ
318デフォルトの名無しさん
2025/03/02(日) 08:35:08.13ID:Na6YXFfW
>>313
最初の一文は違うだろ
A. 「(Rustにない、他の言語では使われてる機能) は問題だらけ」
っていう主張に対して反論されてるだけ
319デフォルトの名無しさん
2025/03/02(日) 15:32:34.86ID:gL5X58/w
>>312
少なくとも君は馬鹿だよ
320デフォルトの名無しさん
2025/03/02(日) 17:14:53.44ID:ZyJLqNmz
わからんけどtypescriptやれば
321デフォルトの名無しさん
2025/03/02(日) 18:00:38.37ID:4Ag5PO4h
ま人生一度は型厨になるのは仕方ない
322デフォルトの名無しさん
2025/03/02(日) 18:29:41.49ID:JmtuUveA
ダックタイピングは動的か静的かに関わらずデメリットが多すぎて使うべきではないよ
唯一のメリットはinterface宣言が不要だけどこれが害悪を招いちゃう
interface名がないから可読性が悪く保守性も低いのはもちろん利用方法に制限も
323デフォルトの名無しさん
2025/03/02(日) 19:02:58.00ID:Q0x8LaN0
静的なダックタイピングにはinterface宣言もinterface名もあるやろ
324デフォルトの名無しさん
2025/03/02(日) 19:17:03.00ID:JmtuUveA
>>323
名前をつけて宣言したらそれはinterfaceそのものだよ
名前も宣言もなしで共通のメソッド名など構造が同じなら動作することがダックタイピングだよ
325デフォルトの名無しさん
2025/03/02(日) 21:10:41.61ID:JAzjPHpU
ubyの罪は重い
326デフォルトの名無しさん
2025/03/02(日) 21:55:50.48ID:4ZT2iFI9
Rustってまだオワコンになってなかったんだな
327デフォルトの名無しさん
2025/03/02(日) 22:12:16.30ID:vq+w9eu/
構造に頼るよりも、ジェネリック関数でトレイト境界で制約かけた方がRustっぽい気がする。
なんとなく。
328デフォルトの名無しさん
2025/03/02(日) 22:50:29.46ID:RayeYp/T
>>324
上に出てきてるように構造的部分型(Strructural Subtyping)を含めた話
まあ俺もStrructural Subtypingを静的ダックタイピングと呼ぶのは
誤解を招きやすいからあまり賛同しないがそこは問題じゃないでしょ
329デフォルトの名無しさん
2025/03/02(日) 23:00:19.17ID:RayeYp/T
>>327
ジェネリックの型パラメータをトレイトで制約するということと
その制約を満たしてるかどうかを型の構造に頼ってチェックするのは両立する話
330デフォルトの名無しさん
2025/03/02(日) 23:17:39.99ID:g7i6E9Hi
共通する構造&機能がある時に
・interface名(Rustではtrait名)を付けて宣言するか
・名付けずにダックタイピングするか
の違いが最も大きい
後者は様々な点で劣る

両者の中間的な位置付けにいるのがGo
Goでは各型に対するinterface実装宣言を省略できてしまうため
省略すると可読性や保守性で劣ることになる
331デフォルトの名無しさん
2025/03/02(日) 23:37:21.79ID:WP5yHTvc
その「保守性が劣る」というGoは世間的には保守しやすい言語と言われてるんだが
型で守るという意味ではなく、多くの人に分かりやすい簡易な構文だからという理由でだけど
332デフォルトの名無しさん
2025/03/02(日) 23:44:33.72ID:g7i6E9Hi
各型に対するinterface実装宣言を省略すると可読性や保守性で劣る
その事実以外の話には言及していない
333デフォルトの名無しさん
2025/03/02(日) 23:54:11.22ID:Na6YXFfW
その可読性や保守性の劣化というのは現実にどの程度問題と言われてるの?
「自分は嫌い」というお気持ちじゃなくて?
あるいは「Rustが採用してないから正しい」とか?
334デフォルトの名無しさん
2025/03/02(日) 23:57:06.79ID:JmtuUveA
一般的に必要な情報は暗黙ではなく明記されている方が保守性も高いんだよ
そして多くの人に分かりやすい
省略できるようにしたことはGoの仕様の失策だね
335デフォルトの名無しさん
2025/03/03(月) 00:08:35.40ID:BZGxSOwK
Goの場合は「省略できる」というよりも「書かない」というのが正しい
選択できるものではなく、常に書かないものだから

正直自分も好きではないし、だいぶクセのある言語だけど、世間的には受け入れられてる
世の中の人は案外そこまで型にこだわりはなくて、それよりも分かりやすさの方が好まれたりする
それは単に「考えが違う」というだけで、劣るとか優れてるとかいうものではない
(それなら何でGoは人気なの?ってなるし)
336デフォルトの名無しさん
2025/03/03(月) 00:11:38.35ID:BZGxSOwK
あとRust開発者はC++から来た人が多いと思うけど、C++のテンプレートは思いきり静的ダックタイプでしょ
あれで実際「可読性ガー」ってなるより、便利だと思う場面もあるよね?
337デフォルトの名無しさん
2025/03/03(月) 00:12:13.08ID:3d6F6ZIn
>>334
明記されていたほうが分かりやすいというのは正しい。
その一方で、明記しなくても分かるような設計にしろ (分かり難くなるなら設計が誤っている) という哲学が Go の根底にある。
338デフォルトの名無しさん
2025/03/03(月) 00:19:18.53ID:lMbQDSSk
structural vs nominalならが安全性はnominalのほうが高いが
保守性や可読性はどちらか一方が常に優れてるわけではないな

Rustはよりメタルに近いOSやライブラリでの利用を重視してるから
安全性の面からより保守的な選択をしてる
coherenceとかもアプリケーション開発者観点だと不必要に厳しい
339デフォルトの名無しさん
2025/03/03(月) 00:25:34.97ID:xahbKnOP
Goでは省略しちゃうことが多くて、
ある型についてどんなinterface群を満たしているのか、を把握するために、
対象となりそうな全てのinterface群の各々のメソッド群と見比べて、
そのメソッド群すべてを実装していることを確認することで、
ようやくそのinterfaceを満たしていることを把握できる。
たった1行を省略できる利便性(?)のために、大きく可読性が落ちているのは否めない。
340デフォルトの名無しさん
2025/03/03(月) 01:43:43.47ID:lMbQDSSk
gopls implementationとかで確認すればいいよ
341デフォルトの名無しさん
2025/03/03(月) 03:55:57.34ID:US4xw5vs
今どき珍しい真面目なスレッドだな
342デフォルトの名無しさん
2025/03/03(月) 04:54:41.57ID:CkLabMrP
>>330
静的ダックタイピングは明示的インターフェイスでも成り立つよ。>336で言うならテンプレートとコンセプトみたいにテンプレート引数の要件を明示するやり方。

>330の言い方なら、
共通する構造&機能がある時に
・共通することを型としてあらかじめ宣言するか
・共通部分を使う時に判別するか
の違いですな。
後者は共通する構造&機能の決定を実際に使用する時まで遅らせることができるので、型の設計時点で決めなくてはならない前者よりも設計の自由度が増す。

Adapterパターンのサポートが充実していれば問題を緩和できるけど、Rustて充実してたっけ?
343デフォルトの名無しさん
2025/03/03(月) 06:07:05.65ID:YJglMSFw
Rustは各型で共通事項をあらかじめ宣言する必要がなく
共通する構造&機能の決定を実際に使用する時まで遅らせて
それらが決まってから後から実装すればよいため
設計の自由度が高いね
344デフォルトの名無しさん
2025/03/03(月) 07:42:47.63ID:FotMwNUg
>>343
あれ?どうやるんだっけ?
345デフォルトの名無しさん
2025/03/03(月) 10:32:52.62ID:CIgoBgkV
他人の書いたコードをインタフェースで抽象化したいときにGoのinterfaceは便利だけど
全て自分で管理する場合は明示的に宣伝した方がいいから選べるようにしてほしい

Javaの普通のinterfaceに加えてGoのinterface同時に使える言語が欲しい
346デフォルトの名無しさん
2025/03/03(月) 10:43:32.37ID:wkIAEgPa
>>341
少し考えれば理由はわかるはず
347デフォルトの名無しさん
2025/03/03(月) 10:47:29.58ID:US4xw5vs
>>346
お?上から来たな
348デフォルトの名無しさん
2025/03/03(月) 19:22:07.10ID:niTL8qrF
>>345
interfaceに関して欲しい機能はRustのトレイト境界の機能だろ
Javaには類似の境界型パラメータがあるが単相化しないため役に立たない
349デフォルトの名無しさん
2025/03/03(月) 19:49:07.58ID:SsAcHPN0
>>343
Rustで共通事項をあらかじめ宣言しないで、共通する構造&機能を統一的に使うのってどうすればいいの?

Rustの型システムを考えると、(既存のコードを変更することなく) 共通する構造&機能を新たに宣言して統一的に扱える、ということだよね?
350デフォルトの名無しさん
2025/03/03(月) 19:56:00.40ID:niTL8qrF
リファクタリングをするのに既存のコードを変えないとか矛盾していて意味がわからん
後から共通メソッドをトレイト化すればいいだけだろ
それで困る人はいない
351デフォルトの名無しさん
2025/03/03(月) 21:42:58.25ID:CkLabMrP
>>350
例えば標準ライブラリの型との共通部分を統一的に扱いたい場合、標準コードをリファクタリングして新しい共通Traitを切り出すのかしらん?
352デフォルトの名無しさん
2025/03/03(月) 22:28:07.80ID:T1gSmlwj
Rustでコーディングしたことないお客さんが来てるのか?
標準ライブラリのコード自体を書き換えなんてせずとも普通に行われていることだぞ
353デフォルトの名無しさん
2025/03/03(月) 22:56:04.92ID:trSew6xi
>>349
>>343が言ってるのはstructの定義時にそのstructがどのtraitを実装するかを(あらかじめ)宣言する必要はなく後から必要になった時にtraitの宣言及び実装をすればいいというだけの話

わざとずらしたことを書いてるから噛み合ってないんだよね
354デフォルトの名無しさん
2025/03/03(月) 23:07:24.80ID:trSew6xi
既に存在する共通する構造&機能をポリモーフィックに扱いたい時にGoなら必要なのはインターフェース宣言だけ
既存のインターフェースに合致するものなら新しく宣言する必要もなくそのまま扱える

一方Rustの場合は新しいインターフェースを宣言して既存の構造体に対する新しいインターフェース用の実装をそれぞれ追加で書かない限りは使えない
それで済めばまだいい方で既存のインターフェースに適合させなければいけない場合は既存の構造体をラップする新しい構造体とその実装を逐一全部書いた上にインターフェースに対する実装も別途追加で書かないダメ

特に後者の手間は雪だるま式に膨れ上がるからライブラリのように他人に使わせるコードを書く場合は型の設計時点というより外部APIの設計時点で何を共通の構造&機能として使えるようにするか決めておく必要がある
355デフォルトの名無しさん
2025/03/03(月) 23:24:45.25ID:uMOb2Eig
> 既存のインターフェースに合致するものなら新しく宣言する必要もなくそのまま扱える

無茶苦茶だな
そんな意図しない全ての型に自動適用される危険な言語は使いたくないわ

Rustは明示的にimplしたものだけに適用されるから安全で使い勝手が良い
356デフォルトの名無しさん
2025/03/03(月) 23:29:41.09ID:uMOb2Eig
> 一方Rustの場合は新しいインターフェースを宣言して既存の構造体に対する新しいインターフェース用の実装をそれぞれ追加で書かない限りは使えない

そんなことはない
既にimpl Tにあるのだからimpl Trait for Tへ移動させるだけだぞ

> それで済めばまだいい方で既存のインターフェースに適合させなければいけない場合は既存の構造体をラップする新しい構造体とその実装を逐一全部書いた上にインターフェースに対する実装も別途追加で書かないダメ

そんなことはない
既存の構造体にそのままtraitメソッドを増やせる
357デフォルトの名無しさん
2025/03/03(月) 23:46:24.87ID:T1gSmlwj
Rustでコーディングしたことないお客さんがこのRustスレでRust叩きとは完全に荒らしだ
358デフォルトの名無しさん
2025/03/03(月) 23:56:56.53ID:BZGxSOwK
外部クレートで定義されたトレイトを別の外部クレートの型に対して実装するときはラップが必要じゃない?
要素1つのタプル構造体 (いわゆる new type) で済むような話だけど
インターフェースといってるあたり微妙にズレてる感はあるけど、「ラップする必要がある」という点自体は間違ってない
359デフォルトの名無しさん
2025/03/04(火) 00:10:16.92ID:PYBK8h/l
>>358
そんな話は誰もしていないよ
今話されているのはこれ

>既に存在する共通する構造&機能を
>新しいインターフェース宣言

複数の型に共通事項が出てきたから
新たなトレイトを作って宣言する話が行われてる
ラップは不要
360デフォルトの名無しさん
2025/03/04(火) 00:26:54.32ID:ZIAXnU+S
自分の管轄外の型に対して、自分の管轄外のトレイトを実装することだけは、安全のため禁止されているので、自分の型にするためのラップが必要
そんな特殊な例外的ケースを除けばラップはもちろん不要
361デフォルトの名無しさん
2025/03/04(火) 01:25:48.23ID:JpOggS8o
最初からクレート境界を前提とした文脈だろ >>298
文脈読めよ
362デフォルトの名無しさん
2025/03/04(火) 01:53:29.12ID:s9xD5Zkr
インターフェイス vs. ダックタイピング

ダックタイピングはインターフェイス名がないため可読性が著しく低い
インターフェイス名を使った制約も指定できない
必ずインターフェイス機能を使うべし
363デフォルトの名無しさん
2025/03/04(火) 02:35:55.33ID:VOLcqrY4
>>362
こういう簡潔なまとめ助かる
364デフォルトの名無しさん
2025/03/04(火) 06:51:13.78ID:r27xQ0ge
ダックタイピングは、意味が異なっていても、見かけの構造さえ同じなら、同一視してしまう問題もある
つまりうっかり間違えて用いても、エラーを検出できないため、安全性で劣る。

その見かけの構造さえも、複数の構造を含む場合など、
この型はどのダックタイピングで用いられているのか、読み手が認識するのに時間がかかってしまう。

これらの問題は、各型において、どのダックタイピングに用いられているのかの宣言がないことに起因している。
一方で、interfaceは「各型でどのinterfaceを用いているのか」の宣言があるため、どちらの問題も生じない。
365デフォルトの名無しさん
2025/03/04(火) 09:45:00.92ID:murVybZ/
>>327 奇遇ですね私もです
366デフォルトの名無しさん
2025/03/04(火) 09:47:17.60ID:murVybZ/
>>333
実行前(コンパイル時など)に問題が表面化することと
実行後に問題が表面化することの違いは果てしなく大きい
367デフォルトの名無しさん
2025/03/04(火) 09:50:16.00ID:murVybZ/
>>339
ほんそれ
368デフォルトの名無しさん
2025/03/04(火) 09:52:06.99ID:murVybZ/
>>342
だからRustは清書用って言われるんだよ
369デフォルトの名無しさん
2025/03/04(火) 09:55:52.32ID:murVybZ/
>>351-352
type alias でほぼ何でもありな状態に出来るけど
他人のcrateとさらに他人のcrateを混ぜてると詰む
370デフォルトの名無しさん
2025/03/04(火) 09:57:24.96ID:murVybZ/
>>353
君こそコーディングしたことないだろ
371デフォルトの名無しさん
2025/03/04(火) 10:00:12.78ID:murVybZ/
ああ 353 は引用なのか?
354 と 353 が同一人物ならきもいが
354 の言ってることが実情
372デフォルトの名無しさん
2025/03/04(火) 10:02:37.01ID:murVybZ/
>>356
↑こういうのが混乱を招くからやめれ
373デフォルトの名無しさん
2025/03/04(火) 10:09:07.10ID:murVybZ/
>>359-360
struct に限ってはそうだね
374デフォルトの名無しさん
2025/03/04(火) 11:30:33.83ID:CoDTmeUS
>>342
Rustでは最初から共通部分があることを意識する必要がなく
そのような場合でも設計の自由度が高い
共通部分が生じたことに後から気付いた時点でそのためのトレイトを後から宣言すればよい
375デフォルトの名無しさん
2025/03/04(火) 11:34:47.54ID:CoDTmeUS
>>354
Rustならばラップは必要なく、トレイト宣言をしてトレイト側へメソッドを移動するだけで簡単に済む
impl Foo {
 fn method(&self, ...
}
impl Bar {
 fn method(&self, ...
}
と複数の型に共通メソッドがあり、それをトレイトで共通に扱えるようにしたければ

// トレイト宣言
trait TraitName {
 fn method(&self, ...
}
// トレイト実装
impl TraitName for Foo {
 fn method(&self, ...
}
impl TraitName for Bar {
 fn method(&self, ...
}
つまり「impl Foo」から
「impl TraitName for Foo」へ移すだけで済む
今回の例なら差分タイプ量は「TraitName for」のみ
376デフォルトの名無しさん
2025/03/04(火) 12:03:00.52ID:murVybZ/
struct のときだけね
377デフォルトの名無しさん
2025/03/04(火) 12:04:58.27ID:CoDTmeUS
>>376
enumでも他でも同じ
378デフォルトの名無しさん
2025/03/04(火) 12:18:25.90ID:murVybZ/
フーン(ニヤニヤ)
379デフォルトの名無しさん
2025/03/04(火) 12:40:56.52ID:uaFJKO3n
伸びてると思ったら複オジの類友が増えただけだったorz
380デフォルトの名無しさん
2025/03/04(火) 12:45:41.91ID:DDDjLfi5
>>376
structに限らず全ての型に対してトレイト実装によりメソッドを増やせるよ
381デフォルトの名無しさん
2025/03/04(火) 12:58:42.56ID:WqCDnV/I
&str(実質&[u8]でもVec<u8>でも)の末尾に
ゴミで良いから毎回必ず'\0'付ける仕様にしといて欲しかった
382デフォルトの名無しさん
2025/03/04(火) 13:19:59.57ID:813wXAHn
>>381
'\0'に限らず任意の値を終端として型を定義できるZigの勝利だね
383デフォルトの名無しさん
2025/03/04(火) 13:44:40.50ID:QtwoMD6j
やっぱ崩れたかw
346みたいな偉そうな奴がいるとなw
384デフォルトの名無しさん
2025/03/04(火) 13:53:15.88ID:aSLD1MTT
死んだスレが生き返ることなどない
385デフォルトの名無しさん
2025/03/04(火) 15:55:00.59ID:UUqFoJ1U
>>381
必要な時だけ付けりゃいいじゃん
不要なものを常時付けとけとか頭おかしい
386デフォルトの名無しさん
2025/03/04(火) 16:14:05.76ID:Xo2DP/vf
異なる方式を混ぜ合わせると両方を協調するのにミスが入りやすい。
ゼロ終端方式とファットポインタ方式に常に矛盾が生じないように維持するくらいなら必要なときに変換するほうがマシ。
387デフォルトの名無しさん
2025/03/04(火) 16:16:40.93ID:HZGad4Nn
>>375
>つまり「impl Foo」から
>「impl TraitName for Foo」へ移すだけで済む
>今回の例なら差分タイプ量は「TraitName for」のみ
フィボナッチみたいなトイコードしか書いたことがないと
こんな意味のない破壊的な変更を無自覚に書いてしまうんだな
388デフォルトの名無しさん
2025/03/04(火) 16:28:38.12ID:c62Mny0R
>>381
"abc"の部分文字列"ab"を参照する時に元の文字列が"ab\0"になるけどいい?
389デフォルトの名無しさん
2025/03/04(火) 17:42:39.60ID:uxSCDJ2e
>>381
&strはStringや(別の)strの任意の部分文字列を参照する型
もし末尾に'\0'を付加すると次の文字を'\0'で上書きするため原理的に不可能
Rustで'\0'終端文字列はCStr/CStringを使う
リテラルならc"ABCDE"

ちなみにC/C++で部分文字列を扱うと
同じ問題が起きるため別領域へコピーして末尾'\0'を付加する
さらに途中に'\0'を置くと千切れる問題や
長さを知るために'\0'まで要走査の問題があるので
Rustのstr/Stringでは'\0'終端文字列としていない
390デフォルトの名無しさん
2025/03/04(火) 17:44:45.66ID:uxSCDJ2e
>>387
新たなトレイトを作ってメソッドを移しても破壊的な変更にならない
もちろん移すだけでは意味はないが
使う側でそのトレイト境界を用いてコードの共通化が可能となるため普通に行なわれる
391デフォルトの名無しさん
2025/03/04(火) 18:39:12.83ID:gw3gBjaL
>>389
いつの時代のC++だよw
392デフォルトの名無しさん
2025/03/04(火) 23:48:22.54ID:qtalPCL7
>>391
昔も今もC + +のs t r i n g関数s u b s t r (開始位置, サイズ)は別の領域を確保してコピーだよ
\0終端するためにコピーは避けられないね

ちなみにライブラリ実装依存だろうけど
毎回ヒープ領域確保はコストが大きすぎるため
結果が15文字までならば静的に各16バイトの領域を事前に持っていてそこを使って頑張っていたりはする
でもそこへのコピーは避けられないね
393デフォルトの名無しさん
2025/03/05(水) 00:13:26.12ID:cALyDE8e
>>390
うわぇー
なんでそんな嘘を吐くの?
もしかして破壊的変更の意味を知らない?
394デフォルトの名無しさん
2025/03/05(水) 00:15:45.55ID:+YosNdhq
>>391
C++ の中だけでやるなら今は range を中心にライブラリが編成されてるから文字列の一部を取り出すのにコピーは必要ないしゼロ終端も不要だが、ここでは (古いライブラリなり API なりの都合で) ゼロ終端が必要になったときはという前提の話をしてるんだぞ。
外の世界は言語の都合に合わせて勝手に変わってくれたりはしない。
モダンな C++ を使っていても外と繋がる境界では外の都合に合わせなきゃしょうがないんだ。
395デフォルトの名無しさん
2025/03/05(水) 01:23:27.50ID:zAVGaXEW
>>394
Rustの中だけでやるなら文字列の一部を取り出すのにコピーは必要ないしゼロ終端も不要だが、ここでは (古いライブラリなり API なりの都合で) ゼロ終端が必要になったときはという前提の話をしてるんだぞ。
外の世界は言語の都合に合わせて勝手に変わってくれたりはしない。
モダンなRustを使っていても外と繋がる境界では外の都合に合わせなきゃしょうがないんだ。

君の言う前提に沿えば>>389の比較は無意味
396デフォルトの名無しさん
2025/03/05(水) 01:31:23.03ID:+YosNdhq
>>395
「いつの時代の C++ だよ」に対していつの時代でもそうだよと言ってるだけ。
>>389 には興味ない。
397デフォルトの名無しさん
2025/03/05(水) 01:45:32.35ID:+YosNdhq
>>395
あらためて >>389 を見たら「ゼロ終端にするにはコピーが必要なのは同じだ (型の整理の仕方は違っても)」というのが趣旨だから結論が同じなのは意図どおりだろ。
398デフォルトの名無しさん
2025/03/05(水) 03:17:39.16ID:nw/EeQ+y
>>389
CString::new(string)で0終端してくれて
c"ABCDE"は最初から0終端されてて便利だね

// 固定文字列は c"..." リテラルで作成
let c1 = c"ABCDE"; // &CStr型
// 文字列を組み立てる場合はStringで作成しておいて
let s = ('A'..='E').collect::<String>();
// そのStringを消費して0終端してくれる (途中に0があるとError)
let c2 = CString::new(s).unwrap();
// 左右どちらも &CStr型の c"ABCDE" で一致
assert_eq!(c1, &*c2);
399デフォルトの名無しさん
2025/03/05(水) 10:19:35.16ID:wPTO1w2Q
このスレいつからワッチョイとかIDとか無くなった?
400デフォルトの名無しさん
2025/03/05(水) 11:21:05.48ID:yWF1u2Fm
隔離スレにそんなもん必要ねえよ
401デフォルトの名無しさん
2025/03/05(水) 12:18:55.35ID:8D9MhhW+
ワッチョイとかIDがあると自演するのに不便だからいらない
402デフォルトの名無しさん
2025/03/05(水) 12:31:30.46ID:wPTO1w2Q
本スレどこ?
403デフォルトの名無しさん
2025/03/05(水) 12:35:55.74ID:yWF1u2Fm
まともに他人の意見を尊重できる人たちが集まり議論が行われればそこが本スレになるだろうが、期待するだけ無駄じゃろ
404デフォルトの名無しさん
2025/03/05(水) 22:19:07.11ID:GGwXatao
>>398
自分で'\0'プッシュすればええやんと以前は思っていたけど
ミスがないことを型システムに保証してもらえる安心感
405デフォルトの名無しさん
2025/03/05(水) 23:13:15.92ID:tlB2HjRS
>>402
DかZにおいで
406デフォルトの名無しさん
2025/03/06(木) 07:37:15.29ID:B42CPAD4
自分でNULL終端しようとする老害は
安全を保証する型システムと相性悪い
407デフォルトの名無しさん
2025/03/06(木) 15:59:09.42ID:WqcKZUUD
[c_char]が[u8]だと思ってたら[i8]だったでごじゃる
408デフォルトの名無しさん
2025/03/06(木) 17:21:49.66ID:hP34p9/Z
c_charは処理系依存っぽいからu8かi8に決め打ちするならc_ucharかc_scharにキャストした方がいい
ターゲット変更した時にコンパイラに文句言われる可能性がある
409デフォルトの名無しさん
2025/03/06(木) 18:39:39.08ID:c+X1ur2G
\0終端じゃないと困るってcやc++から来た人だろ…
老害っているんだな
410デフォルトの名無しさん
2025/03/06(木) 19:04:31.26ID:lbAGNheW
>>409
OS の要求ならしょうがないだろ……
適当なラッパー作るにしてもそのラッパーの中ではゼロ終端にしないわけにはいかん。
411デフォルトの名無しさん
2025/03/06(木) 23:08:05.29ID:/xPeDHQy
>>398
あとはCString/CStrからの変換だな
&[u8]として扱えるのは当然として

// CStringを消費して Stringとして扱う (非UTF8だとError)
let c = CString::new([b'A', b'B', b'C', b'D', b'E']).unwrap();
assert_eq!(c.into_string().unwrap(), String::from("ABCDE"));

// &Cstrを &strとして扱う (非UTF8だとError)
assert_eq!(c"ABCDE".to_str().unwrap(), "ABCDE");

// &Cstrを Cow<str> にする
// UTF8なら &strとして扱い Cow::Borrowed(&str)型
let cow = c"ABCDE".to_string_lossy();
assert_eq!(cow, Cow::<str>::Borrowed("ABCDE"));
// 非UTF8部分があると U+FFFD置換Stringにして Cow::Owned(String)型
let cow = c"AB\xccDE".to_string_lossy();
assert_eq!(cow, Cow::<str>::Owned(String::from("AB\u{FFFD}DE")));

いずれも'\0'の存在は気にしなくていい
412デフォルトの名無しさん
2025/03/07(金) 23:55:18.15ID:nJW2jcZy
&selfで読み取り参照のまま、別の型の読み取り参照に読み替えるのはもちろん、
selfで消費してしまい、確保メモリをそのまま活用して、別の型に読み替えるのが効率ええんやな
413デフォルトの名無しさん
2025/03/08(土) 09:38:56.99ID:y8OZgzU7
>> http://2chb.net/r/tech/1708677472/784

Ruby (が採用している CSI 方式) での文字列オブジェクトはそれぞれどの文字コードであるかの情報を持っていて処理系は各文字コードの処理方法を知っている。
つまり文字列を扱うあらゆる箇所で様々な文字コードごとの処理をやってる。
それが先進的か?
文字コードが統一できない世界でも「なんとかする」方法だろ。

内部的には統一した文字コードで扱い、様々な文字コードを扱いたければ入出力の段階で変換するというのが Rust 的なスタイルを含む現代的なプログラムが目指すところで、そのために Unicode はあるゆる文字コードから「変換可能であること」を指向してる。
とはいえ、これが先進的と言えるわけでもなく総合的に考えて現代の事情に合うやり方ってだけだ。

様々な文字コードの変なところも含めて Unicode に取り込んでいるのは既存のテキストのデータを (情報を失うことなく) 移行できなきゃ Unicode に統一されていかないからで、同じ駄目なら統一されていないことによる駄目さより統一されてる駄目さのほうがかなりマシという価値観による。
いろんな駄目さに個別に対処するのではなくデカい駄目に皆で立ち向かう。

人間の言語が数千年・数万年の歴史的経緯の積み重ねなので文字も駄目だし文字コードも駄目。
根本的に駄目なものはどう扱ったって駄目。
綺麗なやり方で扱わないのは綺麗なやり方が存在しないから。。
414デフォルトの名無しさん
2025/03/08(土) 17:22:21.85ID:O70yvsau
AIで3行程度にまとめてから書き込んてくれる?
415デフォルトの名無しさん
2025/03/08(土) 22:27:54.11ID:EzMMiepo
ネットもファイルもUTF-8で統一しちゃうのが吉
外部のcharset=Shift_JISとか扱わないといけない分だけencoding_rs _io
416デフォルトの名無しさん
2025/03/10(月) 03:27:00.75ID:SacQDf18
>>356
>>375
>既にimpl Tにあるのだからimpl Trait for Tへ移動させるだけだぞ

pub 付いてると知名的なので doubt
417デフォルトの名無しさん
2025/03/10(月) 08:58:57.66ID:CNm9iAF0
crateとかdocsの事考えるとそんな単純な話じゃないんだよ
実践的なコード描いてない人か
418デフォルトの名無しさん
2025/03/10(月) 12:17:05.04ID:BVl3qR6K
歴史的にマクロ=悪の固定観念もってるプログラマも多い気がするから
macro_rules!()はtemplate!()に改名した方がいいかもしれんね
impl Traitとかマクロ使わないと面倒な場合が多い
419デフォルトの名無しさん
2025/03/11(火) 15:16:53.15ID:mrtJh8pq
Rustってfor_eachのclosureのなかでbreak出来ないのです
420デフォルトの名無しさん
2025/03/11(火) 16:23:47.17ID:GvJGmymX
>>418
名前は Scheme の syntax-rules から持ってきたんだと思う。
421デフォルトの名無しさん
2025/03/11(火) 16:37:58.97ID:FiOBTiHo
>>419
map_whileやtake_whileか
try_for_eachやtry_foldを使えば?
ControlFlowを使って自分で作る方法もある
422デフォルトの名無しさん
2025/03/11(火) 19:10:27.26ID:iBVYkGzp
>>419
クロージャは(変数をキャプチャできる)関数の一種なのでbreakなんて概念はない
for_eachはクロージャを引数に取る高階関数なのでbreakなんて概念はない
次々とやってくる「全ての各エレメント」に対して何度もそのクロージャを呼び出すだけなのでクロージャで早期returnしようとしても全てのエレメントに対して処理される
やりたいことはおそらく次々とやってくるエレメントの途中で処理を終えたいのだろうからfor_eachではなく以下のイテレーターメソッドを使う
423デフォルトの名無しさん
2025/03/11(火) 19:12:23.50ID:iBVYkGzp
>>419
中断条件を分離できるならばイテレータを返してくれる(そして他のイテレータメソッドを繋げられる)以下を使うのがベター
take(n) 最初のn個だけ
while_some() OptionがSomeの間だけ
take_while(f) fが真の間だけ
 その後に続きを漏れなく使いたいときは
  take_while_ref_inclusive(f)
  take_while_ref(f)
  peeking_take_while(f)
map_while(f) 変換しながらfがSomeの間だけ
scan(init_state, f) 状態を持ちながら変換しながらfがSomeの間だけ

いきなり結果を(ResultやOptionやControlFlowで)返したいならば
try_for_each(f) fが中断(ErrorやNoneやBreak)になったら終えてそれを返す 中断なければ()を返す
try_fold(init_state, f) 状態を持ちながら同上 中断なければ状態を返す
try_collect() iterとitertoolsで仕様が異なりiter版はnightlyのみだけど 中断になるまでをcollect

レス:1-200 201-400 401-600 601-800 801-1000 ALL

このスレへの固定リンク: 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本 ->画像>1枚 」を見た人も見ています:
FUJIFILM X-S10 Part 5
DX12 Ultimate対応のGPUは現在NVIDIAとMSだけ、XBOX series Xは2080Tiより上となる
【ID無し】雑談★468【LE SSERAFlM NewJeans IVE Aespa NMIXX Kepler TWICE NiziU XG BABYMONSTER】
【DOAXVV】【IP表示】DEAD OR ALIVE Xtreme Venus Vacation 36日目【DMM/Steam[JP]
【ID無し】雑談★49【IVE NewJeans aespa LE SSERAFIM NMIXX Kep1er TWICE BLACKPINK NiziU XG】
【Microsoft】新ゲーム機 「Xbox One X」発表 UHD BD再生、シリーズ最小筐体で499ドル
【ID無し】雑談★663【LE SSERAFlM NewJeans IVE Aespa NMIXX STAYC Kepler NiziU XG BABYMONSTER】
【ID無し】雑談★382【LE SSERAFIM NewJeans IVE Aespa NMIXX Kepler TWICE BLACKPINK NiziU XG BABY】
docomo Xperia Z5 Premium SO-03H Part25
docomo Xperia XZ Premium SO-04J Part62
【DOAXVV】【IP表示】DEAD OR ALIVE Xtreme Venus Vacation 139日目【DMM/Steam[JP]】
【コロナinUSA】新型コロナウイルス アメリカ領グアムで初の感染確認 いずれも60歳以上の3人、うち2人はフィリピンへの渡航歴
【ID無し】雑談★74【IVE NewJeans aespa LE SSERAFIM NMIXX Kep1er TWICE BLACKPINK NiziU XG】
【DOAXVV】【IP表示】DEAD OR ALIVE Xtreme Venus Vacation 11日目【DMM/Steam[JP]】
●○● CHICAGO XIX ★ シカゴ 19 ●○● 【You are not alone】 ★☆★
【DOAX】DEAD OR ALIVE Xtreme Venus Vacation 241日目【DMM/Steam[JP]】
【DOAX】DEAD OR ALIVE Xtreme Venus Vacation 123日目【DMM/Steam[JP]】
【DOAX】DEAD OR ALIVE Xtreme Venus Vacation 61日目【DMM】
【DOAX】DEAD OR ALIVE Xtreme Venus Vacation 72日目【DMM】
au Xperia XZ SOV34 Part19
【ID無し】雑談★196【LE SSERAFIM NewJeans IVE aespa NMIXX Kep2er TWICE BLACKPINK NiziU XG】
キメて xvideos pornhub xhamster
【ID無し】雑談★106【LE SSERAFIM NewJeans IVE aespa NMIXX Kep1er TWICE BLACKPINK NiziU XG】
【DOAX】DEAD OR ALIVE Xtreme Venus Vacation 272日目【DMM/Steam[JP]】
【ID無し】雑談★79【IVE NewJeans aespa LE SSERAFIM NMIXX Kep1er TWICE BLACKPINK NiziU XG】
【DOAX/集金装置】DEAD OR ALIVE Xtreme Venus Vacation 69日目【カモ歓迎】 ©bbspink.com
ソニーテンペスト3Dの概要を話す「アトモスのXbox series Xより優れた体験になる」
【DOAX】DEAD OR ALIVE Xtreme Venus Vacation 162日目【DMM/Steam[JP]】
docomo Xperia XZ Premium SO-04J Part18
最新鋭サウンドカード「Sound Blaster X AE-5」が発売、業界初のRGB LED搭載
【DOAX】DEAD OR ALIVE Xtreme Venus Vacation 99日目【DMM】
Switch版『GUILTY GEAR XX ACCENT CORE PLUS R』発売決定
[NPXS] Pundi X Part1 [プンディエックス]
au Xperia XZ SOV34 Part7
【DOAXVV】【IP表示】DEAD OR ALIVE Xtreme Venus Vacation 16日目【DMM/Steam[JP]】
【DOAXVV】【IP表示】DEAD OR ALIVE Xtreme Venus Vacation 61日目【DMM/Steam[JP]】
〓SoftBank AQUOS PHONE Xx 203SH Part 34
docomo Xperia XZ Premium SO-04J Part9
【ID無し】雑談★236【LE SSERAFIM NewJeans IVE aespa NMIXX Kep1er TWICE BLACKPINK NiziU XG】
インディーの傑作「Slay the Spire」が5月21日に発売決定!!!
【ID無し】雑談★354【LE SSERAFlM NewJeans IVE aespa NMIXX Kepler TWICE BLACKPINK NiziU XG】
【ID無し】雑談★514【LE SSERAFlM NewJeans IVE Aespa NMIXX Kepler TWICE NiziU XG BABYMONSTER】
【DAIHATSU】la400kコペン★21台目【Robe XPLAY】
【音楽】<ビルボード>桑田佳祐『がらくた』でアルバム・セールス1位!シングル・セールス首位はMONSTA X『Beautiful』
【宇宙人狼】Among Us配信者実況スレ Part.19
■■ SHARP AQUOS sense3 総合 ■■ Part21
サンスイ ■ SANSUI総合スレッド 70 ■ 山水
【FSX】Microsoft Flight Simurator X vol.28
au WIN Xmini W65S by Sony Ericsson stage 27
★CASIO MUSIC GEAR (Z XW SERIES) THREAD PART6★
DMM、エロゲー「your diary」でSteamに参入
【PS4】BORDER BREAK ボーダーブレイク part275
【DOAXVV】DEAD OR ALIVE Xtreme Venus Vacation 302日目
iPhone 6 (Plus)であと一年頑張るスレ Part11
【宇宙人狼】Among Us配信者実況スレ Part.25
ニシ「PS5終わった」サード「PS5、Xbox Series X|S、Steam」
【DOAXVV】【IP表示】DEAD OR ALIVE Xtreme Venus Vacation 54日目【DMM/Steam[JP]】
【ID無し】NiziU応援スレ Part43【Super Summer】
the HIATUS Part63
【DOAX】DEAD OR ALIVE Xtreme Venus Vacation 21日目【DMM】
【DOAX】DEAD OR ALIVE Xtreme Venus Vacation 26日目【DMM】
【DOAX】DEAD OR ALIVE Xtreme Venus Vacation 245日目【DMM/Steam[JP]】
【DOAX】DEAD OR ALIVE Xtreme Venus Vacation 35日目【DMM】
【DOAX】DEAD OR ALIVE Xtreme Venus Vacation 267日目【DMM/Steam[JP]】
【EQ】☆☆ EverQuest ☆☆ Lv55【25th Anniversary】
アイカツ STAR☆ANIS AIKATSU☆STARS! 18
19:23:44 up 128 days, 20:22, 0 users, load average: 11.14, 12.46, 12.48

in 1.1428401470184 sec @0.19301795959473@0b7 on 082408