Rust part21

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2023/08/15(火) 22:24:39.45ID:xzxy4cgp
公式
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 part20
https://mevius.2ch.net/test/read.cgi/tech/1677771928/

ワッチョイスレ
プログラミング言語 Rust 4【ワッチョイ】
https://mevius.2ch.net/test/read.cgi/tech/1514107621/
2023/09/20(水) 18:33:23.45ID:I55f6i4N
>>335
#[derive(Copy,Clone)]はもう試しました
Rustのいいところが失われますね
338デフォルトの名無しさん
垢版 |
2023/09/20(水) 18:51:23.96ID:o02nl+od
rustの名前の由来は?
2023/09/20(水) 19:07:11.98ID:DDNbmZRy
https://en.wikipedia.org/wiki/Rust_(fungus)

robustな菌らしい
2023/09/20(水) 19:38:07.98ID:I55f6i4N
OpenGLをやりたくてcrates.ioで最新版を調べてCargo.tomlに
[dependencies]
bytemuck = "1.14.0"
ogl33 = "0.3.0"

[dev-dependencies]
beryllium = "0.13.0"
imagine = "0.5.1"

このプログラムをビルドするとberylliumがunresolvedと出ます
use beryllium::*;
fn main() { let sdl = Sdl::init(init::InitFlags::EVERYTHING); }
berylliumのパッケージ名が変わったりしたのでしょうか
わかる人いますか
2023/09/20(水) 20:29:54.63ID:X4X5BtpX
>>336
さすがにmutex_lock使ってるよ
乏しい経験からの妄想なんかじゃなく、ちゃんとソース見れ
2023/09/20(水) 21:48:28.31ID:UIQvYKk8
>>331
ナチュラルキーをまともに扱えない奴はそもそも設計者失格だろう
2023/09/20(水) 22:20:31.31ID:DDNbmZRy
>>340
単純に動かすだけならdev-dependenciesからdependenciesに移せばいいと思う

テスト用の依存としてdev-dependenciesにこだわるなら
use beryllium::*;
の前に
extern crate beryllium;
を入れれば通るかな
あまりdev-dependencies使わないから分からん
2023/09/20(水) 22:37:25.93ID:I55f6i4N
>>343 ありがとうございます、動かせました!楽しい
2023/09/20(水) 23:23:26.93ID:T1fPPHAq
dev-dependenciesについてはこの辺参照
testやbenchやexampleだけで使う依存を定義するやつ
https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html#development-dependencies

main関数の中で必要なら普通のdependencyにしないといけない
extern crateは関係ない
2023/09/20(水) 23:35:58.10ID:8RfwRI5f
>>331
未来永劫ユニークとノンヌルを単独ナチュラルキーで満たせればいいけど
そうでないときもあるもんね

>>336
プロセス間mutexやセマフォもあるよ

>>337
小さいデータならCopy実装は有利
347デフォルトの名無しさん
垢版 |
2023/09/21(木) 00:37:39.43ID:hd16Ksmk
>>336
単一ファイルでまかなうSqliteと一緒にすんな
2023/09/21(木) 02:18:25.33ID:AFY6neVf
>>341
CreateMutex()の第三引数に名前を指定しなければ
ならないが、ユニークな名前をどうやって作るか
が大問題になるよね。
その点、LockFile() なら名前衝突の問題は
最初から簡単に確実に回避できる。
2023/09/21(木) 03:10:10.71ID:2dN46EMa
普通のDBってインターフェースを一つのサーバーで提供してると思うんだけど
名前解決が出来ない管理なんてあるの?
2023/09/21(木) 03:14:44.34ID:AFY6neVf
>>349
なるほど。そういうことか。
SQLiteは、中央サーバー的なプロセスが無いから
事情が違うってことなんだな。
2023/09/21(木) 04:39:08.18ID:uFUX5dn+
まずプロセスを分けるメリットがない
CPUコアスレッド数のスレッドを立ち上げれば一つのプロセスでそのマシンのリソースを使い切れる
ただし通信待ちでスレッドが止まったらその分のCPUリソースを無駄にしてしまうため各スレッドで複数のタスクを動かす
ただし各スレッドが抱えるタスク数は偏りがちなことが知られているため暇なスレッドは他からタスクを盗んで実行できるようにする
以上のスケジューリングをするのがRustのtokio
2023/09/21(木) 08:25:19.60ID:CT30w3BF
https://www.sqlite.org/whyc.html
2023/09/21(木) 10:46:48.71ID:BwXSXzYj
>>352
Rust以外の言語は完全に否定されているけど
今後Rustだけは条件を満たせば採用するとあるね
2023/09/21(木) 10:59:44.45ID:3hJtL3Ib
mutable xor sharedはトランザクション分離レベルで言うとSERIALIZABLEだと思うけど、書き込み性能にけっこう致命的なパフォーマンス劣化が出たりしない?

