[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 02/26 16:35 / Filesize : 259 KB / Number-of Response : 1020
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Rust part21



1 名前:デフォルトの名無しさん [2023/08/15(火) 22:24:39.45 ID:xzxy4cgp.net]
公式
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/

298 名前:デフォルトの名無しさん mailto:sage [2023/09/18(月) 22:02:21.17 ID:1tuWbz8L.net]
>>291
前置宣言だから綺麗に書けるまである

299 名前:デフォルトの名無しさん mailto:sage [2023/09/18(月) 22:29:41.23 ID:b4Z9xD4H.net]
>>283
Rustは普通というか見た目キレイ側

300 名前:デフォルトの名無しさん mailto:sage [2023/09/18(月) 23:41:51.16 ID:X+wkGtcX.net]
>>290
ロジックが正しくてもバイナリレベルでは脆弱性になることがある。
分かりやすい例では、言語の理屈では寿命を終えたはずのオブジェクトでも再利用される機会がなくて内容が残り続けるとかね。
そういうときにでもどうにかする知見が C/C++ では積み上がってる。

普通に書いて脆弱性が発生しにくいに越したことはないが、脆弱性が発生していることがわかったときに直せる確信があるというのはセキュリティが重要な場面で C/C++ を使う理由になる。
C/C++ が「自分の足を撃つ」ことになるなんてのは百も二百も承知の上で、「自分の足を撃つことも出来る」ことに価値を見いだしてるんだよ。
もともと自分の足を撃つというのは戦争に行かなくて済むようにわざと撃つことがあるというのを下敷きにした言い回しで、危険であると同時にそれが必要なこともあるというニュアンスを含んでいる。

301 名前:デフォルトの名無しさん mailto:sage [2023/09/18(月) 23:47:04.73 ID:h2SSCK+Z.net]
>>294
それRustに対するアドバンテージになってないな
むしろディスアドバンテージ

302 名前:デフォルトの名無しさん mailto:sage [2023/09/19(火) 07:20:03.69 ID:H6NF4sQp.net]
>>294
目的のために敢えてUB引き起こすってこと?

303 名前:デフォルトの名無しさん [2023/09/19(火) 11:44:23.57 ID:B2l8DHRh.net]
>>294
>そういうときにでもどうにかする知見が C/C++ では積み上がってる。

所謂、バッドノウハウね。
そりゃさんざん今までやりまくって、なんなら現在進行形だったりするんだからノウハウも積み上がるさ。

304 名前:デフォルトの名無しさん mailto:sage [2023/09/19(火) 13:23:13.06 ID:Gn3exU3j.net]
データベースのデータファイルの中の構造は、
C言語の「全部生メモリ」状態で、ポインタの
変わりにファイルポジションになっていて
普通に相互リンクトリンクやファイルポジション
をデータの位置を表現するのに使われていたりする。
だから、実行中のプログラムの RAM のメモリー安全
は確保されたとしても、ファイルの中は安全には
ならない。

305 名前:デフォルトの名無しさん mailto:sage [2023/09/19(火) 13:27:32.55 ID:Gn3exU3j.net]
>>298
[補足]
・ポインターの代わりにファイルポジションが使用され、
 古来の plain C と同様のプロググラミングが行なわれている。
・LockFile や fnctl で「部分ロック」が当たり前
 のように使用されており、非常に複雑な
 配慮が必要なプログラミングになっている。

もっといえば、DBMS を使うアプリケーションも、非常に
配慮が必要な場合も多く、どのようなテーブルやカラム構造
にするかは難しい。ID番号をリンクしたり、どうやって
データを参照しあうかなどが生ポインタと同様の難しさ
を持っていて、わずかでも間違えば、全データが論理破損
してしまう可能性を持っている。

306 名前:デフォルトの名無しさん [2023/09/19(火) 14:54:41.30 ID:rHe1cSmV.net]
だれか巻き込まれてないか?
https://www.youtube.com/watch?v=SzpaDEhm-8Q



307 名前:デフォルトの名無しさん mailto:sage [2023/09/19(火) 15:58:16.52 ID:H6NF4sQp.net]
形式検証をrustに組み込むのってどれくらい現実的なんだろ
言語本体ではなくてproc macroで実現できるのかね

308 名前:デフォルトの名無しさん mailto:sage [2023/09/19(火) 16:39:15.02 ID:p1GkLls0.net]
>>299
一般的なDBMSは中央集権でページアクセスを一元管理してるから生ポインタとは全く質が異なる

309 名前:デフォルトの名無しさん mailto:sage [2023/09/19(火) 17:37:47.80 ID:/HqZkxNe.net]
>>302
ただ、購入履歴などは「誰が購入したか」のIDを
購入項目テーブルとユーザーテーブルを結びつける
必要があるので、IDがポインタの役割になる。
わずかでも狂うと、別人が買った項目が結び付け
られてしまう。
値が1つ、または、行が一行でもずれるとほぼ全体が破綻する。

310 名前:デフォルトの名無しさん mailto:sage [2023/09/19(火) 18:14:50.54 ID:mxtPnJ5/.net]
DBでも何でもそうだけどshared xor mutableも必要

311 名前:デフォルトの名無しさん mailto:sage [2023/09/19(火) 18:23:26.80 ID:/HqZkxNe.net]
販売サイトなどのバグって怖くて、500円のものが
バグれば5000円になったりする可能性ある。
そういうものは、プログラミングを気をつける
しかなくて、Rustの安全対策でも防げない。

312 名前:デフォルトの名無しさん mailto:sage [2023/09/19(火) 18:32:19.28 ID:gvKDfDmE.net]
「気を付ける」の内訳にはテストを書く習慣とかが含まれてる。
気を付けないとしょうがないけど
気を付けるのに使える道具はそれなりに揃ってる。

313 名前:デフォルトの名無しさん mailto:sage [2023/09/19(火) 18:34:24.73 ID:mxtPnJ5/.net]
すべてのバグをなくせる言語がないのは当たり前
データ競合により起こるそういう値のバグも現実にあるのだからRustでその手のバグをなくせるのも事実

314 名前:デフォルトの名無しさん mailto:sage [2023/09/19(火) 18:55:07.79 ID:p1GkLls0.net]
>>303
そのレイヤーの話でもDBMSはトランザクション管理されてるから生ポインタとは状況が全く異なる
トランザクショナルメモリで管理された共有メモリと生ポインタの違い(実際はそれよりもまだ差がある)

315 名前:デフォルトの名無しさん mailto:sage [2023/09/19(火) 19:02:27.03 ID:p1GkLls0.net]
>>304
同時実行制御には大きく楽観的制御と悲観的制御があるがshared xor mutableは後者
高い同時実行性能が求められる場合には楽観的同時実行制御を使うことが増えている
DBの話だけでなくロックフリーアルゴリズムも基本は楽観的制御

316 名前:デフォルトの名無しさん mailto:sage [2023/09/19(火) 19:54:07.45 ID:/x1C5Bro.net]
>>309
楽観的排他制御を用いることができる現実的ケースが狭い
衝突した時の処理やり直しコストも考慮する必要がある

その一般的な話とは別にポインタ(参照)の話の方は必ず衝突するためsingle writer xor multiple readersが必須



317 名前:デフォルトの名無しさん mailto:sage [2023/09/19(火) 21:00:27.72 ID:BGD+Lo74.net]
排他制御も凄く奥深い話ではあるが、そういう
ものだけでなく、単なるプログラムミスで、
ID番号が1つずれたり、行がなんらかの事が
原因で1ぎょうずれたりしても、大変な問題
を巻き起こす。だからテストは必須。

318 名前:デフォルトの名無しさん [2023/09/19(火) 21:30:53.89 ID:cyrWzrEE.net]
RDBMSで物理的な一行とか関係ない
テキストファイルに永続化してる素人だな

319 名前:デフォルトの名無しさん mailto:sage [2023/09/19(火) 21:34:30.39 ID:BGD+Lo74.net]
>>312
DBMS自体をプログラムする場合には関係ある。

320 名前:デフォルトの名無しさん mailto:sage [2023/09/19(火) 21:41:37.42 ID:BGD+Lo74.net]
それと、DBMSを使うに徹する場合でも、行に
付ける ID 番号の管理がまた問題になる。
それも慎重に良く考える必要がある。

321 名前:デフォルトの名無しさん mailto:sage [2023/09/19(火) 21:50:10.01 ID:LcWw/5IR.net]
それサロゲートキー義務で設計したらの話でしょ

322 名前:デフォルトの名無しさん mailto:sage [2023/09/19(火) 21:55:08.52 ID:BGD+Lo74.net]
>>315
色々な機能を実装する上で、色々有り得る。

323 名前:デフォルトの名無しさん mailto:sage [2023/09/19(火) 22:32:18.55 ID:e2nf9Krk.net]
>それと、DBMSを使うに徹する場合でも、行に
>付ける ID 番号の管理がまた問題になる。

DB板にもそういうのいるけどRDBにID必要と考えてるやつはもっかい勉強してこい

324 名前:デフォルトの名無しさん [2023/09/19(火) 22:44:03.77 ID:5k6OZf8O.net]
>>310
>楽観的排他制御を用いることができる現実的ケースが狭い
MVCCやCASが楽観的制御
分散非同期が前提の世界では楽観的制御がデフォルト
じゃないとスケールしないから

Rustがコンパイル時悲観的制御にしてるのは実行時の管理を無くしたいからであってポインタだとshared xor mutableが必須だからではない
トランザクショナルメモリがその一例

325 名前:デフォルトの名無しさん [2023/09/19(火) 22:57:59.75 ID:cyrWzrEE.net]
DBMSをプログラムする場合には当然関係ある
でも1行ずれたら大変とかいう下手くそは任されないので関係ない

326 名前:デフォルトの名無しさん mailto:sage [2023/09/19(火) 23:03:17.25 ID:BGD+Lo74.net]
>>319
下手クソとか上手いとかっていうより、
そうならないようなアルゴリズムやデータ構造を
ちゃんと考える能力があるかどうかなん
だろうけどな。



327 名前:デフォルトの名無しさん mailto:sage [2023/09/19(火) 23:06:22.84 ID:r+harKS8.net]
可変参照と不変参照に対してMVCCなんて使えないよ
それはデータをコピーすることと同じになってしまう
ソフトウェアトランザクショナルメモリはどの環境でも使用可能なのに不利だからほぼ使われていない
さらにRustのshared xor mutableはそれらと独立した話であり共存できる話なのでshared xor mutable必須は問題ない

328 名前:デフォルトの名無しさん mailto:sage [2023/09/20(水) 01:44:31.66 ID:16Zt41/R.net]
会話のドッジボール

329 名前:デフォルトの名無しさん [2023/09/20(水) 09:31:56.94 ID:R98wQa7Y.net]
>>303
マイニャンバーですね判ります

330 名前:デフォルトの名無しさん [2023/09/20(水) 09:33:37.66 ID:R98wQa7Y.net]
>>305
500円の商品が5000円になるバグよりも
500円の商品が5円になるバグの方がはるかに怖い

331 名前:デフォルトの名無しさん [2023/09/20(水) 09:37:31.04 ID:R98wQa7Y.net]
>>313
いやいやωωω

332 名前:デフォルトの名無しさん mailto:sage [2023/09/20(水) 09:39:49.95 ID:erhjcmms.net]
>>324
一番の問題は、レジ打ちの人間だったら絶対間違わない
ミスがコンピュータでは起こりえるということだよ。

333 名前:デフォルトの名無しさん mailto:sage [2023/09/20(水) 09:41:04.74 ID:erhjcmms.net]
>>325
DBMSのアルゴリズムやSQLiteのソースなどを見ていたが、
大いに関係あるぞ。

334 名前:デフォルトの名無しさん [2023/09/20(水) 10:30:52.85 ID:jgkdiTgC.net]
SQLiteはファイルロックに頼らざるを得ない仕組みなのでDBとしては特殊

335 名前:デフォルトの名無しさん [2023/09/20(水) 11:17:52.24 ID:InZb605T.net]
俺が高校生だった25年前頃、志木駅で500円分ぐらいのパンを買ったら4000円ぐらい請求されたぞ

336 名前:デフォルトの名無しさん mailto:sage [2023/09/20(水) 11:46:41.00 ID:UfpBE+4Y.net]
まあ他のバグが減ればその分本質的な問題に注力出来るわな
そういうのはテストケースも綿密に行う必要がある



337 名前:デフォルトの名無しさん [2023/09/20(水) 12:17:55.14 ID:1SabZs8d.net]
>>317
むしろナチュラルキーにして詰んだりバグってる

338 名前:デフォルトの名無しさん mailto:sage [2023/09/20(水) 13:53:51.14 ID:56axJTdd.net]
ナチュラルキーがプロジェクトの最後までユニーク保障されたことなんかマジで無いズラ
サロゲートキーは必須ズラ

339 名前:デフォルトの名無しさん mailto:sage [2023/09/20(水) 14:13:13.56 ID:I55f6i4N.net]
今日入門した。ツアーやったらサンプルプログラムが80個ぐらいできた
fn a(i: i32){ println!("{}",i) }
fn main(){ let x = 10; a(x); a(x) }
これは10が2回出力される
構造体引数だと2回よべずにエラーが出たけど
プリミティブ型?なら所有権がどうのとかなくてスタックにコピーされるだけであってる?

340 名前:333 mailto:sage [2023/09/20(水) 14:30:53.92 ID:I55f6i4N.net]
別のチュートリアル始めて理解した
コピートレイトが実装されてるからなのか

341 名前:デフォルトの名無しさん mailto:sage [2023/09/20(水) 15:53:12.11 ID:R98wQa7Y.net]
#[derive(Copy)] 禁止

342 名前:デフォルトの名無しさん mailto:sage [2023/09/20(水) 18:16:56.45 ID:52Xj2Gp1.net]
>>328
他のDBMSでもプロセス間の排他制御は
出来る方法が限られているのでファイルロックを
使っている可能性が高い。
他の方法だと、mkdir 法や、名前付きパイプが
あることがあるが、ファイルロックの方が便利。
一つのプロセスの中のスレッド間の排他制御は
色々な方法が有るが、プロセスを越えた排他制御
は意外と他に出来る方法が無いから。

343 名前:デフォルトの名無しさん mailto:sage [2023/09/20(水) 18:33:23.45 ID:I55f6i4N.net]
>>335
#[derive(Copy,Clone)]はもう試しました
Rustのいいところが失われますね

344 名前:デフォルトの名無しさん [2023/09/20(水) 18:51:23.96 ID:o02nl+od.net]
rustの名前の由来は?

345 名前:デフォルトの名無しさん mailto:sage [2023/09/20(水) 19:07:11.98 ID:DDNbmZRy.net]
https://en.wikipedia.org/wiki/Rust_(fungus)

robustな菌らしい

346 名前:デフォルトの名無しさん mailto:sage [2023/09/20(水) 19:38:07.98 ID:I55f6i4N.net]
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のパッケージ名が変わったりしたのでしょうか
わかる人いますか



347 名前:デフォルトの名無しさん mailto:sage [2023/09/20(水) 20:29:54.63 ID:X4X5BtpX.net]
>>336
さすがにmutex_lock使ってるよ
乏しい経験からの妄想なんかじゃなく、ちゃんとソース見れ

348 名前:デフォルトの名無しさん mailto:sage [2023/09/20(水) 21:48:28.31 ID:UIQvYKk8.net]
>>331
ナチュラルキーをまともに扱えない奴はそもそも設計者失格だろう

349 名前:デフォルトの名無しさん mailto:sage [2023/09/20(水) 22:20:31.31 ID:DDNbmZRy.net]
>>340
単純に動かすだけならdev-dependenciesからdependenciesに移せばいいと思う

テスト用の依存としてdev-dependenciesにこだわるなら
use beryllium::*;
の前に
extern crate beryllium;
を入れれば通るかな
あまりdev-dependencies使わないから分からん

350 名前:デフォルトの名無しさん mailto:sage [2023/09/20(水) 22:37:25.93 ID:I55f6i4N.net]
>>343 ありがとうございます、動かせました!楽しい

351 名前:デフォルトの名無しさん mailto:sage [2023/09/20(水) 23:23:26.93 ID:T1fPPHAq.net]
dev-dependenciesについてはこの辺参照
testやbenchやexampleだけで使う依存を定義するやつ
https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html#development-dependencies

main関数の中で必要なら普通のdependencyにしないといけない
extern crateは関係ない

352 名前:デフォルトの名無しさん mailto:sage [2023/09/20(水) 23:35:58.10 ID:8RfwRI5f.net]
>>331
未来永劫ユニークとノンヌルを単独ナチュラルキーで満たせればいいけど
そうでないときもあるもんね

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

>>337
小さいデータならCopy実装は有利

353 名前:デフォルトの名無しさん [2023/09/21(木) 00:37:39.43 ID:hd16Ksmk.net]
>>336
単一ファイルでまかなうSqliteと一緒にすんな

354 名前:デフォルトの名無しさん mailto:sage [2023/09/21(木) 02:18:25.33 ID:AFY6neVf.net]
>>341
CreateMutex()の第三引数に名前を指定しなければ
ならないが、ユニークな名前をどうやって作るか
が大問題になるよね。
その点、LockFile() なら名前衝突の問題は
最初から簡単に確実に回避できる。

355 名前:デフォルトの名無しさん mailto:sage [2023/09/21(木) 03:10:10.71 ID:2dN46EMa.net]
普通のDBってインターフェースを一つのサーバーで提供してると思うんだけど
名前解決が出来ない管理なんてあるの?

356 名前:デフォルトの名無しさん mailto:sage [2023/09/21(木) 03:14:44.34 ID:AFY6neVf.net]
>>349
なるほど。そういうことか。
SQLiteは、中央サーバー的なプロセスが無いから
事情が違うってことなんだな。



357 名前:デフォルトの名無しさん mailto:sage [2023/09/21(木) 04:39:08.18 ID:uFUX5dn+.net]
まずプロセスを分けるメリットがない
CPUコアスレッド数のスレッドを立ち上げれば一つのプロセスでそのマシンのリソースを使い切れる
ただし通信待ちでスレッドが止まったらその分のCPUリソースを無駄にしてしまうため各スレッドで複数のタスクを動かす
ただし各スレッドが抱えるタスク数は偏りがちなことが知られているため暇なスレッドは他からタスクを盗んで実行できるようにする
以上のスケジューリングをするのがRustのtokio

358 名前:デフォルトの名無しさん mailto:sage [2023/09/21(木) 08:25:19.60 ID:CT30w3BF.net]
https://www.sqlite.org/whyc.html

359 名前:デフォルトの名無しさん mailto:sage [2023/09/21(木) 10:46:48.71 ID:BwXSXzYj.net]
>>352
Rust以外の言語は完全に否定されているけど
今後Rustだけは条件を満たせば採用するとあるね

360 名前:デフォルトの名無しさん mailto:sage [2023/09/21(木) 10:59:44.45 ID:3hJtL3Ib.net]
mutable xor sharedはトランザクション分離レベルで言うとSERIALIZABLEだと思うけど、書き込み性能にけっこう致命的なパフォーマンス劣化が出たりしない?

あらかじめ主要な書き込み先オブジェクトの参照を保持しておくとかのオブジェクト指向の定石が利用出来ないし。

361 名前:デフォルトの名無しさん mailto:sage [2023/09/21(木) 11:03:41.54 ID:KbwNEPLt.net]
SQLiteは今、日本の人が一人でRustに移植してるみたいだけど?
完成度は知らない

362 名前:デフォルトの名無しさん mailto:sage [2023/09/21(木) 13:31:34.10 ID:cACw6b27.net]
>>351
MySQLやPostgreSQLみたいな普通のDBMSでは
単一プロセスがデーモンとして常駐してファイル更新
を一元管理するのが前提となっているが、
SQLiteでは、そのような常駐プロセスが
存在しなくて、各アプリがSQLiteのライブラリ
プログラムを呼び出して、ライブラリの関数が
排他制御を行なって単一ファイルを壊さないように
ロックしながら互いに強調しつつ、部分書き換えや
部分読み込みを行っている。
つまり、SQLiteは管理を担う単一の常駐プログラム
がなくて、個々のアプリ(の中のライブラリ)が
協調動作するようになっている。
だから、プロセス間で同期を取る仕組みが必要となる。
しかし、CreateMutexでは、ユニークな名前が必要
となってしまい、その名前を決めるのがメンドクサイ。
一方、LockFile だとファイルのパス名で自動的に
ユニークの名前に出来てしまうから、非常に簡単に
安全に正しくロックできる。

363 名前:デフォルトの名無しさん mailto:sage [2023/09/21(木) 16:18:11.92 ID:B1OFnXUk.net]
3文字で言うと

364 名前:デフォルトの名無しさん [2023/09/21(木) 16:54:51.87 ID:2fMT8T96.net]
SQLite便利だよ

365 名前:デフォルトの名無しさん mailto:sage [2023/09/21(木) 17:25:46.98 ID:WBcwDy8I.net]
sqliteは便利だけどテーブルロックなところがうんこなんだよな
begin conccurentとか予定あるらしいが

366 名前:デフォルトの名無しさん mailto:sage [2023/09/21(木) 20:32:07.68 ID:2tR0WsIS.net]
複数のプロセスからアクセスしないのを前提条件に出来る場合もそれなりにあるもんな。
ちょっとしたツールでデータベースのプロセスをいちいち起動するのはわずらわしいし、 sqlite くらいの気軽さはありがたいのは確か。
sqlite みたいな方針のデータベースが他に台頭してないのが不思議なくらいだ。



367 名前:デフォルトの名無しさん [2023/09/21(木) 20:41:30.87 ID:PYjX2iWU.net]
>>359
テーブルロックじゃなくデータベースロック
multiple reader xor single writerはデータベース単位

368 名前:デフォルトの名無しさん mailto:sage [2023/09/21(木) 20:59:40.19 ID:WBcwDy8I.net]
もっとひどいデータベース単位か
https://www.sqlite.org/cgi/src/doc/begin-concurrent/doc/begin_concurrent.md
これでページ単位が導入されても、select for updateみたいに明示的にロック
がほしいな
リトライとかだるい

369 名前:デフォルトの名無しさん mailto:sage [2023/09/21(木) 20:59:47.82 ID:WBcwDy8I.net]
もっとひどいデータベース単位か
https://www.sqlite.org/cgi/src/doc/begin-concurrent/doc/begin_concurrent.md
これでページ単位が導入されても、select for updateみたいに明示的にロック
がほしいな
リトライとかだるい

370 名前:デフォルトの名無しさん [2023/09/21(木) 23:58:45.91 ID:+/xN81gC.net]
以下のような関数(実際のものとは少し違いますが)を実装してみたのですがイテレータのメソッドチェーンの箇所で型が合っていないとコンパイルエラーが発生します
アルゴリズム自体を変更することで目的としていた処理はできましたが結局このエラーの直し方がわかりません
ライフタイム周りが原因だとは考えていますがどのように修正すればよいしょうか

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);
}
}

