Rust part18

■ このスレッドは過去ログ倉庫に格納されています
2022/12/10(土) 18:17:02.61ID:XSNoXTPt
公式
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/
2023/01/04(水) 21:25:52.36ID:oUT+lvyR
なんかまたErrorトレイトのメソッド変わってる……
見落としてたけど1.64からでしたか
2023/01/04(水) 21:59:12.78ID:lFNs7lW+
>>694
なにが欠陥なのか指摘も出来ないクズ乙
2023/01/04(水) 23:47:28.90ID:tw+8ew0C
まあリーナスみたいに的確な指摘がちゃんと出来れば皆聞く耳を持つだろうにね
2023/01/05(木) 01:09:00.20ID:DO2QGxg+
>>697
Linusみたいな有名人が言ったら信じるだけで、
ちゃんと説明しても自分の頭で理解できない人が多い。
2023/01/05(木) 01:10:45.51ID:9rdfNmCZ
それ以前に欠陥の具体例すら挙がってないが
2023/01/05(木) 01:14:21.99ID:DO2QGxg+
>>699
このスレや前スレで何度も上がってる。
2023/01/05(木) 01:23:36.54ID:55d9gDO6
複数の実装を抽象化する想定のtraitにErrorなどというassociated typeを持たせて実装を分けてしまうと死ぬほど面倒だということを学んだ
2023/01/05(木) 12:28:43.89ID:QUS/oJRF
windows::~の使い方の情報が少なすぎ。String→PCWSTRの変換方法もよくわからないし
MessageBoxWに任意の文字列を表示することすら不安定
FFIでuser32のMessageBoxWを直接叩いたほうがマシ。こっちならさすがに安定するようだ
2023/01/05(木) 13:45:51.93ID:W/FjpTuq
制限多いしリファクタリングしづらいわな
2023/01/05(木) 17:20:24.40ID:YRkXkG+b
結果汚コードまみれのゴミになる
2023/01/05(木) 17:33:14.38ID:Hd+KI7WM
>>702
Rustの文字列はUTF-8でナル終端なしだからワイド文字だと
・UTF-8→UTF-16変換
・'\0'追加
の2段階の操作が必要

ナル終端だけならstd::ffi::CStringでいけるけど、ワイド文字(UTF-16)使うなら
内部でVec<u16>を保持する専用の文字列型を用意した方がよさそう

あとはwindows::core::PWCSTR::from_ptr()にVec::as_ptr()を渡してPWCSTRを作る
このPWCSTRが使われてる間はVecを消したり変更したりすると危ないけど
&PCWSTRで返す形にすればライフタイムで束縛できるかな

この辺の操作はwindows-rsでも直のFFIでも変わらないと思う
2023/01/05(木) 18:06:32.68ID:QUS/oJRF
>>705
そんな感じで実験してみたんだけど不定期にMessageBoxWが意図しない文字列を表示する
ボローチェッカーは何も言わないけど結果からすると明らかに信用ならない
FFI利用の直叩きなら問題ないさそうだしPWCSTR::from_ptr()以降が怪しそう
2023/01/05(木) 20:22:41.35ID:fYcl0Ze4
Carbonに期待
2023/01/05(木) 21:53:29.87ID:qIx9AnNX
他の言語でも同じ問題抱えているのに
rustではこういう問題があるぞーって批判目的で書いてる人って何なんだろう
2023/01/05(木) 22:15:07.43ID:QUS/oJRF
というか
ttps://learn.microsoft.com/ja-jp/windows/dev-environment/rust/rss-reader-rust-for-windows
この記事って罠じゃね?winapi使うかFFI使うかしたほうが無難な気がする
2023/01/05(木) 22:32:24.42ID:W/FjpTuq
レイヤー低いところをいじる場合はそのまま生で見えた方がデバッグがやりやすいってのはある。
まあ生で見えるから変なことも起こるんだが、この辺りはトレードオフの話だ。
2023/01/05(木) 23:50:31.90ID:gC/ORVIb
RustがCやC++の文法に似ているというのはウソだと思うね。
本当に似てると思うなら感性を疑う。
712デフォルトの名無しさん
垢版 |
2023/01/06(金) 00:27:00.08ID:YGAtDmlk
似てる
C++から黒魔術をほとんど排除したのがRust
2023/01/06(金) 00:30:58.61ID:HDVxNHRA
文法つっても BNF 的な意味での文法とセマンティクスまで含めた文法では意味合いが違うし、
「どういう意味で似ている」「どういう意味で似ていない」という基準を提示せずに感性で判断しようとするのなら感性を疑う。
2023/01/06(金) 00:47:31.60ID:Pn7zd4wp
>>712
そうは思えないけどな。
似てると言い切るのは無理やり感がある。
2023/01/06(金) 00:59:43.04ID:Bj/0zi83
プロファイラーの皆さん鑑定お願いします
https://i.imgur.com/c9uHodQ.png
https://i.imgur.com/cQKkRzG.png
2023/01/06(金) 01:00:07.18ID:sXnz8uH8
はちみつ餃子vsオイコラミネオスレ並行するのやめてもらっていいですか
2023/01/06(金) 01:04:05.46ID:qbbs3BIz
お前ら独自エラーはどうやって作ってる?
俺はenum使ってるんだけどこれ普通?
2023/01/06(金) 01:25:12.21ID:AnNs2Aua
ディレクトリのコピーってないのか・・・再帰処理の実装は特に面倒なのに
2023/01/06(金) 01:33:35.60ID:Pn7zd4wp
MSの際と出もRustをC++と似てると豪語しているが、信じられない。
720デフォルトの名無しさん
垢版 |
2023/01/06(金) 02:32:49.50ID:xvNP3xU8
RustとC++がそっくりってそれ中国語と英語がそっくりって言ってるようなもんだよ
2023/01/06(金) 02:35:31.30ID:qbbs3BIz
RustはテンプレートがC++よりスマートだよね
template<typename T>とか書かなくてもいいし
722デフォルトの名無しさん
垢版 |
2023/01/06(金) 02:57:32.46ID:BA4ANj8t
>>720
中国語と英語はそっくりかもしれないけど
C++とRustは全く違うものです
723デフォルトの名無しさん
垢版 |
2023/01/06(金) 03:08:45.48ID:7s7EbfVR
Rust, Go, Swiftの3言語登場の前後で、時代が変わった級の変化を感じてしまうが・・・・
有名言語で一番どれに近いって言われたら、文法は違うけどSwiftじゃないかな
2023/01/06(金) 08:20:37.92ID:7YOuN382
ムーブとRAIIあたりはC++くらいしか似てるものがない気はする
他はそんなに似てないかな
2023/01/06(金) 11:05:56.60ID:W6TcEBoi
C++は似てる似てない以前にちゃんとした知識がないわ。
726デフォルトの名無しさん
垢版 |
2023/01/06(金) 11:09:49.68ID:oG71Qopd
>>717
普通
thiserrorのドキュメント見るといい
727デフォルトの名無しさん
垢版 |
2023/01/06(金) 11:11:24.59ID:oG71Qopd
>>723
俺もメジャーな言語ならSwiftが一番近いと思う
728デフォルトの名無しさん
垢版 |
2023/01/06(金) 11:25:37.00ID:3gqx/ngg
Kotlin/Nativeもポインタ触れたりして結構似てるぞい
根幹を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が他言語でもほしいです
2023/01/06(金) 14:03:28.15ID:jehUaEn+
Rustは型チェッカが厳しすぎるからゴミ言語
732デフォルトの名無しさん
垢版 |
2023/01/06(金) 14:04:50.34ID:+8Hk5pSO
厳しすぎる??
2023/01/06(金) 14:05:57.12ID:jehUaEn+
普通にocamlとかのそこらの関数型言語よりはるかに厳しい
2023/01/06(金) 14:36:09.35ID:s69F+oI7
たぶん型チェックではない気がするけどコンパイラのチェックが厳しいとゴミ言語になる理由がよく分からない
何となくで書けないのが不満なのかクラッシュバグを量産できないのが不満なのか
C言語でも-Wallとか-Werrorをつければ結構コンパイラうるさいよ