あらかじめ主要な書き込み先オブジェクトの参照を保持しておくとかのオブジェクト指向の定石が利用出来ないし。
2023/09/21(木) 11:03:41.54ID:KbwNEPLt
SQLiteは今、日本の人が一人でRustに移植してるみたいだけど?
完成度は知らない
2023/09/21(木) 13:31:34.10ID:cACw6b27
>>351
MySQLやPostgreSQLみたいな普通のDBMSでは
単一プロセスがデーモンとして常駐してファイル更新
を一元管理するのが前提となっているが、
SQLiteでは、そのような常駐プロセスが
存在しなくて、各アプリがSQLiteのライブラリ
プログラムを呼び出して、ライブラリの関数が
排他制御を行なって単一ファイルを壊さないように
ロックしながら互いに強調しつつ、部分書き換えや
部分読み込みを行っている。
つまり、SQLiteは管理を担う単一の常駐プログラム
がなくて、個々のアプリ(の中のライブラリ)が
協調動作するようになっている。
だから、プロセス間で同期を取る仕組みが必要となる。
しかし、CreateMutexでは、ユニークな名前が必要
となってしまい、その名前を決めるのがメンドクサイ。
一方、LockFile だとファイルのパス名で自動的に
ユニークの名前に出来てしまうから、非常に簡単に
安全に正しくロックできる。
2023/09/21(木) 16:18:11.92ID:B1OFnXUk
3文字で言うと
358デフォルトの名無しさん
垢版 |
2023/09/21(木) 16:54:51.87ID:2fMT8T96
SQLite便利だよ
2023/09/21(木) 17:25:46.98ID:WBcwDy8I
sqliteは便利だけどテーブルロックなところがうんこなんだよな
begin conccurentとか予定あるらしいが
2023/09/21(木) 20:32:07.68ID:2tR0WsIS
複数のプロセスからアクセスしないのを前提条件に出来る場合もそれなりにあるもんな。
ちょっとしたツールでデータベースのプロセスをいちいち起動するのはわずらわしいし、 sqlite くらいの気軽さはありがたいのは確か。
sqlite みたいな方針のデータベースが他に台頭してないのが不思議なくらいだ。
361デフォルトの名無しさん
垢版 |
2023/09/21(木) 20:41:30.87ID:PYjX2iWU
>>359
テーブルロックじゃなくデータベースロック
multiple reader xor single writerはデータベース単位
2023/09/21(木) 20:59:40.19ID:WBcwDy8I
もっとひどいデータベース単位か
https://www.sqlite.org/cgi/src/doc/begin-concurrent/doc/begin_concurrent.md
これでページ単位が導入されても、select for updateみたいに明示的にロック
がほしいな
リトライとかだるい
2023/09/21(木) 20:59:47.82ID:WBcwDy8I
もっとひどいデータベース単位か
https://www.sqlite.org/cgi/src/doc/begin-concurrent/doc/begin_concurrent.md
これでページ単位が導入されても、select for updateみたいに明示的にロック
がほしいな
リトライとかだるい
364デフォルトの名無しさん
垢版 |
2023/09/21(木) 23:58:45.91ID:+/xN81gC
以下のような関数(実際のものとは少し違いますが)を実装してみたのですがイテレータのメソッドチェーンの箇所で型が合っていないとコンパイルエラーが発生します
アルゴリズム自体を変更することで目的としていた処理はできましたが結局このエラーの直し方がわかりません
ライフタイム周りが原因だとは考えていますがどのように修正すればよいしょうか