371 名前:デフォルトの名無しさん [2023/09/22(金) 09:19:17.11 ID:dkRHHNCe.net]
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);
}
}

372 名前:デフォルトの名無しさん mailto:sage [2023/09/22(金) 12:36:56.71 ID:E1X0qleO.net]
lifetimeの問題もあるかもしれないがimpl Iteratorの型をとるところに関数内で生成したイテレータを渡しているのがそもそもおかしい

373 名前:デフォルトの名無しさん mailto:sage [2023/09/22(金) 13:53:26.70 ID:dkRHHNCe.net]
>>360
mdb

374 名前:デフォルトの名無しさん [2023/09/22(金) 16:15:11.47 ID:v8mgsVW8.net]
>>366
mapにはhogeの外から引数として関数を渡しているので再帰呼出しごとにイテレータの型は変わらないですし
```
let mut v = Vec::new();
hoge(|(&a, b)| a + b, &[1, 3, 5], &mut v);
```
という形でhogeを呼び出せばイテレータの型は自動的に推論されると思うんですが...

375 名前:デフォルトの名無しさん [2023/09/22(金) 18:07:36.44 ID:KH67E8jw.net]
impl TraitはTraitを実装した型のいずれか一つを受け入れるだけで、Traitを実装した型全てを受け入れるわけではない

