Rust part27

■ このスレッドは過去ログ倉庫に格納されています
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
https://mevius.5ch.net/test/read.cgi/tech/1726838318/

ワッチョイスレ
プログラミング言語 Rust 4【ワッチョイ】
https://mevius.5ch.net/test/read.cgi/tech/1514107621/
93デフォルトの名無しさん
垢版 |
2024/12/09(月) 13:24:01.49ID:wWCmXoxS
科学 + 5ch

【AI】AIはわずか2時間の対話で人間の性格をコピーできる [すらいむ★]
https://egg.5ch.net/test/read.cgi/scienceplus/1733576027/

コメントに面白いことが書かれている
94デフォルトの名無しさん
垢版 |
2024/12/09(月) 13:32:22.31ID:elhM3R9g
>>92
たしかに基礎的なことではあるがC/C++ではうっかり数値型の自動キャストでハマることもあるし
何よりも未定義動作が多くてこれも沼にハマる原因だな
それらを無くしたRustは賢明だ
95デフォルトの名無しさん
垢版 |
2024/12/09(月) 13:59:10.18ID:uh4vUAM3
釣れますか?
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が失敗したらループが止まります
マルチスレッドならランダムに止まります 知らんけど
2024/12/09(月) 20:57:28.00ID:bWuDC7pJ
FnMut() -> Option<T>っぽいあらゆる処理を全部Iterator化しようという気概を感じるな

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

構造体のメンバーが&'a Mutex<T>なら
reborrowではなくmoveで取得した値に対しderef_mutが使える
moveなら殴られない
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コマンド内でのライフゲームをやるつもりなら、ありなんだろうさ
2024/12/12(木) 23:08:54.89ID:qS1eLhOO
C/C++からRustへ:Googleが示すファームウェア進化の道筋
https://xenospectrum.com/google-revamps-firmware-with-rust/
2024/12/14(土) 11:03:48.81ID:mSSbYcoF
読み終わった

>>102
具体的なアプローチは以下の通りである:
(1) 段階的なRust導入:
 略
(2) 既存のCコードベースとの統合:
 略
(3) ベアメタル環境への対応:
 略
(4) ビルド最適化とパフォーマンスの考慮:
 略
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))
}
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())
}
2024/12/15(日) 23:49:49.46ID:ehGoRf8d
>>105
Cellで済むところがRefCellになってしまってメリットがよくわからないです
2024/12/16(月) 00:17:21.21ID:QlO1DQXb
合わせたつもりだったけど104の実装だと最初のidは1か
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())
}
2024/12/16(月) 01:08:38.61ID:KPayFncJ
スレッド単位の連番て何やの?
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)
}
2024/12/16(月) 18:51:07.44ID:gawhGp3+
inspectの間違った使い方
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
全然判り易くないぞ
語彙に直交性が全く無い
2024/12/17(火) 12:02:56.17ID:PdC61IaM
語彙の問題もあるのかもしれないけどasyncの問題もあって中の人たち含めみんな昔ほどコンビネータで書かなくなった
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 }
2024/12/17(火) 13:56:28.23ID:fyM5pHAa
現状追認オジの意見ほど意味のないものはない
2024/12/17(火) 13:58:12.78ID:8t1OBzHL
バカでも読めるコードが正解なんだよ
2024/12/17(火) 14:25:44.95ID:QOGj4SRI
コボラーがそんな事言っていたなw
2024/12/17(火) 15:37:01.20ID:k3aNgl34
あほくさ。
そこらの医学でも物理でも法律でもいいが適当な論文が単語や言い回しだけ平易にすればバカでも読めるようになるか?
前提知識がないとどうせ意味なんかわからん。
プログラミングも同じ。
理屈が理解できるだけの能がなければ表現ばかり平易にしても無意味。

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

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

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

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