fn hoge(
func: &impl Fn((&i64, i64)) -> i64,
arr: &[i64],
ret: &mut Vec<impl Iterator<Item = i64>>
) {
ret.push(arr.iter().zip(std::iter::repeat(arr[0])).map(func));
for i in 1..arr.len() {
hoge(func, &arr[i..], ret);
}
}
365デフォルトの名無しさん
垢版 |
2023/09/22(金) 09:19:17.11ID:dkRHHNCe
fn hoge(
func: &impl Fn((&i64, i64)) -> i64,
arr: &[i64],
ret: &mut Vec<impl Iterator<Item = i64>>
) {
ret.push(arr.iter().zip(std::iter::repeat(arr[0])).map(func).collect()[0]);
for i in 1..arr.len() {
hoge(func, &arr[i..], ret);
}
}
2023/09/22(金) 12:36:56.71ID:E1X0qleO
lifetimeの問題もあるかもしれないがimpl Iteratorの型をとるところに関数内で生成したイテレータを渡しているのがそもそもおかしい
2023/09/22(金) 13:53:26.70ID:dkRHHNCe
>>360
mdb
368デフォルトの名無しさん
垢版 |
2023/09/22(金) 16:15:11.47ID:v8mgsVW8
>>366
mapにはhogeの外から引数として関数を渡しているので再帰呼出しごとにイテレータの型は変わらないですし
```
let mut v = Vec::new();
hoge(|(&a, b)| a + b, &[1, 3, 5], &mut v);
```
という形でhogeを呼び出せばイテレータの型は自動的に推論されると思うんですが...
369デフォルトの名無しさん
垢版 |
2023/09/22(金) 18:07:36.44ID:KH67E8jw
impl TraitはTraitを実装した型のいずれか一つを受け入れるだけで、Traitを実装した型全てを受け入れるわけではない
370デフォルトの名無しさん
垢版 |
2023/09/22(金) 18:31:55.39ID:v8mgsVW8
>>369
mapの中に直接クロージャを渡せば確かにその制限に引っかかりますが、今回は再帰の中で一つの関数を使いまわしているのでimpl Iteratorの型は一つに固定されませんか?
371デフォルトの名無しさん
垢版 |
2023/09/22(金) 18:41:57.56ID:v8mgsVW8
>>365
イテレータのまま保持して遅延評価させたいんです
2023/09/22(金) 18:43:25.81ID:8SLDLfd5
関数定義から一意な具体型に推論されるのは戻り値型に書いた impl の話ですね
引数型に書いた impl は単にジェネリック引数を匿名化したものという扱いなので
hoge は I: Iterator<Item=i64> なる任意の I で単一化できるような定義が求められます

https://doc.rust-lang.org/reference/types/impl-trait.html

なので引数で&mut引き回してdynも使いたくないということであれば↓になりますかね