376 名前:デフォルトの名無しさん [2023/09/22(金) 18:31:55.39 ID:v8mgsVW8.net]
>>369
mapの中に直接クロージャを渡せば確かにその制限に引っかかりますが、今回は再帰の中で一つの関数を使いまわしているのでimpl Iteratorの型は一つに固定されませんか?



377 名前:デフォルトの名無しさん [2023/09/22(金) 18:41:57.56 ID:v8mgsVW8.net]
>>365
イテレータのまま保持して遅延評価させたいんです

378 名前:デフォルトの名無しさん mailto:sage [2023/09/22(金) 18:43:25.81 ID:8SLDLfd5.net]
関数定義から一意な具体型に推論されるのは戻り値型に書いた 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

379 名前:デフォルトの名無しさん [2023/09/22(金) 19:29:43.87 ID:v8mgsVW8.net]
>>372
コンパイル通りました!ありがとうございます!
ただもう少しわがままを言うと、実際の実装で

380 名前:はメソッドチェーンの箇所がこれの2倍ぐらいの長さなので具体的なイテレータの型を書かずにコンパイラ任せにしたかったんですが、話を見る限りどうも無理そうですね... []
[ここ壊れてます]

381 名前:デフォルトの名無しさん mailto:sage [2023/09/23(土) 08:15:26.34 ID:piK9W+al.net]
>>373
>>372も書いてるけどimpl IteratorをBox<dyn Iterator>にする手もあるよ

