公式
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/
探検
Rust part21
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2023/08/15(火) 22:24:39.45ID:xzxy4cgp305デフォルトの名無しさん
2023/09/19(火) 18:23:26.80ID:/HqZkxNe 販売サイトなどのバグって怖くて、500円のものが
バグれば5000円になったりする可能性ある。
そういうものは、プログラミングを気をつける
しかなくて、Rustの安全対策でも防げない。
バグれば5000円になったりする可能性ある。
そういうものは、プログラミングを気をつける
しかなくて、Rustの安全対策でも防げない。
306デフォルトの名無しさん
2023/09/19(火) 18:32:19.28ID:gvKDfDmE 「気を付ける」の内訳にはテストを書く習慣とかが含まれてる。
気を付けないとしょうがないけど
気を付けるのに使える道具はそれなりに揃ってる。
気を付けないとしょうがないけど
気を付けるのに使える道具はそれなりに揃ってる。
307デフォルトの名無しさん
2023/09/19(火) 18:34:24.73ID:mxtPnJ5/ すべてのバグをなくせる言語がないのは当たり前
データ競合により起こるそういう値のバグも現実にあるのだからRustでその手のバグをなくせるのも事実
データ競合により起こるそういう値のバグも現実にあるのだからRustでその手のバグをなくせるのも事実
308デフォルトの名無しさん
2023/09/19(火) 18:55:07.79ID:p1GkLls0 >>303
そのレイヤーの話でもDBMSはトランザクション管理されてるから生ポインタとは状況が全く異なる
トランザクショナルメモリで管理された共有メモリと生ポインタの違い(実際はそれよりもまだ差がある)
そのレイヤーの話でもDBMSはトランザクション管理されてるから生ポインタとは状況が全く異なる
トランザクショナルメモリで管理された共有メモリと生ポインタの違い(実際はそれよりもまだ差がある)
309デフォルトの名無しさん
2023/09/19(火) 19:02:27.03ID:p1GkLls0 >>304
同時実行制御には大きく楽観的制御と悲観的制御があるがshared xor mutableは後者
高い同時実行性能が求められる場合には楽観的同時実行制御を使うことが増えている
DBの話だけでなくロックフリーアルゴリズムも基本は楽観的制御
同時実行制御には大きく楽観的制御と悲観的制御があるがshared xor mutableは後者
高い同時実行性能が求められる場合には楽観的同時実行制御を使うことが増えている
DBの話だけでなくロックフリーアルゴリズムも基本は楽観的制御
310デフォルトの名無しさん
2023/09/19(火) 19:54:07.45ID:/x1C5Bro >>309
楽観的排他制御を用いることができる現実的ケースが狭い
衝突した時の処理やり直しコストも考慮する必要がある
その一般的な話とは別にポインタ(参照)の話の方は必ず衝突するためsingle writer xor multiple readersが必須
楽観的排他制御を用いることができる現実的ケースが狭い
衝突した時の処理やり直しコストも考慮する必要がある
その一般的な話とは別にポインタ(参照)の話の方は必ず衝突するためsingle writer xor multiple readersが必須
311デフォルトの名無しさん
2023/09/19(火) 21:00:27.72ID:BGD+Lo74 排他制御も凄く奥深い話ではあるが、そういう
ものだけでなく、単なるプログラムミスで、
ID番号が1つずれたり、行がなんらかの事が
原因で1ぎょうずれたりしても、大変な問題
を巻き起こす。だからテストは必須。
ものだけでなく、単なるプログラムミスで、
ID番号が1つずれたり、行がなんらかの事が
原因で1ぎょうずれたりしても、大変な問題
を巻き起こす。だからテストは必須。
312デフォルトの名無しさん
2023/09/19(火) 21:30:53.89ID:cyrWzrEE RDBMSで物理的な一行とか関係ない
テキストファイルに永続化してる素人だな
テキストファイルに永続化してる素人だな
313デフォルトの名無しさん
2023/09/19(火) 21:34:30.39ID:BGD+Lo74 >>312
DBMS自体をプログラムする場合には関係ある。
DBMS自体をプログラムする場合には関係ある。
314デフォルトの名無しさん
2023/09/19(火) 21:41:37.42ID:BGD+Lo74 それと、DBMSを使うに徹する場合でも、行に
付ける ID 番号の管理がまた問題になる。
それも慎重に良く考える必要がある。
付ける ID 番号の管理がまた問題になる。
それも慎重に良く考える必要がある。
315デフォルトの名無しさん
2023/09/19(火) 21:50:10.01ID:LcWw/5IR それサロゲートキー義務で設計したらの話でしょ
316デフォルトの名無しさん
2023/09/19(火) 21:55:08.52ID:BGD+Lo74 >>315
色々な機能を実装する上で、色々有り得る。
色々な機能を実装する上で、色々有り得る。
317デフォルトの名無しさん
2023/09/19(火) 22:32:18.55ID:e2nf9Krk >それと、DBMSを使うに徹する場合でも、行に
>付ける ID 番号の管理がまた問題になる。
DB板にもそういうのいるけどRDBにID必要と考えてるやつはもっかい勉強してこい
>付ける ID 番号の管理がまた問題になる。
DB板にもそういうのいるけどRDBにID必要と考えてるやつはもっかい勉強してこい
318デフォルトの名無しさん
2023/09/19(火) 22:44:03.77ID:5k6OZf8O >>310
>楽観的排他制御を用いることができる現実的ケースが狭い
MVCCやCASが楽観的制御
分散非同期が前提の世界では楽観的制御がデフォルト
じゃないとスケールしないから
Rustがコンパイル時悲観的制御にしてるのは実行時の管理を無くしたいからであってポインタだとshared xor mutableが必須だからではない
トランザクショナルメモリがその一例
>楽観的排他制御を用いることができる現実的ケースが狭い
MVCCやCASが楽観的制御
分散非同期が前提の世界では楽観的制御がデフォルト
じゃないとスケールしないから
Rustがコンパイル時悲観的制御にしてるのは実行時の管理を無くしたいからであってポインタだとshared xor mutableが必須だからではない
トランザクショナルメモリがその一例
319デフォルトの名無しさん
2023/09/19(火) 22:57:59.75ID:cyrWzrEE DBMSをプログラムする場合には当然関係ある
でも1行ずれたら大変とかいう下手くそは任されないので関係ない
でも1行ずれたら大変とかいう下手くそは任されないので関係ない
320デフォルトの名無しさん
2023/09/19(火) 23:03:17.25ID:BGD+Lo74321デフォルトの名無しさん
2023/09/19(火) 23:06:22.84ID:r+harKS8 可変参照と不変参照に対してMVCCなんて使えないよ
それはデータをコピーすることと同じになってしまう
ソフトウェアトランザクショナルメモリはどの環境でも使用可能なのに不利だからほぼ使われていない
さらにRustのshared xor mutableはそれらと独立した話であり共存できる話なのでshared xor mutable必須は問題ない
それはデータをコピーすることと同じになってしまう
ソフトウェアトランザクショナルメモリはどの環境でも使用可能なのに不利だからほぼ使われていない
さらにRustのshared xor mutableはそれらと独立した話であり共存できる話なのでshared xor mutable必須は問題ない
322デフォルトの名無しさん
2023/09/20(水) 01:44:31.66ID:16Zt41/R 会話のドッジボール
323デフォルトの名無しさん
2023/09/20(水) 09:31:56.94ID:R98wQa7Y >>303
マイニャンバーですね判ります
マイニャンバーですね判ります
324デフォルトの名無しさん
2023/09/20(水) 09:33:37.66ID:R98wQa7Y325デフォルトの名無しさん
2023/09/20(水) 09:37:31.04ID:R98wQa7Y >>313
いやいやωωω
いやいやωωω
326デフォルトの名無しさん
2023/09/20(水) 09:39:49.95ID:erhjcmms327デフォルトの名無しさん
2023/09/20(水) 09:41:04.74ID:erhjcmms328デフォルトの名無しさん
2023/09/20(水) 10:30:52.85ID:jgkdiTgC SQLiteはファイルロックに頼らざるを得ない仕組みなのでDBとしては特殊
329デフォルトの名無しさん
2023/09/20(水) 11:17:52.24ID:InZb605T 俺が高校生だった25年前頃、志木駅で500円分ぐらいのパンを買ったら4000円ぐらい請求されたぞ
330デフォルトの名無しさん
2023/09/20(水) 11:46:41.00ID:UfpBE+4Y まあ他のバグが減ればその分本質的な問題に注力出来るわな
そういうのはテストケースも綿密に行う必要がある
そういうのはテストケースも綿密に行う必要がある
331デフォルトの名無しさん
2023/09/20(水) 12:17:55.14ID:1SabZs8d >>317
むしろナチュラルキーにして詰んだりバグってる
むしろナチュラルキーにして詰んだりバグってる
332デフォルトの名無しさん
2023/09/20(水) 13:53:51.14ID:56axJTdd ナチュラルキーがプロジェクトの最後までユニーク保障されたことなんかマジで無いズラ
サロゲートキーは必須ズラ
サロゲートキーは必須ズラ
333デフォルトの名無しさん
2023/09/20(水) 14:13:13.56ID:I55f6i4N 今日入門した。ツアーやったらサンプルプログラムが80個ぐらいできた
fn a(i: i32){ println!("{}",i) }
fn main(){ let x = 10; a(x); a(x) }
これは10が2回出力される
構造体引数だと2回よべずにエラーが出たけど
プリミティブ型?なら所有権がどうのとかなくてスタックにコピーされるだけであってる?
fn a(i: i32){ println!("{}",i) }
fn main(){ let x = 10; a(x); a(x) }
これは10が2回出力される
構造体引数だと2回よべずにエラーが出たけど
プリミティブ型?なら所有権がどうのとかなくてスタックにコピーされるだけであってる?
334333
2023/09/20(水) 14:30:53.92ID:I55f6i4N 別のチュートリアル始めて理解した
コピートレイトが実装されてるからなのか
コピートレイトが実装されてるからなのか
335デフォルトの名無しさん
2023/09/20(水) 15:53:12.11ID:R98wQa7Y #[derive(Copy)] 禁止
336デフォルトの名無しさん
2023/09/20(水) 18:16:56.45ID:52Xj2Gp1 >>328
他のDBMSでもプロセス間の排他制御は
出来る方法が限られているのでファイルロックを
使っている可能性が高い。
他の方法だと、mkdir 法や、名前付きパイプが
あることがあるが、ファイルロックの方が便利。
一つのプロセスの中のスレッド間の排他制御は
色々な方法が有るが、プロセスを越えた排他制御
は意外と他に出来る方法が無いから。
他のDBMSでもプロセス間の排他制御は
出来る方法が限られているのでファイルロックを
使っている可能性が高い。
他の方法だと、mkdir 法や、名前付きパイプが
あることがあるが、ファイルロックの方が便利。
一つのプロセスの中のスレッド間の排他制御は
色々な方法が有るが、プロセスを越えた排他制御
は意外と他に出来る方法が無いから。
337デフォルトの名無しさん
2023/09/20(水) 18:33:23.45ID:I55f6i4N338デフォルトの名無しさん
2023/09/20(水) 18:51:23.96ID:o02nl+od rustの名前の由来は?
339デフォルトの名無しさん
2023/09/20(水) 19:07:11.98ID:DDNbmZRy340デフォルトの名無しさん
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のパッケージ名が変わったりしたのでしょうか
わかる人いますか
[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のパッケージ名が変わったりしたのでしょうか
わかる人いますか
341デフォルトの名無しさん
2023/09/20(水) 20:29:54.63ID:X4X5BtpX342デフォルトの名無しさん
2023/09/20(水) 21:48:28.31ID:UIQvYKk8 >>331
ナチュラルキーをまともに扱えない奴はそもそも設計者失格だろう
ナチュラルキーをまともに扱えない奴はそもそも設計者失格だろう
343デフォルトの名無しさん
2023/09/20(水) 22:20:31.31ID:DDNbmZRy >>340
単純に動かすだけならdev-dependenciesからdependenciesに移せばいいと思う
テスト用の依存としてdev-dependenciesにこだわるなら
use beryllium::*;
の前に
extern crate beryllium;
を入れれば通るかな
あまりdev-dependencies使わないから分からん
単純に動かすだけならdev-dependenciesからdependenciesに移せばいいと思う
テスト用の依存としてdev-dependenciesにこだわるなら
use beryllium::*;
の前に
extern crate beryllium;
を入れれば通るかな
あまりdev-dependencies使わないから分からん
344デフォルトの名無しさん
2023/09/20(水) 22:37:25.93ID:I55f6i4N >>343 ありがとうございます、動かせました!楽しい
345デフォルトの名無しさん
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は関係ない
testやbenchやexampleだけで使う依存を定義するやつ
https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html#development-dependencies
main関数の中で必要なら普通のdependencyにしないといけない
extern crateは関係ない
346デフォルトの名無しさん
2023/09/20(水) 23:35:58.10ID:8RfwRI5f347デフォルトの名無しさん
2023/09/21(木) 00:37:39.43ID:hd16Ksmk >>336
単一ファイルでまかなうSqliteと一緒にすんな
単一ファイルでまかなうSqliteと一緒にすんな
348デフォルトの名無しさん
2023/09/21(木) 02:18:25.33ID:AFY6neVf >>341
CreateMutex()の第三引数に名前を指定しなければ
ならないが、ユニークな名前をどうやって作るか
が大問題になるよね。
その点、LockFile() なら名前衝突の問題は
最初から簡単に確実に回避できる。
CreateMutex()の第三引数に名前を指定しなければ
ならないが、ユニークな名前をどうやって作るか
が大問題になるよね。
その点、LockFile() なら名前衝突の問題は
最初から簡単に確実に回避できる。
349デフォルトの名無しさん
2023/09/21(木) 03:10:10.71ID:2dN46EMa 普通のDBってインターフェースを一つのサーバーで提供してると思うんだけど
名前解決が出来ない管理なんてあるの?
名前解決が出来ない管理なんてあるの?
350デフォルトの名無しさん
2023/09/21(木) 03:14:44.34ID:AFY6neVf351デフォルトの名無しさん
2023/09/21(木) 04:39:08.18ID:uFUX5dn+ まずプロセスを分けるメリットがない
CPUコアスレッド数のスレッドを立ち上げれば一つのプロセスでそのマシンのリソースを使い切れる
ただし通信待ちでスレッドが止まったらその分のCPUリソースを無駄にしてしまうため各スレッドで複数のタスクを動かす
ただし各スレッドが抱えるタスク数は偏りがちなことが知られているため暇なスレッドは他からタスクを盗んで実行できるようにする
以上のスケジューリングをするのがRustのtokio
CPUコアスレッド数のスレッドを立ち上げれば一つのプロセスでそのマシンのリソースを使い切れる
ただし通信待ちでスレッドが止まったらその分のCPUリソースを無駄にしてしまうため各スレッドで複数のタスクを動かす
ただし各スレッドが抱えるタスク数は偏りがちなことが知られているため暇なスレッドは他からタスクを盗んで実行できるようにする
以上のスケジューリングをするのがRustのtokio
352デフォルトの名無しさん
2023/09/21(木) 08:25:19.60ID:CT30w3BF353デフォルトの名無しさん
2023/09/21(木) 10:46:48.71ID:BwXSXzYj354デフォルトの名無しさん
2023/09/21(木) 10:59:44.45ID:3hJtL3Ib mutable xor sharedはトランザクション分離レベルで言うとSERIALIZABLEだと思うけど、書き込み性能にけっこう致命的なパフォーマンス劣化が出たりしない?
あらかじめ主要な書き込み先オブジェクトの参照を保持しておくとかのオブジェクト指向の定石が利用出来ないし。
あらかじめ主要な書き込み先オブジェクトの参照を保持しておくとかのオブジェクト指向の定石が利用出来ないし。
355デフォルトの名無しさん
2023/09/21(木) 11:03:41.54ID:KbwNEPLt SQLiteは今、日本の人が一人でRustに移植してるみたいだけど?
完成度は知らない
完成度は知らない
356デフォルトの名無しさん
2023/09/21(木) 13:31:34.10ID:cACw6b27 >>351
MySQLやPostgreSQLみたいな普通のDBMSでは
単一プロセスがデーモンとして常駐してファイル更新
を一元管理するのが前提となっているが、
SQLiteでは、そのような常駐プロセスが
存在しなくて、各アプリがSQLiteのライブラリ
プログラムを呼び出して、ライブラリの関数が
排他制御を行なって単一ファイルを壊さないように
ロックしながら互いに強調しつつ、部分書き換えや
部分読み込みを行っている。
つまり、SQLiteは管理を担う単一の常駐プログラム
がなくて、個々のアプリ(の中のライブラリ)が
協調動作するようになっている。
だから、プロセス間で同期を取る仕組みが必要となる。
しかし、CreateMutexでは、ユニークな名前が必要
となってしまい、その名前を決めるのがメンドクサイ。
一方、LockFile だとファイルのパス名で自動的に
ユニークの名前に出来てしまうから、非常に簡単に
安全に正しくロックできる。
MySQLやPostgreSQLみたいな普通のDBMSでは
単一プロセスがデーモンとして常駐してファイル更新
を一元管理するのが前提となっているが、
SQLiteでは、そのような常駐プロセスが
存在しなくて、各アプリがSQLiteのライブラリ
プログラムを呼び出して、ライブラリの関数が
排他制御を行なって単一ファイルを壊さないように
ロックしながら互いに強調しつつ、部分書き換えや
部分読み込みを行っている。
つまり、SQLiteは管理を担う単一の常駐プログラム
がなくて、個々のアプリ(の中のライブラリ)が
協調動作するようになっている。
だから、プロセス間で同期を取る仕組みが必要となる。
しかし、CreateMutexでは、ユニークな名前が必要
となってしまい、その名前を決めるのがメンドクサイ。
一方、LockFile だとファイルのパス名で自動的に
ユニークの名前に出来てしまうから、非常に簡単に
安全に正しくロックできる。
357デフォルトの名無しさん
2023/09/21(木) 16:18:11.92ID:B1OFnXUk 3文字で言うと
358デフォルトの名無しさん
2023/09/21(木) 16:54:51.87ID:2fMT8T96 SQLite便利だよ
359デフォルトの名無しさん
2023/09/21(木) 17:25:46.98ID:WBcwDy8I sqliteは便利だけどテーブルロックなところがうんこなんだよな
begin conccurentとか予定あるらしいが
begin conccurentとか予定あるらしいが
360デフォルトの名無しさん
2023/09/21(木) 20:32:07.68ID:2tR0WsIS 複数のプロセスからアクセスしないのを前提条件に出来る場合もそれなりにあるもんな。
ちょっとしたツールでデータベースのプロセスをいちいち起動するのはわずらわしいし、 sqlite くらいの気軽さはありがたいのは確か。
sqlite みたいな方針のデータベースが他に台頭してないのが不思議なくらいだ。
ちょっとしたツールでデータベースのプロセスをいちいち起動するのはわずらわしいし、 sqlite くらいの気軽さはありがたいのは確か。
sqlite みたいな方針のデータベースが他に台頭してないのが不思議なくらいだ。
361デフォルトの名無しさん
2023/09/21(木) 20:41:30.87ID:PYjX2iWU362デフォルトの名無しさん
2023/09/21(木) 20:59:40.19ID:WBcwDy8I もっとひどいデータベース単位か
https://www.sqlite.org/cgi/src/doc/begin-concurrent/doc/begin_concurrent.md
これでページ単位が導入されても、select for updateみたいに明示的にロック
がほしいな
リトライとかだるい
https://www.sqlite.org/cgi/src/doc/begin-concurrent/doc/begin_concurrent.md
これでページ単位が導入されても、select for updateみたいに明示的にロック
がほしいな
リトライとかだるい
363デフォルトの名無しさん
2023/09/21(木) 20:59:47.82ID:WBcwDy8I もっとひどいデータベース単位か
https://www.sqlite.org/cgi/src/doc/begin-concurrent/doc/begin_concurrent.md
これでページ単位が導入されても、select for updateみたいに明示的にロック
がほしいな
リトライとかだるい
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);
}
}
アルゴリズム自体を変更することで目的としていた処理はできましたが結局このエラーの直し方がわかりません
ライフタイム周りが原因だとは考えていますがどのように修正すればよいしょうか
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);
}
}
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);
}
}
366デフォルトの名無しさん
2023/09/22(金) 12:36:56.71ID:E1X0qleO lifetimeの問題もあるかもしれないがimpl Iteratorの型をとるところに関数内で生成したイテレータを渡しているのがそもそもおかしい
367デフォルトの名無しさん
2023/09/22(金) 13:53:26.70ID:dkRHHNCe >>360
mdb
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を呼び出せばイテレータの型は自動的に推論されると思うんですが...
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の型は一つに固定されませんか?
mapの中に直接クロージャを渡せば確かにその制限に引っかかりますが、今回は再帰の中で一つの関数を使いまわしているのでimpl Iteratorの型は一つに固定されませんか?
371デフォルトの名無しさん
2023/09/22(金) 18:41:57.56ID:v8mgsVW8 >>365
イテレータのまま保持して遅延評価させたいんです
イテレータのまま保持して遅延評価させたいんです
372デフォルトの名無しさん
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
引数型に書いた 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倍ぐらいの長さなので具体的なイテレータの型を書かずにコンパイラ任せにしたかったんですが、話を見る限りどうも無理そうですね...
コンパイル通りました!ありがとうございます!
ただもう少しわがままを言うと、実際の実装ではメソッドチェーンの箇所がこれの2倍ぐらいの長さなので具体的なイテレータの型を書かずにコンパイラ任せにしたかったんですが、話を見る限りどうも無理そうですね...
374デフォルトの名無しさん
2023/09/23(土) 08:15:26.34ID:piK9W+al375デフォルトの名無しさん
2023/09/23(土) 09:19:17.35ID:lKOAbDFW 可能なら dyn は避けるに越したことは無い。
dyn はトレイトオブジェクトを扱うための仕組みであって
推論を補助する仕組みではないから。
dyn はトレイトオブジェクトを扱うための仕組みであって
推論を補助する仕組みではないから。
376デフォルトの名無しさん
2023/09/23(土) 09:55:40.35ID:piK9W+al >>375
実装の隠蔽目的でdyn使うのはそんなに変な使い方ではないと思うが
実装の隠蔽目的でdyn使うのはそんなに変な使い方ではないと思うが
377デフォルトの名無しさん
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が単にジェネリクスの糖衣構文であるということと、
トレイト境界を満たす型をジェネリクス引数に渡した場合は合法に"ならなければならない"、トレイト境界は十分条件も満たさなくてはならないという点を解っていなかったのがポイントでした...
補足すると今回自分がわかっていなかったのは以下のような関数がコンパイルを通らないということですね
```
fn hoge<T>(a: i64, b: &mut T) {
*b = a;
}
```
impl Traitが単にジェネリクスの糖衣構文であるということと、
トレイト境界を満たす型をジェネリクス引数に渡した場合は合法に"ならなければならない"、トレイト境界は十分条件も満たさなくてはならないという点を解っていなかったのがポイントでした...
379デフォルトの名無しさん
2023/09/23(土) 21:17:07.32ID:piK9W+al 戻り値のimpl Traitと引数のimpl Traitで振る舞い違うのは当たり前ではあるんだけど混乱しやすいポイントではあるかもね
380デフォルトの名無しさん
2023/09/24(日) 12:22:42.57ID:2YTVyUlC 0788デフォルトの名無しさん
2022/06/21(火) 08:59:28.38ID:vO+TReRM
俺はフロントエンドやらないからこのスレでTauriの話をしないでくれ
2022/06/21(火) 08:59:28.38ID:vO+TReRM
俺はフロントエンドやらないからこのスレでTauriの話をしないでくれ
381デフォルトの名無しさん
2023/09/24(日) 12:36:49.28ID:2YTVyUlC382デフォルトの名無しさん
2023/09/25(月) 23:08:53.71ID:OcxuhTB3 rustでdx12ってまともに使えますか?
そろそろc++は卒業したい
そろそろc++は卒業したい
383デフォルトの名無しさん
2023/09/26(火) 10:01:41.63ID:q653RLNX >>382
使えないということだな。
使えないということだな。
384デフォルトの名無しさん
2023/09/26(火) 17:46:11.75ID:WrG1pnap 一応d3d12があるけど、これを直接使うよりwgpu経由のほうがいいんじゃないか?
385デフォルトの名無しさん
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択でいいやん
rust 1ms cargo run --release
go 10ms
c# 40ms dotnet build -c Release
こんなに違うもんなの?
リリースモードでビルドしたつもりだけど
WebAPIのバックエンドどれにするか悩んでたけどもうrust1択でいいやん
386デフォルトの名無しさん
2023/09/26(火) 21:18:52.63ID:rDjR9GdF 最適化で計測対象の処理が丸ごと消えてないかな
どこかでデータのサイズとか集計とか出力してればいいけど
どこかでデータのサイズとか集計とか出力してればいいけど
387デフォルトの名無しさん
2023/09/26(火) 21:22:16.85ID:sfzsNV4F さすがそこまで速くないよね
C#ももっと速いような気がする
C#ももっと速いような気がする
388デフォルトの名無しさん
2023/09/26(火) 21:40:15.73ID:aJs6t/KK コードの問題かベンチマークの問題だね
389デフォルトの名無しさん
2023/09/26(火) 21:41:15.28ID:K0prie5d390デフォルトの名無しさん
2023/09/26(火) 21:41:38.03ID:aJs6t/KK391デフォルトの名無しさん
2023/09/26(火) 21:56:19.26ID:liEPyEVD392デフォルトの名無しさん
2023/09/26(火) 21:59:59.97ID:liEPyEVD つか、goってリリースビルドないやろ?
コンパイルも一瞬でへ?ってなるわ
それぞれ30行未満のコードだけど..
コンパイルも一瞬でへ?ってなるわ
それぞれ30行未満のコードだけど..
393デフォルトの名無しさん
2023/09/26(火) 22:29:35.41ID:liEPyEVD https://controlc.com/77570dbc
goだとこんな感じ
goだとこんな感じ
394デフォルトの名無しさん
2023/09/26(火) 22:43:29.67ID:liEPyEVD ああ、ごめんC#は嘘でしたすみません
3msになりました
3msになりました
395デフォルトの名無しさん
2023/09/26(火) 22:55:30.68ID:liEPyEVD Rustは最強で
C#はメモリ使用量多いがMSが最適化ガンバッテル
Goはメモリ使用量少なくて言語仕様がシンプルだがC#に負けたり...
C#はメモリ使用量多いがMSが最適化ガンバッテル
Goはメモリ使用量少なくて言語仕様がシンプルだがC#に負けたり...
396デフォルトの名無しさん
2023/09/26(火) 23:05:14.16ID:EQtG/kil 意味のないベンチマークだね
ちなみにこういうのはNimが速いと思うよ
結局こういうのってコンパイラの最適化の勝負をしているだけだから
Rustが速いというよりはLLVMが速いだけ
Zigとかでも同じスピードが出るはず
その代わりにコンパイル速度が遅いというデメリットがあるからこれは単なるトレードオフで、用途に応じて適した言語を選択するのが重要ってだけだね
WebAPI作るならIOが結局ボトルネックになるからパフォーマンス気にするにしても別にスクリプト言語じゃないならなんでもいいのよね
好きな言語にすればいいと思う
ちなみにこういうのはNimが速いと思うよ
結局こういうのってコンパイラの最適化の勝負をしているだけだから
Rustが速いというよりはLLVMが速いだけ
Zigとかでも同じスピードが出るはず
その代わりにコンパイル速度が遅いというデメリットがあるからこれは単なるトレードオフで、用途に応じて適した言語を選択するのが重要ってだけだね
WebAPI作るならIOが結局ボトルネックになるからパフォーマンス気にするにしても別にスクリプト言語じゃないならなんでもいいのよね
好きな言語にすればいいと思う
397デフォルトの名無しさん
2023/09/26(火) 23:08:16.82ID:kLEETtIu それはともかく
NimはRustに対して意味のあるアドバンテージ皆無でNimだけは要らん
NimはRustに対して意味のあるアドバンテージ皆無でNimだけは要らん
398デフォルトの名無しさん
2023/09/26(火) 23:14:09.15ID:liEPyEVD まぁ、データベースはおもいっきし叩くね
最初は最強言語じゃなくてわかりやすい2番あたりの言語でいこうと思ってるんだけたんだけど
で、1番ははっきりRustっぽいからわかりやすいからいんだけど、
2番(C#,Go?)がはっきりしないから1番の言語でいいのかなと
最大の目的はサーバー費用を押さえられるように
最初は最強言語じゃなくてわかりやすい2番あたりの言語でいこうと思ってるんだけたんだけど
で、1番ははっきりRustっぽいからわかりやすいからいんだけど、
2番(C#,Go?)がはっきりしないから1番の言語でいいのかなと
最大の目的はサーバー費用を押さえられるように
399デフォルトの名無しさん
2023/09/26(火) 23:14:24.83ID:gNMcg380 Nimはオフサイドルールってだけで試す気にもならないんだよな…
400デフォルトの名無しさん
2023/09/26(火) 23:52:14.82ID:lFc5NXyg >>396
多数の非同期タスクを偏らずスレッド間でスチールしてスケジューリングできるのは現状GoとRustしかない
小規模ならGoでもよいがそれ以上だと言語機能が貧弱なGoは辛くなってきてRustの独壇場
多数の非同期タスクを偏らずスレッド間でスチールしてスケジューリングできるのは現状GoとRustしかない
小規模ならGoでもよいがそれ以上だと言語機能が貧弱なGoは辛くなってきてRustの独壇場
401デフォルトの名無しさん
2023/09/27(水) 00:09:38.71ID:8IPpP98U402デフォルトの名無しさん
2023/09/27(水) 00:11:19.90ID:8IPpP98U この妄想も延々言ってたけどやっと黙るのかな?
470: デフォルトの名無しさん sage 2023/09/26(火) 09:57:28.51 ID:ycG3j/g+
>>469
IaaSの一部にそういうケースがありうるだけだぞ
PaaS (FaaS)は基本的にメモリ使用量✕実行時間で料金が決まる
メモリ使用量は少なければ少ないほどコストに優れている
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 複オジは相変わらず嘘ばっかり
成長しないね
成長しないね
404デフォルトの名無しさん
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]
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]
405デフォルトの名無しさん
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]
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]
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【野球】大谷翔平、佐々木朗希、山本由伸らがWBC辞退なら広がる不協和音… 『過去イチ盛り上がらない大会』になる可能性も★2 [冬月記者★]
- 【国際】ロシアはすでに戦争準備段階――ポーランド軍トップが警告 [ぐれ★]
- 「町中華」の“息切れ倒産”が増加 ブームにも支えられ職人技で踏ん張ってきたが… 大手チェーンは値上げでも絶好調 [ぐれ★]
- 【news23】小川彩佳アナ「ここまでの広がりになるということを、高市総理はどれだけ想像できていたんでしょうね」 日中問題特集で [冬月記者★]
- 毛寧(もう・ねい)報道官「中国に日本の水産品の市場は無い」 高市首相の国会答弁に「中国民衆の強い怒り」 ★2 [ぐれ★]
- 立民・岡田氏の質疑「不適切」 維新・藤田氏、台湾有事答弁巡り [蚤の市★]