https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=32403112ac74f1a10cadf1236590744c
373デフォルトの名無しさん
垢版 |
2023/09/22(金) 19:29:43.87ID:v8mgsVW8
>>372
コンパイル通りました!ありがとうございます!
ただもう少しわがままを言うと、実際の実装ではメソッドチェーンの箇所がこれの2倍ぐらいの長さなので具体的なイテレータの型を書かずにコンパイラ任せにしたかったんですが、話を見る限りどうも無理そうですね...
2023/09/23(土) 08:15:26.34ID:piK9W+al
>>373
>>372も書いてるけどimpl IteratorをBox<dyn Iterator>にする手もあるよ
2023/09/23(土) 09:19:17.35ID:lKOAbDFW
可能なら dyn は避けるに越したことは無い。
dyn はトレイトオブジェクトを扱うための仕組みであって
推論を補助する仕組みではないから。
2023/09/23(土) 09:55:40.35ID:piK9W+al
>>375
実装の隠蔽目的でdyn使うのはそんなに変な使い方ではないと思うが
2023/09/23(土) 09:59:36.45ID:i9fpyxKg
Box<dyn Trait>で解決しました本当にありがとうございました
378デフォルトの名無しさん
垢版 |
2023/09/23(土) 16:36:06.31ID:WPP4nTE5
>>364です
補足すると今回自分がわかっていなかったのは以下のような関数がコンパイルを通らないということですね
```
fn hoge<T>(a: i64, b: &mut T) {
*b = a;
}
```
impl Traitが単にジェネリクスの糖衣構文であるということと、
トレイト境界を満たす型をジェネリクス引数に渡した場合は合法に"ならなければならない"、トレイト境界は十分条件も満たさなくてはならないという点を解っていなかったのがポイントでした...
2023/09/23(土) 21:17:07.32ID:piK9W+al
戻り値のimpl Traitと引数のimpl Traitで振る舞い違うのは当たり前ではあるんだけど混乱しやすいポイントではあるかもね
2023/09/24(日) 12:22:42.57ID:2YTVyUlC
0788デフォルトの名無しさん
2022/06/21(火) 08:59:28.38ID:vO+TReRM
俺はフロントエンドやらないからこのスレでTauriの話をしないでくれ
381デフォルトの名無しさん
垢版 |
2023/09/24(日) 12:36:49.28ID:2YTVyUlC
こいつはどうかな
https://zenn.dev/ksilverwall/articles/2869b4c73e6327
2023/09/25(月) 23:08:53.71ID:OcxuhTB3
rustでdx12ってまともに使えますか?
そろそろc++は卒業したい
2023/09/26(火) 10:01:41.63ID:q653RLNX
>>382
使えないということだな。
2023/09/26(火) 17:46:11.75ID:WrG1pnap
一応d3d12があるけど、これを直接使うよりwgpu経由のほうがいいんじゃないか?
2023/09/26(火) 18:52:01.41ID:liEPyEVD
rustとgoとc#でjsonのシリアライズ、デシリアライズ実験したんだけど
rust 1ms cargo run --release
go 10ms
c# 40ms dotnet build -c Release
こんなに違うもんなの?
リリースモードでビルドしたつもりだけど
WebAPIのバックエンドどれにするか悩んでたけどもうrust1択でいいやん
2023/09/26(火) 21:18:52.63ID:rDjR9GdF
最適化で計測対象の処理が丸ごと消えてないかな
どこかでデータのサイズとか集計とか出力してればいいけど
2023/09/26(火) 21:22:16.85ID:sfzsNV4F
さすがそこまで速くないよね
C#ももっと速いような気がする
2023/09/26(火) 21:40:15.73ID:aJs6t/KK
コードの問題かベンチマークの問題だね
2023/09/26(火) 21:41:15.28ID:K0prie5d
>>385
goこのライブラリ使うとどうなる?
https://github.com/goccy/go-json
2023/09/26(火) 21:41:38.03ID:aJs6t/KK
>>378
>fn hoge<T>(a: i64, b: &mut T)
fn hoge<T>(a: T, b: &mut T)にすればいいと思うけど
同じような解決策が>>364にあるということなの?
2023/09/26(火) 21:56:19.26ID:liEPyEVD
>>385
それやってる
まず、デシリアライズ1000回して
シリアライズ1000回でシリアライズでバイト配列になるからそのサイズのトータル
を求めてる
さっきのは1回あたりの平均

>>389
それやったら7.5ms
experimentalなJSON v2は13ms
2023/09/26(火) 21:59:59.97ID:liEPyEVD
つか、goってリリースビルドないやろ?
コンパイルも一瞬でへ?ってなるわ