382 名前:デフォルトの名無しさん mailto:sage [2023/09/23(土) 09:19:17.35 ID:lKOAbDFW.net]
可能なら dyn は避けるに越したことは無い。
dyn はトレイトオブジェクトを扱うための仕組みであって
推論を補助する仕組みではないから。

383 名前:デフォルトの名無しさん mailto:sage [2023/09/23(土) 09:55:40.35 ID:piK9W+al.net]
>>375
実装の隠蔽目的でdyn使うのはそんなに変な使い方ではないと思うが

384 名前:デフォルトの名無しさん mailto:sage [2023/09/23(土) 09:59:36.45 ID:i9fpyxKg.net]
Box<dyn Trait>で解決しました本当にありがとうございました

385 名前:デフォルトの名無しさん [2023/09/23(土) 16:36:06.31 ID:WPP4nTE5.net]
>>364です
補足すると今回自分がわかっていなかったのは以下のような関数がコンパイルを通らないということですね
```
fn hoge<T>(a: i64, b: &mut T) {
*b = a;
}
```
impl Traitが単にジェネリクスの糖衣構文であるということと、
トレイト境界を満たす型をジェネリクス引数に渡した場合は合法に"ならなければならない"、トレイト境界は十分条件も満たさなくてはならないという点

386 名前:を解っていなかったのがポイントでした... []
[ここ壊れてます]