つかこんな基本的なことから説明させようとするなよ
2024/12/17(火) 22:05:47.16ID:ecWnwmom
>>127
んでお前ならどう書くんだ?
Rust使った新システムで慣習や暗黙の了解はまだない時に自分で考えてソース書くときはどうするんだ?
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言語が人気というのもそう
2024/12/17(火) 22:20:51.38ID:QsDK8zUE
>>127
具体的に何を問題視してるのかわからん
Mutexを使わずに効率よく実装できるケースのようにみえるが
初心者入門向けと書かれてるからMutex利用もアリだろう
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開発者は関数スタイルを好む人も多いと思うけど、それは好みの域を出ないと思う
2024/12/18(水) 09:42:19.11ID:w442kBzm
まあ存在する以上はユースケースがあるってことだからな。
2024/12/18(水) 12:59:18.01ID:RrhqiCIc
コードゴルファーのために存在してるわけじゃないからな
2024/12/18(水) 13:17:46.53ID:3HdOm/G7
そろそろitertoolsを標準ライブラリ化する話はないのか?
2024/12/18(水) 18:37:10.88ID:C5X2cUVY
個別に取り入れられてる
まとめて標準化はない
棲み分け
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 で描く場合どうやればいい?
https://www.youtube.com/watch?v=n2Q1Sp7iew4
もちろん unsafe 利用 ok として
2024/12/19(木) 11:55:22.77ID:953TTIIh
型のキャストは
std::mem::transmute
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/
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
}
2024/12/23(月) 22:20:47.40ID:GhTcJSaR
Rustに興味出てきたからとりあえず、とほほさんのサイトに目を通してみたんだけど
…もしかしてあの方、非同期処理と並列処理をごっちゃに理解している?

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

>>144
executor (runtime) とそこでの使い方次第
single thread で並列(parallel)なく並行(concurrent)のみも可能であるし
それをmulti threadで並行並列も可能であるし
blockさせて並行なく専属並列も可能
2024/12/28(土) 15:51:05.67ID:SGU/9qSb
Rustしか勝たん
2024/12/28(土) 17:09:23.73ID:IXmLUnxX
こういうアホが湧いてきたときがピークだな
2024/12/28(土) 17:20:50.92ID:T6F1mfjg
WebAssemblyはRustが主流なイメージだけど実際どんなもんだろ
2024/12/28(土) 18:28:20.06ID:wm6lCJnC
linuxカーネルがシェルスクリプトの付属品にならなかったのはシェルを変更できるから
だがjsは、変更不可能にすればjsが永久に主流だというのを意図的にやっている
2025/01/01(水) 12:59:04.47ID:emEmRiID
>>149
何いってんだお前?
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が良さそう)
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だけど、初学者がすぐに分かるものではないと思う
2025/01/04(土) 13:59:36.84ID:5PJMX9Ru
>>156
単純にメンテする人員を確保しづらいという意味ならそれはそう
2025/01/04(土) 22:40:45.82ID:xBPs09Kz
rustのいい所はresultやoption.その他色々な型について文脈が大体決まっていること。なので慣れると人が書いたコードでも読みやすい。c#やjavaとの比較であれば開発効率は大体同じか、勝っているぐらい。nullや例外がある言語はプログラムがどうしても汚くなる。
rustはaiにコード生成させた時の品質も割といい。コンパイルエラーでても対応方法が具体的なのでそのままメッセージをaiに渡すだけで直る。
2025/01/04(土) 22:49:58.13ID:xBPs09Kz
AIが当たり前の時代においてはコードの記述量そのものは開発効率に直結するものではなくなる。どの言語でも似たような事は出来る。でも作られたコードが、正しいかどうかは別の問題。
AIはたまに嘘を付くので、それをコンパイラで厳密にチエックする必要がある。そういう意味では関数型言語へのシフトは進むし、rustはいい位置にいると思う。
2025/01/04(土) 23:01:31.53ID:tP/ja7AQ
関数型関係ないから
2025/01/04(土) 23:15:15.09ID:FAAvXSOV
>>159
関数型である部分ではなく
Rustが安全性にも役立つ史上最強の型システムを構築したことが決め手かな
特にトレイトそしてトレイト境界
さらに例えばSendやSyncといった概念的なトレイトなど
2025/01/05(日) 00:44:18.92ID:TOCT7c8i
そうなんだ、Rustってすごいんだね!
163デフォルトの名無しさん
垢版 |
2025/01/05(日) 11:01:38.28ID:8kdOFrcZ
関数型関係ないから
2025/01/05(日) 13:34:15.55ID:4B4hqpXY
お前ら9連休はちゃんと楽しめたか?
165デフォルトの名無しさん
垢版 |
2025/01/05(日) 16:19:33.22ID:mRHgcQU5
九連休に一回もコード書いてない陽キャはこのスレ書き込み禁止な
2025/01/05(日) 18:30:14.16ID:Rb8d6mKE
体力落ちないように散歩しまくってたら脚の裏に豆出来たよ
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()の型アノテーション外せないの?
2025/01/06(月) 00:22:47.46ID:criPfDaa
>>167
型アノテーションは必要。
オーバーフローしない十分に大きな型を選定しなきゃならないから。
浮動小数点ならオーバーフローはしないが必要な精度を推論しようがないことにかわりない。
2025/01/06(月) 00:30:50.77ID:wyPVXQtD
その論理は明らかにおかしい
170デフォルトの名無しさん
垢版 |
2025/01/06(月) 03:11:05.95ID:AJFRd04v
0..10がu64なんだからsumの結果も当然u64だろうという気持ちにはなる
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);
}