それぞれ30行未満のコードだけど..
2023/09/26(火) 22:29:35.41ID:liEPyEVD
https://controlc.com/77570dbc
goだとこんな感じ
2023/09/26(火) 22:43:29.67ID:liEPyEVD
ああ、ごめんC#は嘘でしたすみません
3msになりました
2023/09/26(火) 22:55:30.68ID:liEPyEVD
Rustは最強で
C#はメモリ使用量多いがMSが最適化ガンバッテル
Goはメモリ使用量少なくて言語仕様がシンプルだがC#に負けたり...
2023/09/26(火) 23:05:14.16ID:EQtG/kil
意味のないベンチマークだね
ちなみにこういうのはNimが速いと思うよ

結局こういうのってコンパイラの最適化の勝負をしているだけだから

Rustが速いというよりはLLVMが速いだけ
Zigとかでも同じスピードが出るはず

その代わりにコンパイル速度が遅いというデメリットがあるからこれは単なるトレードオフで、用途に応じて適した言語を選択するのが重要ってだけだね

WebAPI作るならIOが結局ボトルネックになるからパフォーマンス気にするにしても別にスクリプト言語じゃないならなんでもいいのよね
好きな言語にすればいいと思う
2023/09/26(火) 23:08:16.82ID:kLEETtIu
それはともかく
NimはRustに対して意味のあるアドバンテージ皆無でNimだけは要らん
2023/09/26(火) 23:14:09.15ID:liEPyEVD
まぁ、データベースはおもいっきし叩くね
最初は最強言語じゃなくてわかりやすい2番あたりの言語でいこうと思ってるんだけたんだけど
で、1番ははっきりRustっぽいからわかりやすいからいんだけど、
2番(C#,Go?)がはっきりしないから1番の言語でいいのかなと

最大の目的はサーバー費用を押さえられるように
2023/09/26(火) 23:14:24.83ID:gNMcg380
Nimはオフサイドルールってだけで試す気にもならないんだよな…
2023/09/26(火) 23:52:14.82ID:lFc5NXyg
>>396
多数の非同期タスクを偏らずスレッド間でスチールしてスケジューリングできるのは現状GoとRustしかない
小規模ならGoでもよいがそれ以上だと言語機能が貧弱なGoは辛くなってきてRustの独壇場
2023/09/27(水) 00:09:38.71ID:8IPpP98U
>>400
妄想乙
https://ufcpp.net/study/csharp/misc_task.html#thread_pool4
2023/09/27(水) 00:11:19.90ID:8IPpP98U
この妄想も延々言ってたけどやっと黙るのかな?

470: デフォルトの名無しさん sage 2023/09/26(火) 09:57:28.51 ID:ycG3j/g+
>>469
IaaSの一部にそういうケースがありうるだけだぞ
PaaS (FaaS)は基本的にメモリ使用量✕実行時間で料金が決まる
メモリ使用量は少なければ少ないほどコストに優れている
403デフォルトの名無しさん
垢版 |
2023/09/27(水) 00:29:08.13ID:MfhnDtnO
複オジは相変わらず嘘ばっかり
成長しないね
2023/09/27(水) 00:38:28.22ID:+nRBKi9H
AIにRust生成させてGoと比較してみたけどmarshal以外は変わらないな (goccy/json使用)
x86でやってる?ARMだと違うのかも
(俺はUbuntu x86/64)

https://pastebin.com/yV96KjSw


$ go run ./main.go
1187 [μs]
268419000 [bytes] 467 [μs]

$ cargo run --release
1347 [μs]
263672000 [bytes] 255 [μs]
2023/09/27(水) 00:56:55.88ID:+nRBKi9H
俺の環境だとgoccy/jsonにすることで4倍速くなったけど何が違うんだろうね

goccy/json
1129 [μs]
268419000 [bytes] 446 [μs]

標準json
4125 [μs]
268419000 [bytes] 533 [μs]

go-json-experiment/json
3446 [μs]
263609000 [bytes] 745 [μs]
2023/09/27(水) 01:02:33.77ID:+nRBKi9H
これにしたらRustより早くなったわ
結局これっていかに最適化しているかってだけだと思う
https://github.com/bytedance/sonic

[Go sonic json]
914 [μs]
263609000 [bytes] 209 [μs]
2023/09/27(水) 01:06:34.20ID:8IPpP98U
気づくのが遅い
2023/09/27(水) 01:44:16.58ID:jtGLjNq+
>>405
お手数かけて本当にごめんなさい
自分の実行方法が問題でした
>>385でgoの部分が空欄のように実行方法がわかってなく、
デバッグモードで動いていました
すみません
go runで動かしたら>>405のような速度になりました
2023/09/27(水) 01:51:26.25ID:jtGLjNq+
WebAPIでgoで行く決意ができました
本当にお騒がせしました
2023/09/27(水) 04:55:49.67ID:UdUnwuun
YouTube で有名な雑食系エンジニア・KENTA が、既に言ってる。
キャリアパスは、Ruby on Rails → Go のみ

Ruby/Goの神・HashiCorp のMitchell Hashimoto がそう。
Ruby製のVagrant → Go製のTerraform。
今は、Goプログラマーしか求めていない

Rust/Elixir は普及のキャズムを超えなかった。
超えたのは、Goだけ
411デフォルトの名無しさん
垢版 |
2023/09/27(水) 17:50:20.18ID:wGZOY1wb
まあビルド時間の重要性はちょこちょこ一人で作ってるやつは理解できんわな。
2023/09/27(水) 18:56:48.41ID:CCaLLXi3
仕事なら相応に強力なマシンかレンダリングサーバがあるだろ
2023/09/27(水) 21:44:37.94ID:fWGZRw8C
レンダリングサーバーは関係なさすぎ
2023/09/27(水) 22:03:34.78ID:vmit0gpI
ビルドサーバーと間違えたのかもね
2023/09/28(木) 18:29:13.32ID:gS/5M63X
MARCHを受けるために東大の過去問を練習するような意識高い系バカ
416デフォルトの名無しさん
垢版 |
2023/10/06(金) 11:57:36.28ID:Zl0hPCVy
一体誰がRustを推しているのか?
中國?
2023/10/06(金) 13:12:35.08ID:2p+njRVB
関数型と手続き型のいいとこ取りしたいプログラマだろ
情報科学の先進国なら中国に限らず一定数いるはず
2023/10/06(金) 16:38:53.65ID:AJI+rgso
ネットインフラが次々とRust製になっていってる

>【CDN世界トップシェアCloudflare】
https://www.publickey1.jp/blog/22/cloudflarenginxrusthttppingoracdncpu31.html
>CDNプロバイダのCloudflareは、同社のグローバルなCDNの基盤として長らく利用してきたNGINXに代えて、
>同社自身がRust製のHTTPプロキシである「Pingora」を開発し利用していることを明らかにしました。


>【クラウド世界トップシェアAWS】
https://japan.zdnet.com/article/35183866/
>Rustで構築されたAWSサービスの例としては、
>コンテナーアプリ用のサーバーレスプラットフォーム「Lamba」を支える「Firecracker」、
>「Amazon Simple Storage Service(S3)」、
>「Amazon Elastic Compute Cloud(EC2)」、
>コンテンツ配信ネットワーク「Amazon CloudFront」、
>LinuxベースのコンテナーOS「Bottlerocket」などがある。
2023/10/06(金) 20:34:57.35ID:hdhWn3/E
関数型の良いとことるの諦めた言語って感じだけどw
初期の頃はocamlでコンパイラ作られてたらしいのに
MLの匂いさえ残ってない単なる手続き化型言語だわ
2023/10/06(金) 20:35:16.84ID:hdhWn3/E
関数型の良いとことるの諦めた言語って感じだけどw
初期の頃はocamlでコンパイラ作られてたらしいのに
MLの匂いさえ残ってない単なる手続き化型言語だわ
2023/10/06(金) 21:14:33.58ID:b1wSOXuc
スタックフレームに着目したのはプラスだけど、下手にスタックフレームを隠そうとしているのはマイナス。

計算モデルをスタックフレームにするぐらい割り切れば良かったのに。
2023/10/06(金) 21:15:11.56ID:b1wSOXuc
スタックフレームに着目したのはプラスだけど、下手にスタックフレームを隠そうとしているのはマイナス。

計算モデルをスタックフレームにするぐらい割り切れば良かったのに。
423デフォルトの名無しさん
垢版 |
2023/10/06(金) 23:16:24.42ID:tE7CLicd
mut 入れたのが間違いなんだろ
2023/10/06(金) 23:30:10.29ID:hdhWn3/E
関数型に関してはscalaのほうがよっぽど意欲的だよ
def qsort(list: List[Int]): List[Int] = list match
case Nil => Nil
case pivot :: tail =>
val (smaller, rest) = tail.partition(_ < pivot)
qsort(smaller) ::: pivot :: qsort(rest)

たとえば↑こういうのとか
2023/10/07(土) 00:34:46.36ID:Hyqci1qG
関数型というよりはリスト型言語だな
2023/10/07(土) 01:56:24.14ID:a3LzK6ia
システムプログラミングのための言語なので純粋に関数型な要素だけを求めるなら別の言語を当たった方が良い
2023/10/07(土) 02:12:44.80ID:QajUcOD9
リスト型つまりLinkedListをメインにすると利便さと引き換えに遅い問題とガベージが出まくる問題がある
Rustはリスト型メインにしなくて正解
2023/10/07(土) 04:42:48.81ID:+bTugVnw
GCを前提にしない仕様の上に積み上げなくてはならないという側面から見ると、わりかしよくやっている方なんじゃなかろうか……知らんけど
2023/10/07(土) 06:29:51.58ID:GJ9LXcgc
自称情強底辺者「Rustでhello worldかける俺カコイイ」

真の成功者「スイカゲームでボロ儲けしました」
2023/10/07(土) 06:46:44.80ID:bWLG2vp7
mut無しとはこういうことか
https://play.rust-lang.org/?version=stable&mode=release&edition=2021&gist=a5753729862ae878a1cf011314e90f3e

fn qsort<T: Copy+Ord>(list: &[T]) -> Vec<T> {
match list {
[pivot, ..] => {
let (smaller, rest): (Vec<T>, Vec<T>) =
list[1..].iter().partition(|&i| i < pivot);
[qsort(&smaller), vec![*pivot], qsort(&rest)].concat()
},
_ => vec![]
}
}

fn main() {
let list = [9, 0, 7, 3, 6, 1, 2, 4, 8, 5];
println!("{:?}", list);
println!("{:?}", qsort(&list));
}
431デフォルトの名無しさん
垢版 |
2023/10/07(土) 09:44:47.17ID:WqNjBTZw
まあ今時ランタイム速度でそこまで差がつくことはないわな。
ガベコレの実行タイミングが問題になることは結構あると思うけど。
2023/10/07(土) 11:17:12.27ID:fuWtUzBR
アロケートしまくリングやな
2023/10/07(土) 12:06:59.60ID:pov02R//
ランタイムサポートが極まってきたからこそ
極めきれない部分の差が目立ってきたんだよ。
2023/10/07(土) 14:19:35.27ID:koj+veBs
XYZ座標みたいな単純だけどプリミティブでない大量のデータの配列を作りたいときに
1つ1つをオブジェクトにしないといけないGC言語は放り投げたくなる
座標なら最悪プリミティブに分解して自分で並べれば済むけど型が混ざると詰む
2023/10/07(土) 15:18:57.75ID:AO4ZOvxF
>>424
>>430
なるほど

美しいコードはスッキリうんこみたいに気持ち良い
まるで脳が洗われるようだ
普段いかに毒に浸かってるかが判るな
2023/10/07(土) 15:43:47.56ID:Ozx346pn
Rustのはmutなしにした場合の問題提起のための悪い例だろ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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