387 名前:デフォルトの名無しさん mailto:sage [2023/09/23(土) 21:17:07.32 ID:piK9W+al.net]
戻り値のimpl Traitと引数のimpl Traitで振る舞い違うのは当たり前ではあるんだけど混乱しやすいポイントではあるかもね

388 名前:デフォルトの名無しさん mailto:sage [2023/09/24(日) 12:22:42.57 ID:2YTVyUlC.net]
0788デフォルトの名無しさん
2022/06/21(火) 08:59:28.38ID:vO+TReRM
俺はフロントエンドやらないからこのスレでTauriの話をしないでくれ

389 名前:デフォルトの名無しさん [2023/09/24(日) 12:36:49.28 ID:2YTVyUlC.net]
こいつはどうかな
https://zenn.dev/ksilverwall/articles/2869b4c73e6327

390 名前:デフォルトの名無しさん mailto:sage [2023/09/25(月) 23:08:53.71 ID:OcxuhTB3.net]
rustでdx12ってまともに使えますか?
そろそろc++は卒業したい

391 名前:デフォルトの名無しさん mailto:sage [2023/09/26(火) 10:01:41.63 ID:q653RLNX.net]
>>382
使えないということだな。

392 名前:デフォルトの名無しさん mailto:sage [2023/09/26(火) 17:46:11.75 ID:WrG1pnap.net]
一応d3d12があるけど、これを直接使うよりwgpu経由のほうがいいんじゃないか?

