公式
https://www.rust-lang.org/
https://blog.rust-lang.org/
https://github.com/rust-lang/rust
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 part17
https://mevius.5ch.net/test/read.cgi/tech/1665063793/
探検
Rust part18
■ このスレッドは過去ログ倉庫に格納されています
2022/12/10(土) 18:17:02.61ID:XSNoXTPt
724デフォルトの名無しさん
2023/01/06(金) 08:20:37.92ID:7YOuN382 ムーブとRAIIあたりはC++くらいしか似てるものがない気はする
他はそんなに似てないかな
他はそんなに似てないかな
725デフォルトの名無しさん
2023/01/06(金) 11:05:56.60ID:W6TcEBoi C++は似てる似てない以前にちゃんとした知識がないわ。
726デフォルトの名無しさん
2023/01/06(金) 11:09:49.68ID:oG71Qopd727デフォルトの名無しさん
2023/01/06(金) 11:11:24.59ID:oG71Qopd >>723
俺もメジャーな言語ならSwiftが一番近いと思う
俺もメジャーな言語ならSwiftが一番近いと思う
728デフォルトの名無しさん
2023/01/06(金) 11:25:37.00ID:3gqx/ngg Kotlin/Nativeもポインタ触れたりして結構似てるぞい
根幹をC++で作ってるから当たり前なんだけどもw
根幹をC++で作ってるから当たり前なんだけどもw
729デフォルトの名無しさん
2023/01/06(金) 11:26:31.04ID:3gqx/ngg Swiftと比べたらKotlin/Native とか下の中の下ではあるがw
730デフォルトの名無しさん
2023/01/06(金) 11:51:53.71ID:6RDP1hdo zigのcomptimeが他言語でもほしいです
731デフォルトの名無しさん
2023/01/06(金) 14:03:28.15ID:jehUaEn+ Rustは型チェッカが厳しすぎるからゴミ言語
732デフォルトの名無しさん
2023/01/06(金) 14:04:50.34ID:+8Hk5pSO 厳しすぎる??
733デフォルトの名無しさん
2023/01/06(金) 14:05:57.12ID:jehUaEn+ 普通にocamlとかのそこらの関数型言語よりはるかに厳しい
734デフォルトの名無しさん
2023/01/06(金) 14:36:09.35ID:s69F+oI7 たぶん型チェックではない気がするけどコンパイラのチェックが厳しいとゴミ言語になる理由がよく分からない
何となくで書けないのが不満なのかクラッシュバグを量産できないのが不満なのか
C言語でも-Wallとか-Werrorをつければ結構コンパイラうるさいよ
RustとCが近いと感じるのは脳内で同等のコードをイメージしやすいからかな
RustとC++はそんなに近いとは思わない(被ってる部分もあるけど別方向に派生したC言語という感じ)
何となくで書けないのが不満なのかクラッシュバグを量産できないのが不満なのか
C言語でも-Wallとか-Werrorをつければ結構コンパイラうるさいよ
RustとCが近いと感じるのは脳内で同等のコードをイメージしやすいからかな
RustとC++はそんなに近いとは思わない(被ってる部分もあるけど別方向に派生したC言語という感じ)
735デフォルトの名無しさん
2023/01/06(金) 14:40:01.34ID:rO9XvLaF >>733
具体的には?OCamlではどうでRustではどうって例ある?
具体的には?OCamlではどうでRustではどうって例ある?
736デフォルトの名無しさん
2023/01/06(金) 14:48:19.40ID:17lyPwSx737デフォルトの名無しさん
2023/01/06(金) 14:50:54.43ID:jehUaEn+738デフォルトの名無しさん
2023/01/06(金) 14:52:43.20ID:jehUaEn+739デフォルトの名無しさん
2023/01/06(金) 14:56:59.14ID:WgqbE23F740デフォルトの名無しさん
2023/01/06(金) 15:15:47.67ID:pLqfOblc 毎日似たようなやつ出てくるな
741デフォルトの名無しさん
2023/01/06(金) 15:30:04.53ID:eVJa6RQn742デフォルトの名無しさん
2023/01/06(金) 15:32:03.05ID:Kzld2VSs743デフォルトの名無しさん
2023/01/06(金) 15:40:58.01ID:rO9XvLaF >>738
> 後はRustとは違って型推論をさせるコツというのが少ない
(´・∀・`)ヘー
でも少ないどころかOCamlに
「型推論をさせるコツ」なんてもんがそもそもあっただろうか…
型チェッカがどうこうは実は今もよくわからんけど
型の推論はRustのほうが数段ショボい感じ
「型推論をさせるコツ」とかいう話も大変Rustっぽい
> 後はRustとは違って型推論をさせるコツというのが少ない
(´・∀・`)ヘー
でも少ないどころかOCamlに
「型推論をさせるコツ」なんてもんがそもそもあっただろうか…
型チェッカがどうこうは実は今もよくわからんけど
型の推論はRustのほうが数段ショボい感じ
「型推論をさせるコツ」とかいう話も大変Rustっぽい
744デフォルトの名無しさん
2023/01/06(金) 15:54:57.11ID:17lyPwSx 「Rustを勉強したい」「WasmをRustで決まり」みたいな話ばかりで
実際に作ってる人がほぼ居ないのがRust。
実際に作ってる人がほぼ居ないのがRust。
745デフォルトの名無しさん
2023/01/06(金) 16:18:23.51ID:ka2uAVZR rust も ocaml も型推論はHindley Milnerベースだろ。
rustで厳しいのはボローチェックやライフタイムのせいじゃないの?
それらも型に含める?広義では含むか、でも狭義にはちょと違うような。
rustで厳しいのはボローチェックやライフタイムのせいじゃないの?
それらも型に含める?広義では含むか、でも狭義にはちょと違うような。
746デフォルトの名無しさん
2023/01/06(金) 16:52:55.39ID:1HBuA6S6 ボローチェックやライフタイムをそこまで低レイヤー向けじゃない言語に入れてみた方が需要あるんじゃないかね。
747デフォルトの名無しさん
2023/01/06(金) 17:37:26.05ID:sXnz8uH8 低レイヤー向けじゃないならGC使えばいいんだからライフタイムチェックなんてする意味無くね
748デフォルトの名無しさん
2023/01/06(金) 17:45:15.81ID:bmHmWdW4 意図しない変数書き換えはGCで防げないと思う
749デフォルトの名無しさん
2023/01/06(金) 18:18:03.78ID:4UTCkTyw750デフォルトの名無しさん
2023/01/06(金) 18:31:21.73ID:fURAHMja751デフォルトの名無しさん
2023/01/06(金) 18:52:06.69ID:/TzNSUVA プロファイラーの皆さん鑑定お願いします
Cyclonベースのセマンティクスでホラ吹いてた複オジ
https://mevius.5ch.net/test/read.cgi/tech/1663409149/352
https://mevius.5ch.net/test/read.cgi/tech/1670663822/713
イキ〇トリップオジ
https://i.imgur.com/c9uHodQ.png
https://mevius.5ch.net/test/read.cgi/tech/1672635305/17
Cyclonベースのセマンティクスでホラ吹いてた複オジ
https://mevius.5ch.net/test/read.cgi/tech/1663409149/352
https://mevius.5ch.net/test/read.cgi/tech/1670663822/713
イキ〇トリップオジ
https://i.imgur.com/c9uHodQ.png
https://mevius.5ch.net/test/read.cgi/tech/1672635305/17
752デフォルトの名無しさん
2023/01/06(金) 18:52:10.12ID:BFPx2dVd しかし、Rustが流行ってよかったよ。
ScalaやHaskellみたいなモナモナした言語が未来って言われても全然ピンとこなかったからな。
ScalaやHaskellみたいなモナモナした言語が未来って言われても全然ピンとこなかったからな。
753デフォルトの名無しさん
2023/01/06(金) 19:08:18.00ID:t6RUMnc7754デフォルトの名無しさん
2023/01/06(金) 20:49:12.83ID:AnNs2Aua くそーCreateProcessWがGetLastError=87で動かねぇ・・・
昔も苦労させられた記憶があるし結構鬼門なんだよなー
昔も苦労させられた記憶があるし結構鬼門なんだよなー
755デフォルトの名無しさん
2023/01/06(金) 21:03:28.10ID:s69F+oI7756デフォルトの名無しさん
2023/01/06(金) 21:18:35.59ID:AnNs2Aua757デフォルトの名無しさん
2023/01/06(金) 21:37:34.65ID:11CvjFzC758デフォルトの名無しさん
2023/01/06(金) 21:46:50.80ID:+u5r9Ozg Web系はフロントはTypeScript/JavaScript、サーバーサイドはGoしか有り得ない
759デフォルトの名無しさん
2023/01/06(金) 22:09:16.12ID:AnNs2Aua #[link(name = "kernel32")]
extern "stdcall" {
fn CreateProcessW (
lpApplicationName: *mut u16,
lpCommandLine: u64,
lpProcessAttributes: u64,
lpThreadAttributes: u64,
bInheritHandles: u32,
dwCreationFlags: u32,
lpCurrentDirectory: u64,
lpStartupInfo: *const u8,
lpProcessInformation: *mut u8
) -> u32;
}
fn main() {
let mut cl:[u16; 5] = [0x63, 0x61, 0x6c, 0x63, 0x00]; // "calc\0"
let mut si:[u8; 104] = [0; 104];
si[0] = 104;
let mut pi:[u8; 24] = [0; 24];
let mut ret;
unsafe {ret = CreateProcessW (cl.as_mut_ptr(), 0, 0, 0, 0, 0, 0, si.as_ptr(), pi.as_mut_ptr());}
}
>error: process didn't exit successfully: `target\debug\test03.exe` (exit code: 0xc0000005, STATUS_ACCESS_VIOLATION)
ここまで単純化しても動かねぇ・・・というかsiとpiの正しいサイズがわからない
extern "stdcall" {
fn CreateProcessW (
lpApplicationName: *mut u16,
lpCommandLine: u64,
lpProcessAttributes: u64,
lpThreadAttributes: u64,
bInheritHandles: u32,
dwCreationFlags: u32,
lpCurrentDirectory: u64,
lpStartupInfo: *const u8,
lpProcessInformation: *mut u8
) -> u32;
}
fn main() {
let mut cl:[u16; 5] = [0x63, 0x61, 0x6c, 0x63, 0x00]; // "calc\0"
let mut si:[u8; 104] = [0; 104];
si[0] = 104;
let mut pi:[u8; 24] = [0; 24];
let mut ret;
unsafe {ret = CreateProcessW (cl.as_mut_ptr(), 0, 0, 0, 0, 0, 0, si.as_ptr(), pi.as_mut_ptr());}
}
>error: process didn't exit successfully: `target\debug\test03.exe` (exit code: 0xc0000005, STATUS_ACCESS_VIOLATION)
ここまで単純化しても動かねぇ・・・というかsiとpiの正しいサイズがわからない
760デフォルトの名無しさん
2023/01/06(金) 23:17:27.61ID:AnNs2Aua よーくみたら引数が1個足りなかったw コピペ時にガバったか
761デフォルトの名無しさん
2023/01/06(金) 23:35:04.42ID:aB3JGFOO The Book 10.1に掲載されていたlargest関数を、
参照でかけたりしないのかなと思い試しているのですがうまくいきません。。
どうやって書いたらよいのでしょう?
fn largest<T: PartialOrd + Copy>(list: &[T]) -> &T {
let mut res: &T = &list[0];
for &elem in list.iter() {
if elem > *res {
res = &elem;
}
}
res
}
参照でかけたりしないのかなと思い試しているのですがうまくいきません。。
どうやって書いたらよいのでしょう?
fn largest<T: PartialOrd + Copy>(list: &[T]) -> &T {
let mut res: &T = &list[0];
for &elem in list.iter() {
if elem > *res {
res = &elem;
}
}
res
}
762デフォルトの名無しさん
2023/01/06(金) 23:37:50.69ID:AnNs2Aua 今度はWaitForSingleObjectで止まらない。というか
ttps://learn.microsoft.com/ja-jp/windows/win32/procthread/creating-processes
これをコピペしてコンパイルして電卓を起動させても止まらない。どうなっているのw
って思ったらcalc.exeはラッパーで即終了していたというオチ。MSはロクなことしないな
ttps://learn.microsoft.com/ja-jp/windows/win32/procthread/creating-processes
これをコピペしてコンパイルして電卓を起動させても止まらない。どうなっているのw
って思ったらcalc.exeはラッパーで即終了していたというオチ。MSはロクなことしないな
763デフォルトの名無しさん
2023/01/06(金) 23:51:15.52ID:sXnz8uH8764デフォルトの名無しさん
2023/01/06(金) 23:53:05.97ID:/3LWOZ61765デフォルトの名無しさん
2023/01/07(土) 00:26:35.07ID:+QPNW5aO766デフォルトの名無しさん
2023/01/07(土) 01:02:32.01ID:dLMo+qnq >>765
こっちじゃ第1引数使うなら"C:\\Windows\\system32\\calc.exe\0"以外は
GetLastError()が2(ERROR_PATH_NOT_FOUND)を返してきて動かんのだけど……
MSDNも第1引数の説明にだけパス検索はしないだの拡張子つけろだの書いてあって、その通りに動作してるだけのように見えるし
https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createprocessw
> The function will not use the search path. This parameter must include the file name extension; no default extension is assumed.
こっちじゃ第1引数使うなら"C:\\Windows\\system32\\calc.exe\0"以外は
GetLastError()が2(ERROR_PATH_NOT_FOUND)を返してきて動かんのだけど……
MSDNも第1引数の説明にだけパス検索はしないだの拡張子つけろだの書いてあって、その通りに動作してるだけのように見えるし
https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createprocessw
> The function will not use the search path. This parameter must include the file name extension; no default extension is assumed.
767デフォルトの名無しさん
2023/01/07(土) 01:04:28.02ID:piTlebRA >>761
とりあえず修正したコード
fn largest<T: PartialOrd>(list: &[T]) -> &T {
let mut res: &T = &list[0];
for elem in list.iter() {
if *elem > *res {
res = elem;
}
}
res
}
forの変数elemの型が諸々の事情でTになってたから&Tに直した
ついでにTのCopyもいらなくなりそうだから外した
letとかも同じだけど
let &x = ...
みたいに受け取る側に&をつけるとxの型は入れる値の&を外した型になる(とても雑な説明)
とりあえず修正したコード
fn largest<T: PartialOrd>(list: &[T]) -> &T {
let mut res: &T = &list[0];
for elem in list.iter() {
if *elem > *res {
res = elem;
}
}
res
}
forの変数elemの型が諸々の事情でTになってたから&Tに直した
ついでにTのCopyもいらなくなりそうだから外した
letとかも同じだけど
let &x = ...
みたいに受け取る側に&をつけるとxの型は入れる値の&を外した型になる(とても雑な説明)
768デフォルトの名無しさん
2023/01/07(土) 01:08:28.51ID:4uiRCztN iter().min::<T>()みたいにかけないっけ
うんこまん
うんこまん
769デフォルトの名無しさん
2023/01/07(土) 01:32:02.10ID:kRb596bj771デフォルトの名無しさん
2023/01/07(土) 02:06:28.88ID:+QPNW5aO ・system()っぽい関数(起動したプロセスが終了するまでブロックする)
・CreateProcessW失敗時は起動失敗を呼び出し元に通知したい
・成功時に戻すべき情報はない
・Rust的にはResultを返すのが定石?
こういう時のコーディング例とかググっても全然出てこなくね・・・
重要なのはOk/Errのみで返り値は不要みたいなケース
とりあえずbool返しにしておくか
>>766
あれ?確かに。すまん気のせいだったっぽい
・CreateProcessW失敗時は起動失敗を呼び出し元に通知したい
・成功時に戻すべき情報はない
・Rust的にはResultを返すのが定石?
こういう時のコーディング例とかググっても全然出てこなくね・・・
重要なのはOk/Errのみで返り値は不要みたいなケース
とりあえずbool返しにしておくか
>>766
あれ?確かに。すまん気のせいだったっぽい
772デフォルトの名無しさん
2023/01/07(土) 02:31:58.39ID:6JfdJVIo773デフォルトの名無しさん
2023/01/07(土) 02:40:46.97ID:nUzzs5ki774デフォルトの名無しさん
2023/01/07(土) 11:49:37.35ID:TSp0PKQI >>747
変数間でのオブジェクトの共有が気になるシチュエーションはjavaなんかは結構あると思う。
変数間でのオブジェクトの共有が気になるシチュエーションはjavaなんかは結構あると思う。
775デフォルトの名無しさん
2023/01/07(土) 16:25:18.46ID:dLMo+qnq rust-analyzerにもVSみたいにドロップダウンでplatform切り替える機能ほしいのう
cfgで複数のplatformに対応しているタイプのライブラリで便利そう
cfgで複数のplatformに対応しているタイプのライブラリで便利そう
776デフォルトの名無しさん
2023/01/07(土) 16:40:32.23ID:+QPNW5aO 継続不可能な状態→エラーダイアログを表示
ここまではいいけどこの後の後始末ってどう書くのがいいんだろうな
後始末のために共有データ(起動時に設定ファイルから読み込む)にアクセスしたいが
Dropトレイトにしろパニックハンドラにしろmainとは別スコープなのでアクセスできない
後始末のスコープ中で共有データを読み直すという手もあるけど、本当に意図しない状態で
強制終了する場合にファイルのロード&パースをするのが望ましいとは思えない
Dropトレイトの初期化時に共有データの参照を渡しておくとか?
ここまではいいけどこの後の後始末ってどう書くのがいいんだろうな
後始末のために共有データ(起動時に設定ファイルから読み込む)にアクセスしたいが
Dropトレイトにしろパニックハンドラにしろmainとは別スコープなのでアクセスできない
後始末のスコープ中で共有データを読み直すという手もあるけど、本当に意図しない状態で
強制終了する場合にファイルのロード&パースをするのが望ましいとは思えない
Dropトレイトの初期化時に共有データの参照を渡しておくとか?
777デフォルトの名無しさん
2023/01/07(土) 17:10:37.53ID:piTlebRA >>776
mainの中で初期化してResultを返す本処理を呼ぶ形は無理?
fn main() {
// 初期化(設定読み込み)
let info = ...;
// 本処理
let result = main_body(&info);
match result {
OK(_) => {}
Err(e) => {
// エラー処理(info使える)
}
}
}
mainの中で初期化してResultを返す本処理を呼ぶ形は無理?
fn main() {
// 初期化(設定読み込み)
let info = ...;
// 本処理
let result = main_body(&info);
match result {
OK(_) => {}
Err(e) => {
// エラー処理(info使える)
}
}
}
778デフォルトの名無しさん
2023/01/07(土) 18:02:32.48ID:+QPNW5aO >>777
それコードの位置が逆なだけじゃ。というかResult返しの実装方法を理解できていない
とりあえず共有データを保持している構造体にdropを実装してみた
自身へのアクセスは可能だしmainの終了時に実行される・・・はず
それコードの位置が逆なだけじゃ。というかResult返しの実装方法を理解できていない
とりあえず共有データを保持している構造体にdropを実装してみた
自身へのアクセスは可能だしmainの終了時に実行される・・・はず
779デフォルトの名無しさん
2023/01/07(土) 18:21:41.85ID:S1LntPIN780デフォルトの名無しさん
2023/01/08(日) 00:10:22.65ID:lAEXMGQ2 Rustってゲームに向いてそうなイメージあるけどどうなんだろ
メモリリークは相当起きにくいよな?
メモリリークは相当起きにくいよな?
781デフォルトの名無しさん
2023/01/08(日) 00:39:44.59ID:li8iVC1C ゲーム開発はトリッキーな手品も使うだろうから向いてないんじゃないか
782デフォルトの名無しさん
2023/01/08(日) 00:51:12.10ID:RrQeMuL+ 今のご時世に非標準的な実装をするゲームとかOSのバージョンアップで爆死する未来が見える
783デフォルトの名無しさん
2023/01/08(日) 01:11:48.94ID:WtSMxRkj >>782
OSに関係無いところでのトリッキーなテクニックは有りえる。
例えば、複数のポインタ用のバッファをまとめてnewで確保してから、
直後に値を代入するようなことはC/C++では簡単に行なえる。
ところが安全性重視の言語だと、非初期化状態のポインタは許されないから、
少なくともnew演算子が自力でNULL初期化しなくてはならないので、
無駄になる。
他にも、配列の範囲チェックが無駄になる。
OSに関係無いところでのトリッキーなテクニックは有りえる。
例えば、複数のポインタ用のバッファをまとめてnewで確保してから、
直後に値を代入するようなことはC/C++では簡単に行なえる。
ところが安全性重視の言語だと、非初期化状態のポインタは許されないから、
少なくともnew演算子が自力でNULL初期化しなくてはならないので、
無駄になる。
他にも、配列の範囲チェックが無駄になる。
784デフォルトの名無しさん
2023/01/08(日) 01:15:49.98ID:WtSMxRkj >>783
ちなみに、
「非初期化状態の変数」は不安定になり易いので減らした方が良いとされているが、
BYTE *dst = new BYTE[1024]; // dst[k] はこの時点では未初期化状態
memcpy( dst, src, size );
のような時にはC++では効率を考えると仕方が無いものと考えられている。
0初期化すると無駄になるから。
ちなみに、
「非初期化状態の変数」は不安定になり易いので減らした方が良いとされているが、
BYTE *dst = new BYTE[1024]; // dst[k] はこの時点では未初期化状態
memcpy( dst, src, size );
のような時にはC++では効率を考えると仕方が無いものと考えられている。
0初期化すると無駄になるから。
785デフォルトの名無しさん
2023/01/08(日) 01:45:10.78ID:f5aNmtma ヒープでいいならVec::with_capacityしてデータ入れた後にBoxed sliceにすればいい話だね
スタックでゼロ初期化した方が性能はいいと思うけど
スタックでゼロ初期化した方が性能はいいと思うけど
786デフォルトの名無しさん
2023/01/08(日) 02:04:33.63ID:DAo3J3pj Box<dyn T>はBox<dyn T + 'static>のライフタイム省略版って聞いてたのに片方だけエラーになる
なんじゃこりゃ
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=21ad8deab1cb8fb311aeed2ee668bf71
なんじゃこりゃ
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=21ad8deab1cb8fb311aeed2ee668bf71
787デフォルトの名無しさん
2023/01/08(日) 02:36:10.85ID:x4fu54u1 Rustのメモリ安全性にはメモリリークしないことは含まれていないんだよね。
Rc<T>で循環参照するデータを作ってもコンパイルエラーにはならずメモリが解放されないままだったはず。
まぁメモリリークしててもメモリがある限り正しい結果を返すわけだし、メモリがなくなったらクラッシュするので間違いが起きたまま動作しつづけることはないけど。
Rc<T>で循環参照するデータを作ってもコンパイルエラーにはならずメモリが解放されないままだったはず。
まぁメモリリークしててもメモリがある限り正しい結果を返すわけだし、メモリがなくなったらクラッシュするので間違いが起きたまま動作しつづけることはないけど。
788デフォルトの名無しさん
2023/01/08(日) 02:55:51.04ID:fOddL1iF Rustは例えばGodotではGDScriptが実質Rustだし相当ゲーム制作に向いてる
https://gitlab.com/the-SSD/gdscript-compiler
https://gitlab.com/the-SSD/gdscript-compiler
789デフォルトの名無しさん
2023/01/08(日) 04:35:49.54ID:kuKYL1oy790デフォルトの名無しさん
2023/01/08(日) 06:55:53.23ID:FeGYfhwG 技術評論社の書籍だろ。
791デフォルトの名無しさん
2023/01/08(日) 11:05:23.60ID:DAo3J3pj >>789
The Rust Referenceだった
この本デタラメなん?
https://doc.rust-lang.org/reference/lifetime-elision.html#default-trait-object-lifetimes
The Rust Referenceだった
この本デタラメなん?
https://doc.rust-lang.org/reference/lifetime-elision.html#default-trait-object-lifetimes
792デフォルトの名無しさん
2023/01/08(日) 11:05:27.68ID:wpyfySyl793デフォルトの名無しさん
2023/01/08(日) 11:21:27.20ID:D257opQI >>791
そこにはライフタイム省略版とは書いてないよ
expressionなどからライフタイムを推論できない場合はstaticになると書いてある
(例えばコード例のようなタイプエイリアスの場合など)
playgroundのコードではu2のライフタイムから推論されるからstaticにはならない
そこにはライフタイム省略版とは書いてないよ
expressionなどからライフタイムを推論できない場合はstaticになると書いてある
(例えばコード例のようなタイプエイリアスの場合など)
playgroundのコードではu2のライフタイムから推論されるからstaticにはならない
794デフォルトの名無しさん
2023/01/08(日) 11:35:19.20ID:4wy9Fp4t >>791
これでしょ?
If the trait object is used as a type argument of a generic type then the containing type is first used to try to infer a bound.
If there is a unique bound from the containing type then that is the default
これでしょ?
If the trait object is used as a type argument of a generic type then the containing type is first used to try to infer a bound.
If there is a unique bound from the containing type then that is the default
795デフォルトの名無しさん
2023/01/08(日) 11:50:51.08ID:DAo3J3pj796デフォルトの名無しさん
2023/01/08(日) 12:37:06.99ID:RrQeMuL+ みんな大好きUnityなどと比べたらRust由来の効率低下なんて微々たるもの
797デフォルトの名無しさん
2023/01/08(日) 13:59:02.14ID:UBD4N3HA798デフォルトの名無しさん
2023/01/08(日) 14:01:25.73ID:tWJ5hYnn799デフォルトの名無しさん
2023/01/08(日) 14:08:03.69ID:OlteebrS >>796
それは言語としての魅力があればの話。
それは言語としての魅力があればの話。
800デフォルトの名無しさん
2023/01/08(日) 15:57:06.75ID:LmL7tvTF >>797
安心安全だなあ
安心安全だなあ
801デフォルトの名無しさん
2023/01/08(日) 16:08:08.46ID:vMQQXEk1 >>797
unsafeの絵面ヤバくて草
unsafeの絵面ヤバくて草
802デフォルトの名無しさん
2023/01/08(日) 16:09:10.68ID:VztT2gmz unsafeで書いたほうがコンパイル速度速くて好き
803デフォルトの名無しさん
2023/01/08(日) 16:30:50.12ID:9eCFH/Xi せめてunsafeの間くらいは起こしてやれよ
804デフォルトの名無しさん
2023/01/08(日) 19:26:34.22ID:2yRrU7ur Rustで多量のファイルを高速に読み込みたい場合ってどうすればいいの?
std::fs::readはVec<u8>を返す=メモリアロケータが動く=遅い
十分なサイズのVecを事前に確保してreadなりReadFileなりを叩けば
任意のアドレスに読み込んでくれるけどほかに方法はないのかな
std::fs::readはVec<u8>を返す=メモリアロケータが動く=遅い
十分なサイズのVecを事前に確保してreadなりReadFileなりを叩けば
任意のアドレスに読み込んでくれるけどほかに方法はないのかな
805デフォルトの名無しさん
2023/01/08(日) 20:32:01.24ID:9eCFH/Xi Rustに限らずreadで遅いと感じるレベルならOS依存のmmap(memmap)くらいしか思いつかない
速さ目的で使ったことないから本当に速くなるか分からないけど
速さ目的で使ったことないから本当に速くなるか分からないけど
806デフォルトの名無しさん
2023/01/08(日) 21:00:35.09ID:gNhHKSa0 The Book を進めていくと Box<trait> でエラーになって Box<dyn trait> に変えろって言われるんだけど、dyn ってなんですか?
807デフォルトの名無しさん
2023/01/08(日) 21:02:45.41ID:lAEXMGQ2 動的 ダイナミック
実行時に決まる的な
実行時に決まる的な
808デフォルトの名無しさん
2023/01/08(日) 21:06:58.13ID:gNhHKSa0809デフォルトの名無しさん
2023/01/08(日) 21:11:02.19ID:rBa/PYaz >>805
1MB/1000個くらいのファイルをstd::fs::readで読みながらVec[u8]に
extend_from_sliceで追加していくコードを書いてみたら数秒かかった
さすがに遅すぎ
せめてVec<u8>→Vec<u8>(の任意のインデックス)みたいなmemcpy的な
コピー手段はないのなか。どのくらい早くなるかわからんが
1MB/1000個くらいのファイルをstd::fs::readで読みながらVec[u8]に
extend_from_sliceで追加していくコードを書いてみたら数秒かかった
さすがに遅すぎ
せめてVec<u8>→Vec<u8>(の任意のインデックス)みたいなmemcpy的な
コピー手段はないのなか。どのくらい早くなるかわからんが
810デフォルトの名無しさん
2023/01/08(日) 21:31:03.29ID:LKKCPrwt >>809
>1MB/1000個くらいのファイル
これはどういう意味?
/ は、割る、または、OR(または) の意味で用いる。
もしかして、
一個当り 1MB のファイルが 1000 個、合計サイズ 1GB の
ファイルのことを言っている?
>1MB/1000個くらいのファイル
これはどういう意味?
/ は、割る、または、OR(または) の意味で用いる。
もしかして、
一個当り 1MB のファイルが 1000 個、合計サイズ 1GB の
ファイルのことを言っている?
811デフォルトの名無しさん
2023/01/08(日) 21:32:08.52ID:LKKCPrwt812デフォルトの名無しさん
2023/01/08(日) 21:37:22.02ID:Ot3XQ+MC >>810
わかりにくくてすまん。ファイル総数1000程度、合計サイズ1MB程度
わかりにくくてすまん。ファイル総数1000程度、合計サイズ1MB程度
813デフォルトの名無しさん
2023/01/08(日) 21:51:35.12ID:iCNAe1YS >>809
リリースビルドでその速度?
リリースビルドでその速度?
814デフォルトの名無しさん
2023/01/08(日) 21:52:13.93ID:lAEXMGQ2 >>808
間違えてるかもしれんが俺の理解だと
>>traitは動的
traitは静的だけど、trait実装してる型が静的/動的に決まるかで
動的→dyn Trait 静的→ジェネリクスやimpl Trait を使い分ける
よくある例では
Vec<T>はT1つ確定して他の型は一切受け付けないけど
Vec<Box<dyn Trait>>はTraitを実装してる型なら何でも入る
間違えてるかもしれんが俺の理解だと
>>traitは動的
traitは静的だけど、trait実装してる型が静的/動的に決まるかで
動的→dyn Trait 静的→ジェネリクスやimpl Trait を使い分ける
よくある例では
Vec<T>はT1つ確定して他の型は一切受け付けないけど
Vec<Box<dyn Trait>>はTraitを実装してる型なら何でも入る
815デフォルトの名無しさん
2023/01/08(日) 22:01:47.30ID:gNhHKSa0816デフォルトの名無しさん
2023/01/08(日) 22:13:49.41ID:V1l2P4XZ817デフォルトの名無しさん
2023/01/08(日) 22:45:09.72ID:HTBsXmSw818デフォルトの名無しさん
2023/01/08(日) 22:48:55.19ID:9eCFH/Xi >>809
memcpyと同じことしたいならstd::ptrにcopyとかcopy_nonoverlappingが用意されてる
ただ引数はポインタだからunsafe
copy_nonoverlappingのExamplesがやりたいことに近いと思う
この例はコピー元のVecを空にしてるけどu8みたいなCopy型に限定すればコピー元のVecをそのままにしても一応安全
memcpyと同じことしたいならstd::ptrにcopyとかcopy_nonoverlappingが用意されてる
ただ引数はポインタだからunsafe
copy_nonoverlappingのExamplesがやりたいことに近いと思う
この例はコピー元のVecを空にしてるけどu8みたいなCopy型に限定すればコピー元のVecをそのままにしても一応安全
819デフォルトの名無しさん
2023/01/08(日) 22:52:59.71ID:9eCFH/Xi 818追記
コピー元が空になっても構わないならVec::appendで同じことができる
コピー元が空になっても構わないならVec::appendで同じことができる
820デフォルトの名無しさん
2023/01/08(日) 23:03:17.84ID:OD5QAUK5821デフォルトの名無しさん
2023/01/09(月) 00:21:25.60ID:L9fsJfRH >>812
1000個のファイルで1秒だと、もともとOSの速度がその程度の場合も有り得そう。
1ファイル当り1(ms)ということになるから。
もともとファイルはそこまで一度に沢山の個数をopen, closeすることは
想定されて無いので。
それもRustの安全機構が遅さに影響を与えているかも。
1000個のファイルで1秒だと、もともとOSの速度がその程度の場合も有り得そう。
1ファイル当り1(ms)ということになるから。
もともとファイルはそこまで一度に沢山の個数をopen, closeすることは
想定されて無いので。
それもRustの安全機構が遅さに影響を与えているかも。
822デフォルトの名無しさん
2023/01/09(月) 00:26:23.50ID:L9fsJfRH >>821
ファイルって、例えばファイラーでコピーする場合でも、合計が同じ容量でも、
細かいファイルが多数有る場合の方がずっと遅くなる。
一個の1MBのファイルをコピーすると一瞬なのに、1KBの1000個のファイルをコピー
すると1秒くらい掛かるかも。
ファイルって、例えばファイラーでコピーする場合でも、合計が同じ容量でも、
細かいファイルが多数有る場合の方がずっと遅くなる。
一個の1MBのファイルをコピーすると一瞬なのに、1KBの1000個のファイルをコピー
すると1秒くらい掛かるかも。
823デフォルトの名無しさん
2023/01/09(月) 01:18:38.59ID:1jv8LwEE profilingしてsyscallがボトルネックになってれば非同期や並列化で高速化するしかない
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- バリ島で男子生徒ら集団万引きか、防犯カメラ映像が拡散 京都の大谷中学・高校が「窃盗行為」謝罪★4 [七波羅探題★]
- 中国軍機レーダー照射、トランプ氏沈黙突く 試される日本外交 [蚤の市★]
- 【地震】青森県で震度6強 長周期地震動も 津波注意報すべて解除 ★7 [ぐれ★] [ぐれ★]
- 【サッカー】58歳カズ「オファーが来ている」 J3福島と近日中にも交渉 早ければ年内にも決断 [征夷大将軍★]
- 【速報】気象庁は津波注意報すべて解除 [蚤の市★]
- 【テレビ】25年ぶり復活「炎のチャレンジャー」南原清隆&菊池風磨がMC 懐かし「電流イライラ棒」も [湛然★]
- 【実況】博衣こよりのえちえち朝こよ🧪
- さかまた「過呼吸になった」かなた「耳聞こえない」ござる「声出ない」まつり「ご飯食べれない」
- 【画像】カリカリ女、脱いだらすごい😨 [632966346]
- 塩ラーメン頼んだら塩水に麺が入ってるラーメンが出てきた
- 早大名誉教授「高市内閣の高支持率はデータ操作か、支持している日本人がアホなのか」👈核心を突いてしまう [868050967]
- お前らいじめんの飽きた