このように必ず型を指定して使い分けをする
2025/01/06(月) 16:43:43.88ID:lN8qCLjL
Monoidを先に整備すればこんなことにはならずに済んだろうに
173デフォルトの名無しさん
垢版 |
2025/01/06(月) 17:02:00.56ID:jpfBkgv0
>>171
そういうのは本来sumの役割じゃなくないかという気持ち
2025/01/06(月) 18:43:17.81ID:tSs1WAlu
オーバーフローとかは関係なくて型システムの制約と標準ライブラリの実装方法の問題だよ
2025/01/06(月) 19:00:20.90ID:9m9l0GJF
sum()の戻り値の型をIterator::Itemに固定するとItemが参照型の場合に対応できないな
2025/01/06(月) 21:13:46.20ID:CO3hUR7m
そら固定したらダメだよ
177デフォルトの名無しさん
垢版 |
2025/01/06(月) 21:49:35.38ID:4hhkOX4f
ジェネリクスで良いとは思うけど、デフォルトの型として元の型になってくれると便利な気はする
参照の場合とかは、数値型なら .copied() で値にできるし
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>
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の導出からだとだるい
2025/01/08(水) 23:11:07.72ID:SlaqrUqV
そのSimdのSum実装のこれを見てそこに落ち着いたのか
iter.fold(Simd::splat(0 as $type), Add::add)
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/
2025/01/11(土) 10:01:12.58ID:dWpFaXpi
Chromium プロジェクトが Rust の利用をサポート
https://developers-jp.googleblog.com/2023/02/supporting-use-of-rust-in-chromium.html
2025/01/11(土) 10:03:06.03ID:dWpFaXpi
Rust を導入する目的は、シンプルで(IPC を使わない)安全な(全般的に C++ よりも複雑でなく、サンドボックスでメモリの安全性に関するバグは発生しない)形で 2 の法則を満たすことにより、
2025/01/11(土) 10:08:09.58ID:dWpFaXpi
Rust は、Mozilla がブラウザを書くために特別に開発したものなので、このテクノロジーが Chromium でようやく使われ始めるようになるのは、理にかなったことです。
システム ソフトウェア業界に莫大な貢献をしてくださっている Mozilla に感謝いたします。
Rust は、安全性とパフォーマンスの両方を言語に期待できることを見事に証明しています。
2025/01/11(土) 10:21:28.46ID:UwKGG2Q8
むむっ
2025/01/11(土) 11:00:56.87ID:rJtu07B+
そもそもMozillaはRust開発者の大半をリストラしてしまったし
すでに単なる1ユーザ企業に過ぎなくて、Rustの発展にはあんまり関係なくなってる
どちらかというとMDNを維持できるかとかの方が重要そう
2025/01/11(土) 11:44:47.56ID:3LDhx22M
GoogleはChromeが独占禁止法違反にならないようにFirefox支援しててMozillaは生きててもらわなきゃならん
デフォルトの検索エンジンに採用する見返りにGoogle社から受け取ってる金がMozillaの収益の90%を占めるから潰すのはその金を絞るだけでいい
2025/01/11(土) 12:13:12.32ID:RVo7o+pP
>>187
おまえ日本語不自由なら無理に書き込まなくてもいいんだよ?
2025/01/11(土) 12:35:47.49ID:3LDhx22M
>>188
お前には難しかったか
すまんな
2025/01/11(土) 12:37:03.90ID:6FujqKQM
添削してあげる

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

誤 そのためGoogleはMozillaを投資している
正 そのためGoogleはMozillaに投資している
2025/01/11(土) 12:49:21.17ID:dWpFaXpi
いずれも着実にRust化
■ このスレッドは過去ログ倉庫に格納されています