393 名前:デフォルトの名無しさん mailto:sage [2023/09/26(火) 18:52:01.41 ID:liEPyEVD.net]
rustとgoとc#でjsonのシリアライズ、デシリアライズ実験したんだけど
rust 1ms cargo run --release
go 10ms
c# 40ms dotnet build -c Release
こんなに違うもんなの?
リリースモードでビルドしたつもりだけど
WebAPIのバックエンドどれにするか悩んでたけどもうrust1択でいいやん

394 名前:デフォルトの名無しさん mailto:sage [2023/09/26(火) 21:18:52.63 ID:rDjR9GdF.net]
最適化で計測対象の処理が丸ごと消えてないかな
どこかでデータのサイズとか集計とか出力してればいいけど

395 名前:デフォルトの名無しさん mailto:sage [2023/09/26(火) 21:22:16.85 ID:sfzsNV4F.net]
さすがそこまで速くないよね
C#ももっと速いような気がする

396 名前:デフォルトの名無しさん mailto:sage [2023/09/26(火) 21:40:15.73 ID:aJs6t/KK.net]
コードの問題かベンチマークの問題だね



397 名前:デフォルトの名無しさん mailto:sage [2023/09/26(火) 21:41:15.28 ID:K0prie5d.net]
>>385
goこのライブラリ使うとどうなる?
https://github.com/goccy/go-json

398 名前:デフォルトの名無しさん mailto:sage [2023/09/26(火) 21:41:38.03 ID:aJs6t/KK.net]
>>378
>fn hoge<T>(a: i64, b: &mut T)
fn hoge<T>(a: T, b: &mut T)にすればいいと思うけど
同じような解決策が>>364にあるということなの?






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<259KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef