公式
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 part19
https://mevius.5ch.net/test/read.cgi/tech/1673926892/
ワッチョイスレ
プログラミング言語 Rust 4【ワッチョイ】
https://mevius.5ch.net/test/read.cgi/tech/1514107621/
探検
Rust part20
■ このスレッドは過去ログ倉庫に格納されています
2023/03/03(金) 00:45:28.73ID:vTVY069B
589デフォルトの名無しさん
2023/06/08(木) 02:36:59.06ID:EE2g7bKF 日本人を大量虐殺したことを反省せず、今度はウクライナとロシア人を
殺している。
そんな国に良いものは作りえない。ずるするのみ。
殺している。
そんな国に良いものは作りえない。ずるするのみ。
590デフォルトの名無しさん
2023/06/08(木) 02:48:48.98ID:EE2g7bKF 平均寿命がアメリカは日本より5歳も低いことをみんな知らない。
そんな後進国を先進国扱いしている。
そんな後進国を先進国扱いしている。
591デフォルトの名無しさん
2023/06/08(木) 02:53:24.84ID:EE2g7bKF 特に、githubなんかは、わけの分からんソフトを作ってる人に別の左翼が
寄付する。左翼は相互扶助で虚構世界を作るのが好き。一般需要が全く無い
ソフトウェアに大金が寄付される。
このように、左翼は日本やアメリカにあってもお互いに虚構を流し合うことで
脳内で言論統制し合い虚構世界を生きている。
寄付する。左翼は相互扶助で虚構世界を作るのが好き。一般需要が全く無い
ソフトウェアに大金が寄付される。
このように、左翼は日本やアメリカにあってもお互いに虚構を流し合うことで
脳内で言論統制し合い虚構世界を生きている。
592デフォルトの名無しさん
2023/06/08(木) 03:00:18.36ID:EE2g7bKF アメリカのやり口:
・需要が無いのに無理やり使わせる。
・不便なのに無料化することで構造上それしか存在しない状態になっている。
・無料化することでどんなに粗悪品でも対抗製品が現れ得ないからである。
・からくりは、検索エンジンの広告料で大金を永遠と稼ぐことで、ソフトを
無料化し、検索エンジンを持たない通常企業の参入を永久阻止しているのである。
・需要が無いのに無理やり使わせる。
・不便なのに無料化することで構造上それしか存在しない状態になっている。
・無料化することでどんなに粗悪品でも対抗製品が現れ得ないからである。
・からくりは、検索エンジンの広告料で大金を永遠と稼ぐことで、ソフトを
無料化し、検索エンジンを持たない通常企業の参入を永久阻止しているのである。
593デフォルトの名無しさん
2023/06/08(木) 03:40:00.34ID:aft4Kt1Y うーん
やはりワッチョイなしスレは放棄する他ないか
やはりワッチョイなしスレは放棄する他ないか
594デフォルトの名無しさん
2023/06/08(木) 03:57:30.29ID:VBjeYwpm595デフォルトの名無しさん
2023/06/08(木) 04:06:08.75ID:EE2g7bKF596デフォルトの名無しさん
2023/06/08(木) 04:07:01.06ID:EE2g7bKF アメリカは基本ルールが守れて無いのに、Rustの仕様なんて語る権利が無い。
597デフォルトの名無しさん
2023/06/08(木) 04:10:05.28ID:EE2g7bKF 要は、アメリカは人殺しが刑務所で書いた本が売れて億万長者になっているようなものだ。
598デフォルトの名無しさん
2023/06/08(木) 07:29:01.96ID:ABj73STK C言語の戻り型の前置記述だとC++で色々と不便なことがわかり
C++11では戻り型を"->"により後置できるようになった
ラムダ式でも戻り型を指定する時に同じく"->"で後置する
つまりC++11の時点で"->"による戻り型の後置記法が導入されている
そして>>586のようにRustとCarbonもC++11の"->"を踏襲している
C++11では戻り型を"->"により後置できるようになった
ラムダ式でも戻り型を指定する時に同じく"->"で後置する
つまりC++11の時点で"->"による戻り型の後置記法が導入されている
そして>>586のようにRustとCarbonもC++11の"->"を踏襲している
599デフォルトの名無しさん
2023/06/08(木) 08:51:14.64ID:9HUG8roo 他言語とか視認性置いておいてもfn f(x: T): Uは一貫性ないんだよな
Tはxの型だがUはfの型ではないわけで
:の左辺が名前で右辺が型という原則に従うなら fn f: (x: T) -> U となるはず
Tはxの型だがUはfの型ではないわけで
:の左辺が名前で右辺が型という原則に従うなら fn f: (x: T) -> U となるはず
600デフォルトの名無しさん
2023/06/08(木) 08:52:05.56ID:u/DD3jzo うちはインターンの女子大生すらRust使い始めたわ
ペチパーには辛い世界になっていくだろうな
ペチパーには辛い世界になっていくだろうな
601デフォルトの名無しさん
2023/06/08(木) 09:22:42.20ID:c1TL2iD8 >>572
お爺ちゃん🥺
お爺ちゃん🥺
602デフォルトの名無しさん
2023/06/08(木) 13:15:19.62ID:5t64h36a >>599
左辺が式だと思えば筋は通るやん?
左辺が式だと思えば筋は通るやん?
603デフォルトの名無しさん
2023/06/08(木) 14:14:27.48ID:Iro3x2NJ604デフォルトの名無しさん
2023/06/08(木) 14:32:27.10ID:5t64h36a 隔離スレにコピペしたからあとはあっちで頼むわ
605デフォルトの名無しさん
2023/06/08(木) 15:00:38.73ID:ybwEaSV3606デフォルトの名無しさん
2023/06/08(木) 20:13:04.97ID:rV/cB3of 関数型言語から拾っただけで深い考えはないだろ
関数型言語は 引数 -> 戻り値 とか 引数 -> 引数 -> 戻り値でカリー化したら引数の数が減ったりするので意味は通じるけど…
関数型言語は 引数 -> 戻り値 とか 引数 -> 引数 -> 戻り値でカリー化したら引数の数が減ったりするので意味は通じるけど…
607デフォルトの名無しさん
2023/06/08(木) 20:15:30.41ID:4tjPz2+B オレオレ一貫性w
全然一貫してない
全然一貫してない
608デフォルトの名無しさん
2023/06/08(木) 20:45:27.43ID:ABj73STK 「-> 戻り型」を批判してる人は先に採用したC++に対しても批判しているの?
ML系で何十年も使われて来た実績と視認性の良さからベストな記法
ML系で何十年も使われて来た実績と視認性の良さからベストな記法
609デフォルトの名無しさん
2023/06/08(木) 21:09:50.06ID:6OsjtmDb ML系は関数呼び出しにかっこを使わないし
関数定義と型注釈を分けて書くし
Cスタイルとはだいぶ違う文法体系だよね
同じ記号を使っているという以外に共通点はないと思うよ
そしてx: TはPascalスタイルの型の付け方なんですね
TypeScriptの他にもScala、Kotlin、HaxeなどがPascalに従って(x: T): Uのように戻り値型注釈をつけます
参考までに
関数定義と型注釈を分けて書くし
Cスタイルとはだいぶ違う文法体系だよね
同じ記号を使っているという以外に共通点はないと思うよ
そしてx: TはPascalスタイルの型の付け方なんですね
TypeScriptの他にもScala、Kotlin、HaxeなどがPascalに従って(x: T): Uのように戻り値型注釈をつけます
参考までに
610デフォルトの名無しさん
2023/06/09(金) 02:12:57.64ID:vRGkF7ww sigplan noticeではindentationとlexical syntaxの話は禁止だったw
611デフォルトの名無しさん
2023/06/09(金) 17:20:52.23ID:3c0vm8Dw syntaxで言うならライフタイムのsyntaxは今でも違和感あるわ。
具体的に使うわけでもない変数を定義するようなのはどうにかならんかったのか。
具体的に使うわけでもない変数を定義するようなのはどうにかならんかったのか。
612デフォルトの名無しさん
2023/06/09(金) 18:41:37.13ID:2zdGi9Wu613デフォルトの名無しさん
2023/06/09(金) 18:57:57.14ID:2zdGi9Wu 変数として使ってないわけじゃないな
具体的なインスタンスが生成されるときに具体的なライフタイムが代入されると思うべきか
具体的なインスタンスが生成されるときに具体的なライフタイムが代入されると思うべきか
614デフォルトの名無しさん
2023/06/09(金) 18:59:26.79ID:FpUIfFmd 型パラメータは変数じゃありません
615デフォルトの名無しさん
2023/06/09(金) 19:10:21.66ID:9O24uU1k 違和感あるようにしてるんだぞ
Bad Partsはあえて汚くなるような構文を選んでる
Bad Partsはあえて汚くなるような構文を選んでる
616デフォルトの名無しさん
2023/06/09(金) 19:42:24.19ID:9O24uU1k617デフォルトの名無しさん
2023/06/09(金) 20:20:27.29ID:JRGzkE91 rustのstructってなんで中身をカンマで区切るんですか?
C/C++/C#/Swiftはセミコロンだし、影響受けたとされるhaskellの直積型はスペースですよね、デフォルトでメモリースペースが最小になるように再配置されるから?
でもそれだと配列のように直線的に配置されるように感じてしまう気がするのだが
C/C++/C#/Swiftはセミコロンだし、影響受けたとされるhaskellの直積型はスペースですよね、デフォルトでメモリースペースが最小になるように再配置されるから?
でもそれだと配列のように直線的に配置されるように感じてしまう気がするのだが
618デフォルトの名無しさん
2023/06/09(金) 20:32:17.49ID:j7wYaK9P 内容の列挙だからカンマの方が自然だと思うけどセミコロンが使われがちなのは
構文解析(エラー復帰)しやすいからなのかな
let Point { x; y; } = p;
だと気持ち悪いからパターンマッチと関係あるかもしれない
構文解析(エラー復帰)しやすいからなのかな
let Point { x; y; } = p;
だと気持ち悪いからパターンマッチと関係あるかもしれない
619デフォルトの名無しさん
2023/06/09(金) 22:10:43.24ID:JRGzkE91 >>618
なるほど?構文解析が楽だからという理由はある程度は納得できるが、自然と感じる理由が個人的な嗜好で何となくなのかな?
ほかにカンマを使う場面は分割代入(destructuring)があるので、structを分解するときに対称性が良いからなのかと考えたり
なるほど?構文解析が楽だからという理由はある程度は納得できるが、自然と感じる理由が個人的な嗜好で何となくなのかな?
ほかにカンマを使う場面は分割代入(destructuring)があるので、structを分解するときに対称性が良いからなのかと考えたり
620デフォルトの名無しさん
2023/06/10(土) 08:59:06.95ID:gJM3u8Zc cでエンディアン確認するとき
unsigned long x = 0x12345678;
for( int i = 0; i < sizeof(long); i++ ){
unsigned long x = 0x12345678;
for( int i = 0; i < sizeof(long); i++ ){
621デフォルトの名無しさん
2023/06/10(土) 09:07:47.23ID:gJM3u8Zc cでエンディアン確認するとき
unsigned long x = 0x12345678;
unsigned char *px = (unsingned char *)&x;
for( int i = 0; i < sizeof(long); i++ ){
fprintf(stderr, "%X ", *px++ );
}
fprintf(stderr, "\n" );
てのをrustならどー書いたらええの>
unsigned long x = 0x12345678;
unsigned char *px = (unsingned char *)&x;
for( int i = 0; i < sizeof(long); i++ ){
fprintf(stderr, "%X ", *px++ );
}
fprintf(stderr, "\n" );
てのをrustならどー書いたらええの>
622デフォルトの名無しさん
2023/06/10(土) 09:44:12.87ID:NYFdP8Rk それと同じこともできるけど、単にエンディアン知りたいだけならこんな感じで
if cfg!(target_endian = "big") {
// big endian
} else {
// little endian
}
if cfg!(target_endian = "big") {
// big endian
} else {
// little endian
}
623デフォルトの名無しさん
2023/06/10(土) 09:56:44.54ID:gJM3u8Zc >>622
エンディアンと書いたのは一例で
実際用意された型にバイトデータがどう格納されてるかを知りたい
ポインタキャストどー書くの?
forとかも変なことなってるけど
条件判断と goto ラベルさえあれば繰り返しは実行できるんだが,
rustにC/C++にあるgotoとかラベルってあるの?
エンディアンと書いたのは一例で
実際用意された型にバイトデータがどう格納されてるかを知りたい
ポインタキャストどー書くの?
forとかも変なことなってるけど
条件判断と goto ラベルさえあれば繰り返しは実行できるんだが,
rustにC/C++にあるgotoとかラベルってあるの?
624デフォルトの名無しさん
2023/06/10(土) 10:05:08.69ID:NYFdP8Rk >>623
その場合はtransmuteかな
https://doc.rust-lang.org/std/mem/fn.transmute.html
gotoはない
ラベルはネストしたループから脱出するためのはある
その場合はtransmuteかな
https://doc.rust-lang.org/std/mem/fn.transmute.html
gotoはない
ラベルはネストしたループから脱出するためのはある
625デフォルトの名無しさん
2023/06/10(土) 10:07:35.39ID:n814OtyQ >>621
let x: i32 = 0x12345678;
// 直訳すると生ポインタなのでunsafe
use std::mem::size_of;
let mut px = &x as *const i32 as *const u8;
for _i in 0..size_of::<i32>() {
print!("{:x} ", unsafe { *px });
unsafe { px = px.add(1); };
}
println!();
// byte列とみなすメソッドを使うとsafe
for b in x.to_ne_bytes() {
print!("{b:x} ");
}
println!();
let x: i32 = 0x12345678;
// 直訳すると生ポインタなのでunsafe
use std::mem::size_of;
let mut px = &x as *const i32 as *const u8;
for _i in 0..size_of::<i32>() {
print!("{:x} ", unsafe { *px });
unsafe { px = px.add(1); };
}
println!();
// byte列とみなすメソッドを使うとsafe
for b in x.to_ne_bytes() {
print!("{b:x} ");
}
println!();
626デフォルトの名無しさん
2023/06/10(土) 10:13:46.29ID:udyVxmRJ エンディアン君を、ウッカリ助平と命名したい....
627デフォルトの名無しさん
2023/06/10(土) 10:25:42.92ID:gJM3u8Zc628デフォルトの名無しさん
2023/06/10(土) 10:26:30.43ID:gJM3u8Zc629デフォルトの名無しさん
2023/06/10(土) 10:35:25.62ID:n814OtyQ to_ne_bytesのneはnative endianの意味でleやbeもある
neを使ってlittle endian環境ならば
assert_eq!(0x12345678_u32.to_ne_bytes(), [0x78, 0x56, 0x34, 0x12]);
assert_eq!(0x12345678, u32::from_ne_bytes([0x78, 0x56, 0x34, 0x12]));
neを使ってlittle endian環境ならば
assert_eq!(0x12345678_u32.to_ne_bytes(), [0x78, 0x56, 0x34, 0x12]);
assert_eq!(0x12345678, u32::from_ne_bytes([0x78, 0x56, 0x34, 0x12]));
630デフォルトの名無しさん
2023/06/10(土) 15:12:50.25ID:PsHn2Fx3 テキストデータを画像にレンダリングして最終的に2値モノクロ画像を得たいんだけど
今だとどんなクレートを使うのがいいかな?
フォントレンダラはfont-rs・・・は放置されているしからfontdueとか?
2値化に影響するディザリングのオプションとかを指定できるとありがたい
今だとどんなクレートを使うのがいいかな?
フォントレンダラはfont-rs・・・は放置されているしからfontdueとか?
2値化に影響するディザリングのオプションとかを指定できるとありがたい
631デフォルトの名無しさん
2023/06/10(土) 15:48:41.24ID:UQF9pDDb rusttypeとかab_glyphってのがダウンロード数多いみたい
632デフォルトの名無しさん
2023/06/12(月) 12:58:17.77ID:oql3AWnL ただの思いつきだが、CやC++はメモリセーフではないだろ。ってことはプログラム中で結構無駄なメモリを消費してたりしないの?Rustはそこの所最適化されてるから究極的にはRustの方がCやC++よりも高速に動作するのでは?
633デフォルトの名無しさん
2023/06/12(月) 13:04:11.65ID:RXOqFmSk ?
634デフォルトの名無しさん
2023/06/12(月) 14:15:17.58ID:krlNNb+N ちょっと何言ってるかわからない
635デフォルトの名無しさん
2023/06/12(月) 16:35:03.90ID:snPhjFNJ メモリセーフかどうかと
メモリを無駄使いしてるかどうかに直接の関係はない
メモリを無駄使いしてるかどうかに直接の関係はない
636デフォルトの名無しさん
2023/06/12(月) 16:47:01.05ID:/yLe7ykR メモリ安全性とメモリの利用効率に関係はないが、
安全性のために導入したライフタイム管理が最適化に影響する部分がないとは言えない。
依存関係が明瞭だからエイリアス解析がしやすく、
結果的に効果的に最適化しやすい可能性は高い。
しかし実行時でないと安全なアクセスであるかどうか検出が不可能な場合もあるから
それも込みで考えると Rust のほうがやや不利であると言える要素もある。
全体的な性能は互角か Rust のほうがやや遅いくらいじゃないの。 知らんけど。
性能が互角くらいでより安全ならそのほうがいいじゃろ。
安全性のために導入したライフタイム管理が最適化に影響する部分がないとは言えない。
依存関係が明瞭だからエイリアス解析がしやすく、
結果的に効果的に最適化しやすい可能性は高い。
しかし実行時でないと安全なアクセスであるかどうか検出が不可能な場合もあるから
それも込みで考えると Rust のほうがやや不利であると言える要素もある。
全体的な性能は互角か Rust のほうがやや遅いくらいじゃないの。 知らんけど。
性能が互角くらいでより安全ならそのほうがいいじゃろ。
637デフォルトの名無しさん
2023/06/12(月) 18:28:52.16ID:EF0TFJgA メモリ安全にするために過剰なコピーや長いライフタイムになる実装をしてしまうことがあり、それをコンパイラがガードしてあげるからルールに従って書いてねってのがRustの思想だと思う。
逆に適当に書いても安全にするし出来るだけメモリ効率も配慮するよってのが他のGC言語
逆に適当に書いても安全にするし出来るだけメモリ効率も配慮するよってのが他のGC言語
638デフォルトの名無しさん
2023/06/12(月) 18:44:13.30ID:A48fS+G5 そんな話一般論で語れる訳ないぞ
コードを出しな?
コードを出しな?
639デフォルトの名無しさん
2023/06/12(月) 20:02:49.65ID:dpH2J6Rw640デフォルトの名無しさん
2023/06/12(月) 21:33:36.66ID:/yLe7ykR641デフォルトの名無しさん
2023/06/12(月) 21:39:50.33ID:MIVgoZU9 意味のない議論がほんと好きだねー
642デフォルトの名無しさん
2023/06/12(月) 21:44:05.58ID:G7kVZgOF コードが一切出てこないのが本当不思議
643デフォルトの名無しさん
2023/06/12(月) 21:45:00.87ID:dpH2J6Rw644デフォルトの名無しさん
2023/06/13(火) 11:32:39.43ID:dzy+ZzAL >>639
>そのRustがやや不利でやや遅いと思っている具体的なケースのコードを出してごらん
ややどころか、大幅に遅くなるケースもあるぞ。
俺はこれ以上指摘しない。自分で分かるかどうかが技術力の試金石だ。
>そのRustがやや不利でやや遅いと思っている具体的なケースのコードを出してごらん
ややどころか、大幅に遅くなるケースもあるぞ。
俺はこれ以上指摘しない。自分で分かるかどうかが技術力の試金石だ。
645デフォルトの名無しさん
2023/06/13(火) 11:35:33.48ID:dzy+ZzAL また、
「Rustは、どんな場合でも、効率を下げずに少数の関数の中に unsafe 箇所を閉じ込められる」
というのも嘘。
「Rustは、どんな場合でも、効率を下げずに少数の関数の中に unsafe 箇所を閉じ込められる」
というのも嘘。
646デフォルトの名無しさん
2023/06/13(火) 11:43:16.69ID:+SMK6i6B ならお前はこれ以上指摘すんなよ未来に渡って
647デフォルトの名無しさん
2023/06/13(火) 11:53:41.84ID:+a/cV++y >>644
デタラメ屋さんまた来たのか
デタラメ屋さんまた来たのか
648デフォルトの名無しさん
2023/06/13(火) 14:38:11.20ID:oknE//uE649デフォルトの名無しさん
2023/06/13(火) 18:50:01.53ID:t3PG4UqW >>648
ぷw
ぷw
650デフォルトの名無しさん
2023/06/13(火) 23:11:29.90ID:/Z2+rRnG >>648
だいぶ頭良いプログラマーはこんなとこ来ねーからw
だいぶ頭良いプログラマーはこんなとこ来ねーからw
651デフォルトの名無しさん
2023/06/14(水) 17:49:14.80ID:yJueN6KQ 可変長のバイナリデータを扱う場合の型ってやっぱvec<u8>あたり?
独自の型を定義する以外に他によさそうな型って何かあるかな
独自の型を定義する以外に他によさそうな型って何かあるかな
652デフォルトの名無しさん
2023/06/14(水) 20:22:43.85ID:kb1QmHED >>651
Trait std::io::Readのrequired methodが
fn read(&mut self, buf: &mut [u8]) -> Result<usize>;
であるように&[u8]でアクセスできれば何でもよい
そのうち可変で最もお手軽なのはVec<u8>
Trait std::io::Readのprovided methodの一つ
fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize> { ... }
もVec<u8>の可変参照を渡す仕様
Trait std::io::Readのrequired methodが
fn read(&mut self, buf: &mut [u8]) -> Result<usize>;
であるように&[u8]でアクセスできれば何でもよい
そのうち可変で最もお手軽なのはVec<u8>
Trait std::io::Readのprovided methodの一つ
fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize> { ... }
もVec<u8>の可変参照を渡す仕様
653デフォルトの名無しさん
2023/06/14(水) 20:28:50.68ID:MiDa+oME よくわからないんだけど
ライフタイムの例でよく出てくる関数の引数a,bを同じライフタイムの指定にするってやつは
どちらが選ばれるか分からないから使わないほうも長い方の寿命に合わせて残しておきますと言う解釈でいいの?
ライフタイムの例でよく出てくる関数の引数a,bを同じライフタイムの指定にするってやつは
どちらが選ばれるか分からないから使わないほうも長い方の寿命に合わせて残しておきますと言う解釈でいいの?
654デフォルトの名無しさん
2023/06/14(水) 20:57:15.56ID:VhTmt6N9 >>653
その例となってる関数のコードくらいは書けよ
その例となってる関数のコードくらいは書けよ
655デフォルトの名無しさん
2023/06/14(水) 23:11:40.84ID:kb1QmHED たぶんこういう例のことかな
fn longest<'a>(s1: &'a str, s2: &'a str) -> &'a str {
if s1.len() >= s2.len() { s1 } else { s2 }
}
ここである呼び出しの時に
s1が'staticでs2が'x (!= 'static)だったとすると
'aとして寿命が短い'xの方が採用される
ただしこれはcovarianceである&Tの場合の話
invarianceである&mut Tの場合は逆になるので注意
fn longest<'a>(s1: &'a str, s2: &'a str) -> &'a str {
if s1.len() >= s2.len() { s1 } else { s2 }
}
ここである呼び出しの時に
s1が'staticでs2が'x (!= 'static)だったとすると
'aとして寿命が短い'xの方が採用される
ただしこれはcovarianceである&Tの場合の話
invarianceである&mut Tの場合は逆になるので注意
656デフォルトの名無しさん
2023/06/14(水) 23:20:37.20ID:yJueN6KQ657デフォルトの名無しさん
2023/06/14(水) 23:43:12.09ID:kb1QmHED 構造体とか要unsafeとか何をしたいのかわからないが
上限を決めてもよい用途ならば
ヒープを使わずともArrayVec<u8, CAPACITY>がスタック上のみで動く
上限を決めてもよい用途ならば
ヒープを使わずともArrayVec<u8, CAPACITY>がスタック上のみで動く
658デフォルトの名無しさん
2023/06/14(水) 23:49:13.19ID:yJueN6KQ データの一部だけ可変長とかブロック構造の個数が
可変(ブロックの中身は固定)とかね
可変(ブロックの中身は固定)とかね
659デフォルトの名無しさん
2023/06/14(水) 23:54:41.98ID:MiDa+oME staticは消滅しないから実質参考にならんので無視して短い方をaとする
これは対象が2つだからであって
static 1
その他 2
ならその他2の長い方になると言う考えでいいのかな?
これは対象が2つだからであって
static 1
その他 2
ならその他2の長い方になると言う考えでいいのかな?
660デフォルトの名無しさん
2023/06/14(水) 23:58:17.85ID:CT9YbjmP もう何言ってんだよ
661デフォルトの名無しさん
2023/06/14(水) 23:59:42.49ID:hllwji0O >>655
ライフタイムに関しては&も&mutもcovariantなので違いはありません
ライフタイムに関しては&も&mutもcovariantなので違いはありません
662デフォルトの名無しさん
2023/06/15(木) 00:08:38.46ID:wST3qwRf Tに対して&Tはcovariant
Tに対して&mut Tはinvariant
Tに対して&mut Tはinvariant
663デフォルトの名無しさん
2023/06/15(木) 08:25:03.26ID:9aol5+Qr >>547
OptionとOnceCellの違い
&Tを得ることをgetと呼ぶようになった
【Option】fn as_ref(&self) -> Option<&T>
【OnceCell】fn get(&self) -> Option<&T>
&mut Tを得ることをget_mutと呼ぶようになった
【Option】fn as_mut(&mut self) -> Option<&mut T>
【OnceCell】fn get_mut(&mut self) -> Option<&mut T>
空にしてTを得ることをtakeと呼ぶのは同じ
【Option】fn take(&mut self) -> Option<T>
【OnceCell】fn take(&mut self) -> Option<T>
空(default)を作成することをnewと呼ぶこともできるようになった
【Option】fn default() -> Option<T>
【OnceCell】fn default() -> OnceCell<T> または fn new() -> OnceCell<T>
OptionとOnceCellの違い
&Tを得ることをgetと呼ぶようになった
【Option】fn as_ref(&self) -> Option<&T>
【OnceCell】fn get(&self) -> Option<&T>
&mut Tを得ることをget_mutと呼ぶようになった
【Option】fn as_mut(&mut self) -> Option<&mut T>
【OnceCell】fn get_mut(&mut self) -> Option<&mut T>
空にしてTを得ることをtakeと呼ぶのは同じ
【Option】fn take(&mut self) -> Option<T>
【OnceCell】fn take(&mut self) -> Option<T>
空(default)を作成することをnewと呼ぶこともできるようになった
【Option】fn default() -> Option<T>
【OnceCell】fn default() -> OnceCell<T> または fn new() -> OnceCell<T>
664デフォルトの名無しさん
2023/06/15(木) 11:48:36.10ID:7LFutjAG トヨタの車載OSってRUSTなんだ
665デフォルトの名無しさん
2023/06/15(木) 18:17:26.02ID:wrhp+okP ライフタイムもtraitも難しすぎてマジでわからん
666デフォルトの名無しさん
2023/06/15(木) 18:21:52.25ID:WlvOik+R ライフタイムの質問してたものだけど
コードを書いてて完全に誤解していたことに気が付いた
コンパイル時に範囲をチェックするために引数のライフタイムを最小限に揃える仕組みなんだな
多分一般向けには流行らないわな
コードを書いてて完全に誤解していたことに気が付いた
コンパイル時に範囲をチェックするために引数のライフタイムを最小限に揃える仕組みなんだな
多分一般向けには流行らないわな
667デフォルトの名無しさん
2023/06/15(木) 18:38:09.80ID:Ah9v0OFJ ライフタイムって該当のメモリがいつまで確保されているかって話であって難しいところはなくね?
所望のタイミングまで開放してほしくないがどのようにするのが望ましいか?って話ならまだわかるが
所望のタイミングまで開放してほしくないがどのようにするのが望ましいか?って話ならまだわかるが
668デフォルトの名無しさん
2023/06/15(木) 18:40:44.72ID:QZKQzk+I 自明なときに省略できるせいで理解しづらくなってる気はする
669デフォルトの名無しさん
2023/06/15(木) 18:44:18.80ID:WlvOik+R 日本語がおかしかった
関数では引数に依存する戻り値の寿命がわからない
それで基本的に指定した複数の引数のライフタイムの一番短い奴に合わせて解釈する
そのライフタイムを元にコンパイル時にチェックしてダングリングを防いでる
一番寿命が短い奴に合わせてチェックしたら他はそれより長いのでダングリングが起こらないだろうと
こういうふうに言う人間があまりいないのが現状
関数では引数に依存する戻り値の寿命がわからない
それで基本的に指定した複数の引数のライフタイムの一番短い奴に合わせて解釈する
そのライフタイムを元にコンパイル時にチェックしてダングリングを防いでる
一番寿命が短い奴に合わせてチェックしたら他はそれより長いのでダングリングが起こらないだろうと
こういうふうに言う人間があまりいないのが現状
670デフォルトの名無しさん
2023/06/15(木) 18:47:34.83ID:WlvOik+R 普通にコードを書いた時点でスコープや借用の関係で寿命は決まってる
それが範囲外になるかどうかボローチェックしてるんだけどそいつのためにライフタイムを明示してる
ライフタイムを明示してもコード上の寿命は伸び縮みしないけどエラーを見てコードを書いた人は修正ができる
それが範囲外になるかどうかボローチェックしてるんだけどそいつのためにライフタイムを明示してる
ライフタイムを明示してもコード上の寿命は伸び縮みしないけどエラーを見てコードを書いた人は修正ができる
671デフォルトの名無しさん
2023/06/15(木) 18:52:46.39ID:WlvOik+R と言う解釈なんだけど今のところ
普通に違ってるかもしれない
普通に違ってるかもしれない
672デフォルトの名無しさん
2023/06/15(木) 18:57:24.57ID:uU1WiW+l OnceCellってようやく俺たちの欲しいものが来てくれたか
RefCellもCellも複雑なデータ構造作ると面倒だったからな
RefCellもCellも複雑なデータ構造作ると面倒だったからな
673デフォルトの名無しさん
2023/06/15(木) 20:40:26.65ID:bvsZhoj8 Cellの 種類が増えるってのは悪い兆候だね
674デフォルトの名無しさん
2023/06/15(木) 20:43:39.64ID:vyb4HXQ7 Cellを使ったら負け
他の言語からの移植だと、なぜか増えてしまう
他の言語からの移植だと、なぜか増えてしまう
675デフォルトの名無しさん
2023/06/15(木) 21:23:13.49ID:jjsgM8WL >>669
結構何を言ってるか分からないが引数のライフタイムを省略した場合は全部同じライフタイムを持つことになるよ
結構何を言ってるか分からないが引数のライフタイムを省略した場合は全部同じライフタイムを持つことになるよ
676デフォルトの名無しさん
2023/06/15(木) 21:54:27.47ID:o+xWcDso >>669
main()→sub()→...と呼ばれている時に
'mainと'subをそれぞれの関数で持っている分の寿命とすると
寿命の長さは'static>'main>'subだが
「'sub以上の集合」⊃「'main以上の集合」⊃「'static以上の集合」なので
実は'staticの方がサブタイプ(下位)
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str において
寿命'aはジェネリックなパラメータなので
longest('main, 'static)と呼び出されれば'aは上位の'mainとなり
longest('main, 'sub)と呼び出されれば'aは上位の'subとなる
一方で
fn foo<'a, 'b>(x: &'a str, y: &'b str) -> &'b str という関数だと
foo('main, 'static)と呼び出されれば'bはそのまま'staticとなり
foo('main, 'sub)と呼び出されれば'bはそのまま'subとなる
この場合はもちろん引数の短い方の寿命になるわけではない
fn bar<'a, 'b>(x: &'a str, y: &'b str) -> Bar<'a, 'b> という関数は
返り型が構造体(か何か)のBarでその内部に寿命'aのものと寿命'bのものを持つ
このように様々なケースがある
main()→sub()→...と呼ばれている時に
'mainと'subをそれぞれの関数で持っている分の寿命とすると
寿命の長さは'static>'main>'subだが
「'sub以上の集合」⊃「'main以上の集合」⊃「'static以上の集合」なので
実は'staticの方がサブタイプ(下位)
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str において
寿命'aはジェネリックなパラメータなので
longest('main, 'static)と呼び出されれば'aは上位の'mainとなり
longest('main, 'sub)と呼び出されれば'aは上位の'subとなる
一方で
fn foo<'a, 'b>(x: &'a str, y: &'b str) -> &'b str という関数だと
foo('main, 'static)と呼び出されれば'bはそのまま'staticとなり
foo('main, 'sub)と呼び出されれば'bはそのまま'subとなる
この場合はもちろん引数の短い方の寿命になるわけではない
fn bar<'a, 'b>(x: &'a str, y: &'b str) -> Bar<'a, 'b> という関数は
返り型が構造体(か何か)のBarでその内部に寿命'aのものと寿命'bのものを持つ
このように様々なケースがある
677デフォルトの名無しさん
2023/06/15(木) 22:01:26.73ID:o+xWcDso >>672
OnceCellは前からあって広く使われていて今回stdに採り入れられた
once_cell::unsync::OnceCell が std::cell::OnceCell となった
staticで使われてきたSyncなOnceCellの方は別名となり
once_cell::sync::OnceCell が std::sync::OnceLock となった
OnceCellは前からあって広く使われていて今回stdに採り入れられた
once_cell::unsync::OnceCell が std::cell::OnceCell となった
staticで使われてきたSyncなOnceCellの方は別名となり
once_cell::sync::OnceCell が std::sync::OnceLock となった
678デフォルトの名無しさん
2023/06/15(木) 22:08:16.03ID:yL2pOlPY >>669
データフロー解析を知らないのだろうか?
データフロー解析を知らないのだろうか?
679デフォルトの名無しさん
2023/06/15(木) 22:11:21.57ID:R+Rv2ggs680デフォルトの名無しさん
2023/06/15(木) 22:12:42.39ID:o+xWcDso681デフォルトの名無しさん
2023/06/15(木) 22:15:38.46ID:EOr7Ahlr >>676
上位下位にサブタイプにsubて嫌がらせか!
上位下位にサブタイプにsubて嫌がらせか!
682デフォルトの名無しさん
2023/06/15(木) 22:39:43.11ID:WlvOik+R683デフォルトの名無しさん
2023/06/15(木) 23:12:41.78ID:ZgEGySwy >>682
こんがらがってないならまずは他人に理解できる日本語とコード例を書いてくれよ
間違いを指摘するとか以前に何を言いたいのかわからないんだって
俺だけじゃなくて何人も君が何を言いたいのか分からないって書いてるでしょ?
こんがらがってないならまずは他人に理解できる日本語とコード例を書いてくれよ
間違いを指摘するとか以前に何を言いたいのかわからないんだって
俺だけじゃなくて何人も君が何を言いたいのか分からないって書いてるでしょ?
684デフォルトの名無しさん
2023/06/15(木) 23:29:09.39ID:iPvlEIxp685デフォルトの名無しさん
2023/06/15(木) 23:59:14.48ID:sGVU6kWB >>682
ライフタイムの「仮引数」としては省略されると全部同じ扱いで合ってるよ。
https://doc.rust-lang.org/reference/lifetime-elision.html
一方で呼び出す側が認識しているライフタイムの「実引数」は違っていてもいい。
>>655の例で言えば、呼び出す側が x: &'b str と y: &'c str を渡して戻り値を z: &'d str に束縛するなら、'a は 'b: 'a, 'c: 'a, 'a: 'd を満たす最小のライフタイムに推論される。
そのような 'a があれば、&'b str <: &'a str etc. の部分型付け関係に基づいて、引数はすべて一度 &'a str にアップキャストされると思っていればいい。はず。
適切な 'a が無ければライフタイムに関するコンパイルエラーになる。
https://doc.rust-lang.org/reference/subtyping.html
https://rust-lang.github.io/rfcs/2094-nll.html
ライフタイムの「仮引数」としては省略されると全部同じ扱いで合ってるよ。
https://doc.rust-lang.org/reference/lifetime-elision.html
一方で呼び出す側が認識しているライフタイムの「実引数」は違っていてもいい。
>>655の例で言えば、呼び出す側が x: &'b str と y: &'c str を渡して戻り値を z: &'d str に束縛するなら、'a は 'b: 'a, 'c: 'a, 'a: 'd を満たす最小のライフタイムに推論される。
そのような 'a があれば、&'b str <: &'a str etc. の部分型付け関係に基づいて、引数はすべて一度 &'a str にアップキャストされると思っていればいい。はず。
適切な 'a が無ければライフタイムに関するコンパイルエラーになる。
https://doc.rust-lang.org/reference/subtyping.html
https://rust-lang.github.io/rfcs/2094-nll.html
686デフォルトの名無しさん
2023/06/16(金) 00:20:26.24ID:Ej8ifuNd Rustのコードが'まみれになるのはそういう理由だよね
687デフォルトの名無しさん
2023/06/16(金) 00:24:30.59ID:0npxuivH >>685
> パラメーター内の省略された各ライフタイムは、別個のライフタイム パラメーターになります。
> パラメーター内の省略された各ライフタイムは、別個のライフタイム パラメーターになります。
688デフォルトの名無しさん
2023/06/16(金) 00:30:18.44ID:rJ7TTESK >>685
いや、全部別になる
参照引き数が2つあれば'aと'b別になる
ソース
https://doc.rust-lang.org/book/ch10-03-lifetime-syntax.html
The first rule is that the compiler assigns a lifetime parameter to each parameter that’s a reference.
In other words,
a function with one parameter gets one lifetime parameter: fn foo<'a>(x: &'a i32);
a function with two parameters gets two separate lifetime parameters: fn foo<'a, 'b>(x: &'a i32, y: &'b i32);
and so on.
(snip)
Let’s look at another example, this time using the longest function that had no lifetime parameters
when we started working with it in Listing 10-20:
fn longest(x: &str, y: &str) -> &str {
Let’s apply the first rule: each parameter gets its own lifetime.
This time we have two parameters instead of one, so we have two lifetimes:
fn longest<'a, 'b>(x: &'a str, y: &'b str) -> &str {
このようにコンパイラは解釈する
そして戻り値が一意に決まらないのでコンパイルエラーとなる
そのためコンパイラは改善提案の一つとして全部同じにする提案コードを出す
fn longest<'a,>(x: &'a str, y: &'a str) -> &'a str {
全部同じ扱いと思い込んでいる人はこの提案をコンパイラが解釈したと逆に思ってしまったのではないか
いや、全部別になる
参照引き数が2つあれば'aと'b別になる
ソース
https://doc.rust-lang.org/book/ch10-03-lifetime-syntax.html
The first rule is that the compiler assigns a lifetime parameter to each parameter that’s a reference.
In other words,
a function with one parameter gets one lifetime parameter: fn foo<'a>(x: &'a i32);
a function with two parameters gets two separate lifetime parameters: fn foo<'a, 'b>(x: &'a i32, y: &'b i32);
and so on.
(snip)
Let’s look at another example, this time using the longest function that had no lifetime parameters
when we started working with it in Listing 10-20:
fn longest(x: &str, y: &str) -> &str {
Let’s apply the first rule: each parameter gets its own lifetime.
This time we have two parameters instead of one, so we have two lifetimes:
fn longest<'a, 'b>(x: &'a str, y: &'b str) -> &str {
このようにコンパイラは解釈する
そして戻り値が一意に決まらないのでコンパイルエラーとなる
そのためコンパイラは改善提案の一つとして全部同じにする提案コードを出す
fn longest<'a,>(x: &'a str, y: &'a str) -> &'a str {
全部同じ扱いと思い込んでいる人はこの提案をコンパイラが解釈したと逆に思ってしまったのではないか
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 中国「国連安保理の許可なしに日本攻撃可能」 Xで旧敵国条項に言及… ★5 [BFU★]
- 中国「国連安保理の許可なしに日本攻撃可能」 Xで旧敵国条項に言及… ★6 [BFU★]
- 【サッカー】U-17W杯 日本代表、無念のベスト8敗退… チャンスは多く作ったが仕留め切れず オーストリアに0-1で敗戦 [冬月記者★]
- 【千葉】コンビニに尿入りペットボトル並べた疑い、26歳男「むしゃくしゃして」…購入した客が飲もうとしたところ臭いに違和感 [ぐれ★]
- 植田日銀総裁 「円安進行が物価高を起こしている」 ★4 [お断り★]
- 中国官製報道「日本経済はもう持たない」にネット民ツッコミ「ニュースだけ見てたら日本はもう百回くらい爆発してる」 [1ゲットロボ★]
- 中国大使館、「高市早苗の正体」を完璧に絵にしてしまう。こら才能あるでぇ! [592058334]
- 現役JKのお茶会スレ( ¨̮ )︎︎𖠚ᐝ157
- 自分、馬鹿なのでおっしゃる意味がわかりません
- WTO世界のコメ🌾価格は記録的な豊作により1年で35%下落(5キロで200円程度)と発表※日本は1年で3倍値上がり [709039863]
- 【ぺこ専🐰】なんG 兎田ぺこら突発配信実況スレ🏡【ホロライブ▶】
- NHKニュースウオッチ9「日本側は対話にオープンな姿勢で安定した日中関係を築きたい考えなのに中国が意固地で糸口が見いだせない」 [904151406]