RustとCが近いと感じるのは脳内で同等のコードをイメージしやすいからかな
RustとC++はそんなに近いとは思わない(被ってる部分もあるけど別方向に派生したC言語という感じ)
2023/01/06(金) 14:40:01.34ID:rO9XvLaF
>>733
具体的には?OCamlではどうでRustではどうって例ある?
2023/01/06(金) 14:48:19.40ID:17lyPwSx
>>734
>RustとCが近いと感じるのは脳内で同等のコードをイメージしやすいからかな
近いとは思わんけどな。
2023/01/06(金) 14:50:54.43ID:jehUaEn+
>>734
Rustほど型チェッカを厳しめにしなくても
安全なプログラムは実現できる
だからこそRustは流行らない
2023/01/06(金) 14:52:43.20ID:jehUaEn+
>>735
OCamlでは値の寿命を気にしなくていい
GCが管理するから
後はRustとは違って型推論をさせるコツというのが少ない
2023/01/06(金) 14:56:59.14ID:WgqbE23F
>>715
これ、ねらったトリップを出せるってこと?
どうやるの?
2023/01/06(金) 15:15:47.67ID:pLqfOblc
毎日似たようなやつ出てくるな
2023/01/06(金) 15:30:04.53ID:eVJa6RQn
向こうで聞けよ
https://i.imgur.com/cQKkRzG.png
http://hissi.org/read.php/tech/20230102/Y3FtNVJpZ20.html
http://mevius.5ch.net/test/read.cgi/tech/1588748438/1000
742デフォルトの名無しさん
垢版 |
2023/01/06(金) 15:32:03.05ID:Kzld2VSs
>>738
暗黙的に型変換されることが多いという話なのか?
でなければどっちも型チェックの話じゃないと思うんだが
2023/01/06(金) 15:40:58.01ID:rO9XvLaF
>>738
> 後はRustとは違って型推論をさせるコツというのが少ない

(´・∀・`)ヘー
でも少ないどころかOCamlに
「型推論をさせるコツ」なんてもんがそもそもあっただろうか…

型チェッカがどうこうは実は今もよくわからんけど
型の推論はRustのほうが数段ショボい感じ
「型推論をさせるコツ」とかいう話も大変Rustっぽい
2023/01/06(金) 15:54:57.11ID:17lyPwSx
「Rustを勉強したい」「WasmをRustで決まり」みたいな話ばかりで
実際に作ってる人がほぼ居ないのがRust。
745デフォルトの名無しさん
垢版 |
2023/01/06(金) 16:18:23.51ID:ka2uAVZR
rust も ocaml も型推論はHindley Milnerベースだろ。
rustで厳しいのはボローチェックやライフタイムのせいじゃないの?
それらも型に含める?広義では含むか、でも狭義にはちょと違うような。
2023/01/06(金) 16:52:55.39ID:1HBuA6S6
ボローチェックやライフタイムをそこまで低レイヤー向けじゃない言語に入れてみた方が需要あるんじゃないかね。
2023/01/06(金) 17:37:26.05ID:sXnz8uH8
低レイヤー向けじゃないならGC使えばいいんだからライフタイムチェックなんてする意味無くね
2023/01/06(金) 17:45:15.81ID:bmHmWdW4
意図しない変数書き換えはGCで防げないと思う
2023/01/06(金) 18:18:03.78ID:4UTCkTyw
>>745
hindly milnerベースって言っても使い勝手が違う
rustは関連型という機能があるからocamlのように型推論が強力なわけではない
あと推論順序の影響を受ける
750デフォルトの名無しさん
垢版 |
2023/01/06(金) 18:31:21.73ID:fURAHMja
>>719
アイデアをまるパクりしてるので、同じに見える人も居るだろう。
文法が似てるとかではなく。
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
2023/01/06(金) 18:52:10.12ID:BFPx2dVd
しかし、Rustが流行ってよかったよ。
ScalaやHaskellみたいなモナモナした言語が未来って言われても全然ピンとこなかったからな。
2023/01/06(金) 19:08:18.00ID:t6RUMnc7
プロファイラーの皆さん鑑定お願いします

何やってるのかと思ったら、何やってんだか、オジ
https://i.imgur.com/Ug1VIIs.png
2023/01/06(金) 20:49:12.83ID:AnNs2Aua
くそーCreateProcessWがGetLastError=87で動かねぇ・・・
昔も苦労させられた記憶があるし結構鬼門なんだよなー
2023/01/06(金) 21:03:28.10ID:s69F+oI7
>>752
OptionとかResult返すときの?オペレータは実質モナドなんだけど
モナドって言葉を使わなければみんな平気なんだろう

>>754
Win32 APIって今も32bit?
ワードサイズで引っ掛かった記憶があるようなないような
2023/01/06(金) 21:18:35.59ID:AnNs2Aua
>>755
PEヘッダ確認してみたけどちゃんとAMD64になっている
ポインタは8バイト、BOOL/DWORDは4バイトでいいはず
757デフォルトの名無しさん
垢版 |
2023/01/06(金) 21:37:34.65ID:11CvjFzC
>>753
RustをWeb系で使ってるとか豪語してたよww
個人の趣味スクレイピングをWeb系と言う虚勢にクスクスさせてもらった
758デフォルトの名無しさん
垢版 |
2023/01/06(金) 21:46:50.80ID:+u5r9Ozg
Web系はフロントはTypeScript/JavaScript、サーバーサイドはGoしか有り得ない
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の正しいサイズがわからない
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
}
2023/01/06(金) 23:37:50.69ID:AnNs2Aua
今度はWaitForSingleObjectで止まらない。というか
ttps://learn.microsoft.com/ja-jp/windows/win32/procthread/creating-processes
これをコピペしてコンパイルして電卓を起動させても止まらない。どうなっているのw
って思ったらcalc.exeはラッパーで即終了していたというオチ。MSはロクなことしないな
2023/01/06(金) 23:51:15.52ID:sXnz8uH8
>>762
>>759を動かそうとしてるんなら"calc\0"は第1引数じゃなくて第2引数よ
もうちょっと落ち着いて色々見直しなさいな
764デフォルトの名無しさん
垢版 |
2023/01/06(金) 23:53:05.97ID:/3LWOZ61
>>761
10.1に書いてるコードがすでに参照使って書いてるじゃん
PartialOrd足せばそのまま動くけど?
2023/01/07(土) 00:26:35.07ID:+QPNW5aO
>>763
MSDNを見る限り単にアプリを起動するだけなら第一引数でも第二引数(読み込み専用不可)でも大差なくない?
動くようになった状態で入れ替えても問題なく動作するし
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.
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の型は入れる値の&を外した型になる(とても雑な説明)
2023/01/07(土) 01:08:28.51ID:4uiRCztN
iter().min::<T>()みたいにかけないっけ
うんこまん
2023/01/07(土) 01:32:02.10ID:kRb596bj
>>767
ありがとうー
そういう仕組みなのね。勉強します
2023/01/07(土) 01:44:37.82ID:BXkfdHSu
>>769
そのへんはパターンマッチと同じ理屈で解釈されるよ。
2023/01/07(土) 02:06:28.88ID:+QPNW5aO
・system()っぽい関数(起動したプロセスが終了するまでブロックする)
・CreateProcessW失敗時は起動失敗を呼び出し元に通知したい
・成功時に戻すべき情報はない
・Rust的にはResultを返すのが定石?
こういう時のコーディング例とかググっても全然出てこなくね・・・
重要なのはOk/Errのみで返り値は不要みたいなケース
とりあえずbool返しにしておくか

>>766
あれ?確かに。すまん気のせいだったっぽい
772デフォルトの名無しさん
垢版 |
2023/01/07(土) 02:31:58.39ID:6JfdJVIo
>>767
> if *elem > *res {
if elem > res でいいよね
773デフォルトの名無しさん
垢版 |
2023/01/07(土) 02:40:46.97ID:nUzzs5ki
古い劣化日本語訳を読んじゃってるみたいね
最低限本物のThe Bookを参照してから質問しよう
https://doc.rust-lang.org/book/ch10-01-syntax.html
2023/01/07(土) 11:49:37.35ID:TSp0PKQI
>>747
変数間でのオブジェクトの共有が気になるシチュエーションはjavaなんかは結構あると思う。
2023/01/07(土) 16:25:18.46ID:dLMo+qnq
rust-analyzerにもVSみたいにドロップダウンでplatform切り替える機能ほしいのう
cfgで複数のplatformに対応しているタイプのライブラリで便利そう
2023/01/07(土) 16:40:32.23ID:+QPNW5aO
継続不可能な状態→エラーダイアログを表示
ここまではいいけどこの後の後始末ってどう書くのがいいんだろうな
後始末のために共有データ(起動時に設定ファイルから読み込む)にアクセスしたいが
Dropトレイトにしろパニックハンドラにしろmainとは別スコープなのでアクセスできない
後始末のスコープ中で共有データを読み直すという手もあるけど、本当に意図しない状態で
強制終了する場合にファイルのロード&パースをするのが望ましいとは思えない
Dropトレイトの初期化時に共有データの参照を渡しておくとか?
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使える)
}
}
}
2023/01/07(土) 18:02:32.48ID:+QPNW5aO
>>777
それコードの位置が逆なだけじゃ。というかResult返しの実装方法を理解できていない
とりあえず共有データを保持している構造体にdropを実装してみた
自身へのアクセスは可能だしmainの終了時に実行される・・・はず
779デフォルトの名無しさん
垢版 |
2023/01/07(土) 18:21:41.85ID:S1LntPIN
>>777
よくこの文章を解釈できたな
素直にすごいわ
2023/01/08(日) 00:10:22.65ID:lAEXMGQ2
Rustってゲームに向いてそうなイメージあるけどどうなんだろ
メモリリークは相当起きにくいよな?
2023/01/08(日) 00:39:44.59ID:li8iVC1C
ゲーム開発はトリッキーな手品も使うだろうから向いてないんじゃないか
2023/01/08(日) 00:51:12.10ID:RrQeMuL+
今のご時世に非標準的な実装をするゲームとかOSのバージョンアップで爆死する未来が見える
2023/01/08(日) 01:11:48.94ID:WtSMxRkj
>>782
OSに関係無いところでのトリッキーなテクニックは有りえる。
例えば、複数のポインタ用のバッファをまとめてnewで確保してから、
直後に値を代入するようなことはC/C++では簡単に行なえる。
ところが安全性重視の言語だと、非初期化状態のポインタは許されないから、
少なくともnew演算子が自力でNULL初期化しなくてはならないので、
無駄になる。
他にも、配列の範囲チェックが無駄になる。
2023/01/08(日) 01:15:49.98ID:WtSMxRkj
>>783
ちなみに、
「非初期化状態の変数」は不安定になり易いので減らした方が良いとされているが、
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にすればいい話だね
スタックでゼロ初期化した方が性能はいいと思うけど
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
2023/01/08(日) 02:36:10.85ID:x4fu54u1
Rustのメモリ安全性にはメモリリークしないことは含まれていないんだよね。
Rc<T>で循環参照するデータを作ってもコンパイルエラーにはならずメモリが解放されないままだったはず。
まぁメモリリークしててもメモリがある限り正しい結果を返すわけだし、メモリがなくなったらクラッシュするので間違いが起きたまま動作しつづけることはないけど。
788デフォルトの名無しさん
垢版 |
2023/01/08(日) 02:55:51.04ID:fOddL1iF
Rustは例えばGodotではGDScriptが実質Rustだし相当ゲーム制作に向いてる
https://gitlab.com/the-SSD/gdscript-compiler
789デフォルトの名無しさん
垢版 |
2023/01/08(日) 04:35:49.54ID:kuKYL1oy
>>786
なんじゃそりゃ
どこでそんなデタラメ仕入れてきたの?
790デフォルトの名無しさん
垢版 |
2023/01/08(日) 06:55:53.23ID:FeGYfhwG
技術評論社の書籍だろ。
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
792デフォルトの名無しさん
垢版 |
2023/01/08(日) 11:05:27.68ID:wpyfySyl
>>781
そういう部分だけunsafe使えばいい。
unsafeダメ原理主義者になるな。
2023/01/08(日) 11:21:27.20ID:D257opQI
>>791
そこにはライフタイム省略版とは書いてないよ
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
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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