公式
https://www.rust-lang.org/
https://blog.rust-lang.org/
https://github.com/rust-lang/rust
Web上の実行環境
https://play.rust-lang.org
日本語の情報
https://rust-jp.rs/
※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/
※C++との比較は専用スレへ
C++ vs Rust
https://mevius.5ch.net/test/read.cgi/tech/1619219089/
※次スレは原則>>980が立てること
前スレ
Rust part13
https://mevius.5ch.net/test/read.cgi/tech/1636247099/
探検
Rust part14
■ このスレッドは過去ログ倉庫に格納されています
2022/02/12(土) 01:24:16.59ID:XYE+Rws6
551デフォルトの名無しさん
2022/03/28(月) 18:04:16.18ID:4U9zlcIi まずはif let試してみたら?
if let Ok(v) = r {v使ったほにゃらら}
if let Some(v) = o {v使ったほにゃらら}
if let Ok(v) = r {v使ったほにゃらら}
if let Some(v) = o {v使ったほにゃらら}
552デフォルトの名無しさん
2022/03/28(月) 18:35:07.91ID:GscKI9M9 >>549
エラーなどの分岐が発生しうる時に
必ず正常値だと確信できる場合、もしくは、正常値でなければpanic終了してよい場合に
unwrap()を用いる
逆に言えば上記の場合でなければ
unwrap()を用いてはいけない
エラーなどの有無による分岐処理が必要とされている場面なのだから
if letやmatchや?オペレータ(=エラー時に即return)を用いなければならない
エラーなどの分岐が発生しうる時に
必ず正常値だと確信できる場合、もしくは、正常値でなければpanic終了してよい場合に
unwrap()を用いる
逆に言えば上記の場合でなければ
unwrap()を用いてはいけない
エラーなどの有無による分岐処理が必要とされている場面なのだから
if letやmatchや?オペレータ(=エラー時に即return)を用いなければならない
553デフォルトの名無しさん
2022/03/28(月) 18:50:10.35ID:2Ad/srHw >>549
そのコードを晒せば識者が添削してくれるんじゃね?
そのコードを晒せば識者が添削してくれるんじゃね?
554デフォルトの名無しさん
2022/03/28(月) 18:52:11.66ID:3OxWqSrL rustでCのライブラリラップしてるけどまじでわからんこと起こりまくってて泣きそう
構造体に保持したはずのハンドラが不可解なタイミングで消えてつらい
Cにも疎いからしんどすぎる
構造体に保持したはずのハンドラが不可解なタイミングで消えてつらい
Cにも疎いからしんどすぎる
555デフォルトの名無しさん
2022/03/28(月) 20:40:56.66ID:BmyJew6n >>554
それはさすがにCでのメモリ管理とRustでのメモリ管理とそれらの違いを把握できていることが最低条件
それはさすがにCでのメモリ管理とRustでのメモリ管理とそれらの違いを把握できていることが最低条件
556デフォルトの名無しさん
2022/03/28(月) 23:00:56.50ID:51Y1Thh9 このスレに識者がいるという錯覚wwww
# Run cargo-geiger!
# 💀💀💀☢☢☢☢💀💀💀 !!!! Rust is ☢UNSAFE☢ !!!! 💀💀💀☢☢☢☢💀💀💀
# Run cargo-geiger!
# 💀💀💀☢☢☢☢💀💀💀 !!!! Rust is ☢UNSAFE☢ !!!! 💀💀💀☢☢☢☢💀💀💀
557デフォルトの名無しさん
2022/03/28(月) 23:06:14.30ID:labVp7ij558デフォルトの名無しさん
2022/03/28(月) 23:21:53.41ID:ie9Ayk2m559デフォルトの名無しさん
2022/03/29(火) 08:06:04.87ID:mWQ/GdlN >>555
ラップ用のライブラリて無いの?
ラップ用のライブラリて無いの?
560デフォルトの名無しさん
2022/03/29(火) 10:43:23.37ID:4onO4vig >>559
うまくラッピングしてあってもCライブラリの内部の参照とかのあたりがうまくRustの所有権システムに乗らなくてしんどいことが多々あるから仕方ないことな気がする
うまくラッピングしてあってもCライブラリの内部の参照とかのあたりがうまくRustの所有権システムに乗らなくてしんどいことが多々あるから仕方ないことな気がする
561デフォルトの名無しさん
2022/03/29(火) 13:05:38.54ID:jPLnZtHI ハンドラのトラブルで思い浮かぶのはDropで解放する機能を実装したのにCopy可能になってるケースかな
数値型で表現される場合が多いからCopy不可の型で包まないとCopy先で解放されたりして事故りやすい
基本的にDropトレイトとCopyトレイトを混ぜるのはNG
数値型で表現される場合が多いからCopy不可の型で包まないとCopy先で解放されたりして事故りやすい
基本的にDropトレイトとCopyトレイトを混ぜるのはNG
562デフォルトの名無しさん
2022/03/29(火) 22:26:38.54ID:2xBc8fyd >>561
CopyとDropの両立は出来なくなっているのでその問題は発生しない
https://doc.rust-lang.org/std/ops/trait.Drop.html#copy-and-drop-are-exclusive
| [Copy and Drop are exclusive]
| You cannot implement both Copy and Drop on the same type.
CopyとDropの両立は出来なくなっているのでその問題は発生しない
https://doc.rust-lang.org/std/ops/trait.Drop.html#copy-and-drop-are-exclusive
| [Copy and Drop are exclusive]
| You cannot implement both Copy and Drop on the same type.
563デフォルトの名無しさん
2022/03/29(火) 22:49:23.99ID:zunmlMTL564デフォルトの名無しさん
2022/04/03(日) 01:32:58.40ID:1As0eesQ https://github.com/diesel-rs/diesel/blob/v1.4.4/examples/postgres/getting_started_step_1/src/schema.rs
(https://diesel.rs/guides/getting-started.htmlの一部分)
このアロー演算子みたいなのが並んでいる部分って、どういう意味の文法なんですか?
一見してセッターかクロージャーなのかと思いきや、全然違うようで!?・・・・これは一体何なんですか????
(https://diesel.rs/guides/getting-started.htmlの一部分)
このアロー演算子みたいなのが並んでいる部分って、どういう意味の文法なんですか?
一見してセッターかクロージャーなのかと思いきや、全然違うようで!?・・・・これは一体何なんですか????
565デフォルトの名無しさん
2022/04/03(日) 01:41:18.67ID:9lFqLTmO >>564
マクロの呼び出し
マクロの呼び出し
566デフォルトの名無しさん
2022/04/03(日) 02:40:58.52ID:1As0eesQ567デフォルトの名無しさん
2022/04/04(月) 15:56:50.90ID:k6lsU7ys こういうのがエラーになるんだが、なんで?
エラーメッセージは Sized が満たされてないとか出るんだけど
dyn とか Box ってこういう使い方をするもんじゃないの?
let mut foo = Box::<dyn Fn() -> usize>::new(|| 1);
foo = Box::<dyn Fn() -> usize>::new(|| 2);
エラーメッセージは Sized が満たされてないとか出るんだけど
dyn とか Box ってこういう使い方をするもんじゃないの?
let mut foo = Box::<dyn Fn() -> usize>::new(|| 1);
foo = Box::<dyn Fn() -> usize>::new(|| 2);
568デフォルトの名無しさん
2022/04/04(月) 16:47:46.89ID:y2zkcNcq >>56
現状のrustではBox::newの引数に渡すのはコンパイル時にサイズが決まる型でないといけないから
dyn Fn() -> usize 型の値は渡せない
以下みたいに Box::new() で作った Box<T> 型の値を Box<dyn ...> にキャストするとやりたいことできると思う
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=e02762a4d2df4aed2c5396251cd0a07c
現状のrustではBox::newの引数に渡すのはコンパイル時にサイズが決まる型でないといけないから
dyn Fn() -> usize 型の値は渡せない
以下みたいに Box::new() で作った Box<T> 型の値を Box<dyn ...> にキャストするとやりたいことできると思う
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=e02762a4d2df4aed2c5396251cd0a07c
569デフォルトの名無しさん
2022/04/04(月) 16:48:14.52ID:y2zkcNcq570デフォルトの名無しさん
2022/04/04(月) 16:57:22.99ID:k6lsU7ys >>568
ありがとう。
ありがとう。
571デフォルトの名無しさん
2022/04/04(月) 23:27:32.81ID:tN0jAerG let mut foo: Box<dyn Fn() -> usize> = Box::new(|| 1);
foo = Box::new(|| 2);
// ↓ このケースならばFn()使わずともfn()で行ける
let mut foo: Box<fn() -> usize> = Box::new(|| 1);
foo = Box::new(|| 2);
// ↓ さらにBoxも不要となる
let mut foo: fn() -> usize = || 1;
foo = || 2;
foo = Box::new(|| 2);
// ↓ このケースならばFn()使わずともfn()で行ける
let mut foo: Box<fn() -> usize> = Box::new(|| 1);
foo = Box::new(|| 2);
// ↓ さらにBoxも不要となる
let mut foo: fn() -> usize = || 1;
foo = || 2;
572デフォルトの名無しさん
2022/04/04(月) 23:30:29.31ID:Uk+ayJmh unwrapじゃなく;がunwrapの代わりになったらよかったのに、構文解析に;なんてもう使ってないでしょうに
573デフォルトの名無しさん
2022/04/04(月) 23:41:54.63ID:3iHsJPtq574デフォルトの名無しさん
2022/04/05(火) 04:14:10.02ID:opdT/MNM >>572
文は式と区別するため必ず「;」を伴う
例えば関数やブロックの最後(=「}」の直前)に
「;」があると文となり返り値が()となる
「;」がないとその式の値が返り値となる
そしてブロックやif-elseやloopはその値の式なので文を形成する最後に登場する時は「}」の直後に「;」が来る
このように他のプログラミング言語とは異なりRustでは「;」の存在は重要である
文は式と区別するため必ず「;」を伴う
例えば関数やブロックの最後(=「}」の直前)に
「;」があると文となり返り値が()となる
「;」がないとその式の値が返り値となる
そしてブロックやif-elseやloopはその値の式なので文を形成する最後に登場する時は「}」の直後に「;」が来る
このように他のプログラミング言語とは異なりRustでは「;」の存在は重要である
575デフォルトの名無しさん
2022/04/05(火) 07:02:36.93ID:l+kYPJyP ブロックの最後の式がブロックの評価値になるのはRubyもそうだよ
だからと言って;にunwrap割り当てろとは思わないけど
だからと言って;にunwrap割り当てろとは思わないけど
576はちみつ餃子 ◆8X2XSCHEME
2022/04/05(火) 11:45:54.41ID:AUzgrMft unwrap はそれなりに目立つべきだろう。
一文字でどうにかするのはよろしくない。
一文字でどうにかするのはよろしくない。
577デフォルトの名無しさん
2022/04/05(火) 15:21:06.80ID:owP7OoVB unwrap連打することもあるんだからないな
他の言語みたいにunwrapを!で書けるようにするほうがマシ
他の言語みたいにunwrapを!で書けるようにするほうがマシ
578デフォルトの名無しさん
2022/04/05(火) 16:32:58.11ID:bH2gxj8m むしろunwrap_or_dieとかにして欲しいくらいだな
579デフォルトの名無しさん
2022/04/05(火) 17:27:14.20ID:jhOIIm2D 使いにくく書きにくくさせることで
馬鹿に知らず識らずマナーを強いてるんだよ
だからJavaでアクセッサ書くのダルいと怒ってるのと
rustでmutってタイプするのダルいと怒ってるのと
unwrapってタイプするのダルいと怒ってるのと
言ってる人はみなおなじバカ
ちなみに馬鹿に迎合してプロパティを準備してみせたウルトラバカ言語がC#
馬鹿に知らず識らずマナーを強いてるんだよ
だからJavaでアクセッサ書くのダルいと怒ってるのと
rustでmutってタイプするのダルいと怒ってるのと
unwrapってタイプするのダルいと怒ってるのと
言ってる人はみなおなじバカ
ちなみに馬鹿に迎合してプロパティを準備してみせたウルトラバカ言語がC#
580デフォルトの名無しさん
2022/04/05(火) 17:46:43.00ID:QA37bGpe >>578
これすき
これすき
581デフォルトの名無しさん
2022/04/05(火) 18:59:43.74ID:ZwTPjiXX だったらfnなんて短さ、どうなん?とは思うけどな。
582デフォルトの名無しさん
2022/04/05(火) 19:10:52.07ID:5iTMb1Xf 予約語と比較してどうする
583デフォルトの名無しさん
2022/04/05(火) 19:39:53.86ID:RVaVR3wo unwrap()は論理的に安全に剥がせると明確になる特殊な場合のみ使うべきもの
見てすぐ明確でない時はコメントを付けること推奨
見てすぐ明確でない時はコメントを付けること推奨
584はちみつ餃子 ◆8X2XSCHEME
2022/04/05(火) 20:30:38.50ID:AUzgrMft エラーメッセージ中で便宜上のライフタイム (?) として '1 というのが出てくることがあるけど、
これは一個目の引数のライフタイムという解釈でいいのかな?
これは一個目の引数のライフタイムという解釈でいいのかな?
585デフォルトの名無しさん
2022/04/05(火) 20:31:56.58ID:iTms6SBF unwrap()はリリースビルドでコンパイルエラーにして欲しい
Elmみたいにデバッグビルドでのみ使えるって感じで
Elmみたいにデバッグビルドでのみ使えるって感じで
586デフォルトの名無しさん
2022/04/05(火) 20:33:43.79ID:mQ5E2nDT unwrapでpanic起こしたら死刑
587デフォルトの名無しさん
2022/04/05(火) 20:45:42.53ID:RriiMuS9588デフォルトの名無しさん
2022/04/05(火) 20:52:13.73ID:VJaRyQKx 書き捨てのコードでいちいち例外処理書かされるの面倒だからunwrapは必要
589はちみつ餃子 ◆8X2XSCHEME
2022/04/05(火) 20:54:37.54ID:AUzgrMft unwrap を排除したらそれぞれで unwrap みたいなものを定義して使うようになっちゃうのがオチだよ。
590デフォルトの名無しさん
2022/04/05(火) 20:56:22.37ID:m6fZyHop >>583
コメントつけるならexpectでpanic時メッセージ出した方が良いのでは
コメントつけるならexpectでpanic時メッセージ出した方が良いのでは
591デフォルトの名無しさん
2022/04/05(火) 21:09:00.11ID:ks20fz6N592デフォルトの名無しさん
2022/04/05(火) 21:21:53.89ID:m6fZyHop593デフォルトの名無しさん
2022/04/05(火) 21:39:41.29ID:u7gEIfJv 一般的に、論理的に正しいがコードを見てすぐに把握できない可能性がある場合は、コメントを付ける慣例
594デフォルトの名無しさん
2022/04/05(火) 21:55:10.17ID:l+kYPJyP595デフォルトの名無しさん
2022/04/06(水) 00:04:36.01ID:L0tmrFUv >>578
Javaっぽいですね
Javaっぽいですね
596デフォルトの名無しさん
2022/04/06(水) 00:19:00.36ID:QeRv7PuV >>575
Null条件演算子とか他言語には一般的になって来てるけど、ライブラリでしかないはずのOption,Resultが言語の中核みたいになってるRustが
採用するとは思えない。Option条件演算子?
Null条件演算子とか他言語には一般的になって来てるけど、ライブラリでしかないはずのOption,Resultが言語の中核みたいになってるRustが
採用するとは思えない。Option条件演算子?
597デフォルトの名無しさん
2022/04/06(水) 00:29:51.46ID:NjGChFO7 他でのNull合体演算子つまりNull時にデフォルト値とする演算はRustではunwrap_or
もちろんそれら他の言語ではT型そのものにNullがありミスを防げないが
RustではT型とOption<T>型に分かれているためミスが起きない
もちろんそれら他の言語ではT型そのものにNullがありミスを防げないが
RustではT型とOption<T>型に分かれているためミスが起きない
598デフォルトの名無しさん
2022/04/06(水) 03:59:22.01ID:pOKs9eQ1 いや言語的な特性のこと言ってるわけじゃねーからwいちいち知識疲労で解説しなくていいからw
599デフォルトの名無しさん
2022/04/06(水) 08:23:07.29ID:V4186sOU ルビー君と同じ病気だよね
しかも間違ってるし
しかも間違ってるし
600デフォルトの名無しさん
2022/04/06(水) 09:21:37.82ID:X0SajXCN601デフォルトの名無しさん
2022/04/06(水) 10:07:13.82ID:LgAnKe/v >>600
try構文使わずとも書けるよね
fn main() {
let a = Some([[1, 11], [2, 22], [3, 33]]);
let x = (|| Some(a?.last()?.first()? * 100))();
assert_eq!(x, Some(300));
}
try構文使わずとも書けるよね
fn main() {
let a = Some([[1, 11], [2, 22], [3, 33]]);
let x = (|| Some(a?.last()?.first()? * 100))();
assert_eq!(x, Some(300));
}
602デフォルトの名無しさん
2022/04/06(水) 10:33:16.53ID:Dw8vI7FQ603デフォルトの名無しさん
2022/04/06(水) 11:49:10.11ID:rSNzLcDe604デフォルトの名無しさん
2022/04/06(水) 17:06:15.48ID:SXJV6JXP >>601
なるほど、クロージャにすれば?使えるって発想なかったわ
なるほど、クロージャにすれば?使えるって発想なかったわ
605デフォルトの名無しさん
2022/04/06(水) 18:11:52.43ID:9SYtmHqH なるほどじゃねーよwww
606デフォルトの名無しさん
2022/04/07(木) 04:17:47.69ID:tEZE72Zs stableでどうしてもtryっぽく書きたい場合の苦肉の策でしかないな
607デフォルトの名無しさん
2022/04/07(木) 07:08:56.80ID:GJZ5/Xn8 クロージャ(ラムダ)の即時実行は他の色々な言語でも行なう頻出パターン
Rustでは他にもforやwhileから値を返したい時などにもクロージャの即時実行で行なう
Rustでは他にもforやwhileから値を返したい時などにもクロージャの即時実行で行なう
608デフォルトの名無しさん
2022/04/07(木) 07:19:00.45ID:M1TIObhS これって、公開するメソッドのの数だけディスパッチャメソッドが増えてく感じなの?
https://tourofrust.com/81_ja.html
結構めんどくさいような気もするんだけど・・・・こういうのってエディタの拡張とかが勝手やってくれたりとか、支援みたいなのあるの???
https://tourofrust.com/81_ja.html
結構めんどくさいような気もするんだけど・・・・こういうのってエディタの拡張とかが勝手やってくれたりとか、支援みたいなのあるの???
609デフォルトの名無しさん
2022/04/07(木) 07:36:57.92ID:GySucWIC >>608
プログラマーは全く何もしなくてよい
dyn Traitの場合はメソッド数分の関数ポインタを持つディスパッチ用テーブルが各使用型毎に自動的に生成されて実行時に自動的に適用される
impl Traitの場合は使用メソッドの関数がモノモーフィゼーションすなわち各使用型毎にコンパイル時に展開される
逆にプログラマーが自分で分岐処理する第三の方法としてenumに各使用形を収容してmatchによる分岐処理があってこの方法が有利になるケースもある
プログラマーは全く何もしなくてよい
dyn Traitの場合はメソッド数分の関数ポインタを持つディスパッチ用テーブルが各使用型毎に自動的に生成されて実行時に自動的に適用される
impl Traitの場合は使用メソッドの関数がモノモーフィゼーションすなわち各使用型毎にコンパイル時に展開される
逆にプログラマーが自分で分岐処理する第三の方法としてenumに各使用形を収容してmatchによる分岐処理があってこの方法が有利になるケースもある
610デフォルトの名無しさん
2022/04/07(木) 10:32:38.29ID:bzCO3d2+ C++ だと静的な多相はテンプレートで、動的な多相は仮想関数 (抽象クラス) でやってるわけだけど、
Rust だと dyn だけで切り替えられるってわけだな。
Rust だと dyn だけで切り替えられるってわけだな。
611デフォルトの名無しさん
2022/04/07(木) 12:45:48.26ID:Qjh8kwCx612デフォルトの名無しさん
2022/04/07(木) 13:22:38.91ID:bzCO3d2+ わかる。
Rust の型システム・所有権システムは理屈が分かってないと慣れでどうにかなるもんではない。
理解した上でなら手を動かしてみるのは悪くないと思うけど。
Rust の型システム・所有権システムは理屈が分かってないと慣れでどうにかなるもんではない。
理解した上でなら手を動かしてみるのは悪くないと思うけど。
613デフォルトの名無しさん
2022/04/07(木) 15:06:14.55ID:pUyNlzjX614デフォルトの名無しさん
2022/04/07(木) 18:17:40.12ID:6J24GmAj >>607
クロージャの即時呼び出しは基本的に言語機能が足りない場合のワークアラウンドでしょ
クロージャの即時呼び出しは基本的に言語機能が足りない場合のワークアラウンドでしょ
615デフォルトの名無しさん
2022/04/07(木) 18:20:36.61ID:6QFUvNfL クロージャは引数と戻り値を推論してくれるからこそだね
関数でも、なんかの条件付きでもいいから推論してほしいわ
関数でも、なんかの条件付きでもいいから推論してほしいわ
616デフォルトの名無しさん
2022/04/07(木) 18:21:01.63ID:6QFUvNfL 推論というか、型推論ね
617デフォルトの名無しさん
2022/04/07(木) 18:33:18.44ID:6J24GmAj 関数含むモジュールレベル定義の型推論はやろうと思えばできるけど
コンパイル時間への影響がでかいのと、ドキュメント的な意味で型を書いた方がわかりやすいという理由で
敢えて対応していないとどこかで読んだ気がする
とはいえ戻り値のimpl Traitは制限された形での型推論と言えるんじゃないかな
コンパイル時間への影響がでかいのと、ドキュメント的な意味で型を書いた方がわかりやすいという理由で
敢えて対応していないとどこかで読んだ気がする
とはいえ戻り値のimpl Traitは制限された形での型推論と言えるんじゃないかな
618デフォルトの名無しさん
2022/04/07(木) 18:34:30.25ID:QZwctsvV >>614
Rustでは型指定しなくて済む利点もあるしクロージャと関数の使い分けの一種じゃないかな
もちろん今回のケースはreturn値を取る別種のブロックがあれば済むけども
それをわざわざ導入しなくてもクロージャ即時呼び出しで十分
Rustでは型指定しなくて済む利点もあるしクロージャと関数の使い分けの一種じゃないかな
もちろん今回のケースはreturn値を取る別種のブロックがあれば済むけども
それをわざわざ導入しなくてもクロージャ即時呼び出しで十分
619デフォルトの名無しさん
2022/04/08(金) 04:35:42.40ID:fis9zD2L Rustのコンパイルの遅さは型推論とかじゃなく、cargoという非常に悪い仕組みのせい
620デフォルトの名無しさん
2022/04/10(日) 02:43:45.04ID:NYexxOz5 そんなことないよ
cargo build --timings いいね
cargo build --timings いいね
621デフォルトの名無しさん
2022/04/10(日) 11:44:22.72ID:UjiUu+PI Rust 1.60来てたか
622デフォルトの名無しさん
2022/04/12(火) 10:03:48.28ID:mYiJhF+M OnceCell<T> って &'static T が取れるわけじゃないんですのん?
623デフォルトの名無しさん
2022/04/12(火) 10:14:36.57ID:mYiJhF+M まちがえた
× OnceCell<T>
○ const Lazy<T>
× OnceCell<T>
○ const Lazy<T>
624デフォルトの名無しさん
2022/04/12(火) 10:20:45.37ID:9tHmQ2kh getでOption<&T>が取れる
初期化してなければNone
初期化してなければNone
625デフォルトの名無しさん
2022/04/12(火) 10:26:05.90ID:9tHmQ2kh LazyならDerefを適用させて使う
*lazyで&Tや&mut T
*lazyで&Tや&mut T
626デフォルトの名無しさん
2022/04/12(火) 10:46:54.62ID:mYiJhF+M https://play.rust-lang.org/?version=nightly&mode=debug&edition=2021&gist=22ed821be70a494615ca8a661e98b78f
ごめんこういうこと
実際使ってるとき&'staticが取れないのが原因だと思ってそう書いちゃったけど違う原因かもしれないです
ごめんこういうこと
実際使ってるとき&'staticが取れないのが原因だと思ってそう書いちゃったけど違う原因かもしれないです
627デフォルトの名無しさん
2022/04/12(火) 11:20:51.11ID:9tHmQ2kh それはconstではなくstaticで宣言
628デフォルトの名無しさん
2022/04/12(火) 11:33:29.72ID:/UwhBms2 プログラム開始時点での有効性を保証できないから何となくだけどコンパイラの事情で無理そう
&'staticって↓みたいな使い方もできるからLazyだとBの参照先が初期化済みか分からない
static A: u32 = 0;
static B: &'static u32 = &A;
&'staticって↓みたいな使い方もできるからLazyだとBの参照先が初期化済みか分からない
static A: u32 = 0;
static B: &'static u32 = &A;
629デフォルトの名無しさん
2022/04/12(火) 11:37:37.75ID:9tHmQ2kh nightlyのstd::lazy::Lazyではなく
stableでも使えるonce_cellを使用
そのコードと同じ例がこれで動く
use once_cell::sync::Lazy;
static LAZY: Lazy<i32> = Lazy::new(|| 92);
fn main() {
let a: &'static i32 = sub();
println!("{}", *a);
}
fn sub() -> &'static i32 {
&*LAZY
}
stableでも使えるonce_cellを使用
そのコードと同じ例がこれで動く
use once_cell::sync::Lazy;
static LAZY: Lazy<i32> = Lazy::new(|| 92);
fn main() {
let a: &'static i32 = sub();
println!("{}", *a);
}
fn sub() -> &'static i32 {
&*LAZY
}
630デフォルトの名無しさん
2022/04/12(火) 11:44:54.53ID:mYiJhF+M あーなるほど
なぜか'staticでmutableなのがstatic、immutableなのがconstと勘違いしてました
constって使用の度に式展開するやつだったんですね
temporary valueなんて無いじゃんとか無限に悩んでた
ありがとうございます
なぜか'staticでmutableなのがstatic、immutableなのがconstと勘違いしてました
constって使用の度に式展開するやつだったんですね
temporary valueなんて無いじゃんとか無限に悩んでた
ありがとうございます
631デフォルトの名無しさん
2022/04/12(火) 11:47:13.23ID:9tHmQ2kh >>630
constはコンパイル時点で定まる定数
constはコンパイル時点で定まる定数
632デフォルトの名無しさん
2022/04/13(水) 09:59:43.40ID:Ee+AuAP4 こんな事も分からない触ってるだけで偉いと勘違いするゴミ言語
633デフォルトの名無しさん
2022/04/15(金) 00:23:00.39ID:jmI/h0lt634デフォルトの名無しさん
2022/04/15(金) 00:36:10.15ID:8Ev0Y6We ソフトウエアを書くにはカテゴリー論から勉強しろということかな?
635デフォルトの名無しさん
2022/04/15(金) 00:46:18.85ID:9XxTBRIR 名言もらいました
ポインタはポインタのメタファ
ポインタはポインタのメタファ
636デフォルトの名無しさん
2022/04/15(金) 00:56:52.75ID:w32fyljo >「慣れでどうにかなるもんではない」っていうのはつまり、
>わかった気になってなんとなくで書いてるやつはまだ理解してないって話でしょ。
全然違う。
型システムより先に文章を理解する訓練をした方がいいぞ。
>わかった気になってなんとなくで書いてるやつはまだ理解してないって話でしょ。
全然違う。
型システムより先に文章を理解する訓練をした方がいいぞ。
637デフォルトの名無しさん
2022/04/15(金) 01:20:52.56ID:+d47tguH638デフォルトの名無しさん
2022/04/15(金) 08:25:31.44ID:xhqbcuaF >>637
さすがにそれを「普通の人」というのは無謀。
さすがにそれを「普通の人」というのは無謀。
639デフォルトの名無しさん
2022/04/15(金) 08:41:02.84ID:WzhbtFPJ 100点オジサンや複製オジサンみたいな自分は理解してるつもりの勘違いさんが一番迷惑
640デフォルトの名無しさん
2022/04/15(金) 08:59:01.96ID:uOSWEI+/ >>638
普通のプログラマーなら他の言語でクロージャ(ラムダ等)くらいはさすがに使ったことあるから高階は大丈夫なはず
ジェネリクスもスクリプト言語などの動的型付け言語なら計らずともそのままジェネリックな関数となってる
そこでRustでのみ必要となる概念はそのジェネリックな関数内を安全な操作とするためのトレイト境界の指定
これはコンパイラがエラーとして教えてくれるため指定を忘れることがない
だから普通のプログラマーなら大丈夫じゃないかな
普通のプログラマーなら他の言語でクロージャ(ラムダ等)くらいはさすがに使ったことあるから高階は大丈夫なはず
ジェネリクスもスクリプト言語などの動的型付け言語なら計らずともそのままジェネリックな関数となってる
そこでRustでのみ必要となる概念はそのジェネリックな関数内を安全な操作とするためのトレイト境界の指定
これはコンパイラがエラーとして教えてくれるため指定を忘れることがない
だから普通のプログラマーなら大丈夫じゃないかな
641デフォルトの名無しさん
2022/04/15(金) 10:17:08.40ID:xMTiu+TR 相変わらず複製おじさんは不勉強でキツイな
「普通の人」は他の言語でジェネリック使ったことあるからこんな恥ずかしい長文を書かない
「普通の人」は他の言語でジェネリック使ったことあるからこんな恥ずかしい長文を書かない
642デフォルトの名無しさん
2022/04/15(金) 10:53:34.01ID:aXBzZfpz そうでなくRustではtrait境界が足りなければコンパイルエラーで指摘されるからスクリプト言語から来た人でも困らないって話やろ
643デフォルトの名無しさん
2022/04/15(金) 11:18:53.45ID:/A+hDicd そんなことよりこのエラーの意味を教えてくれ
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=21cdaa3e90ffdd6a5ef2e06302afe03b
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=21cdaa3e90ffdd6a5ef2e06302afe03b
644デフォルトの名無しさん
2022/04/15(金) 11:41:06.84ID:ZUiiq5D1645デフォルトの名無しさん
2022/04/15(金) 12:09:57.32ID:Y8j5AoVD おじさん使いの人はいつもそうだよな
646デフォルトの名無しさん
2022/04/15(金) 12:26:07.26ID:hAkRYyug >>640
「クロージャ(ラムダ等)くらいはさすがに使ったことある」からといって「論理とメタ的な考え……ができる」ではないことは論理的に明らか。
全然論理的な考えができていない>640自身が反証になっているね。
「クロージャ(ラムダ等)くらいはさすがに使ったことある」からといって「論理とメタ的な考え……ができる」ではないことは論理的に明らか。
全然論理的な考えができていない>640自身が反証になっているね。
647デフォルトの名無しさん
2022/04/15(金) 12:58:35.38ID:b6lK2Xo1 >>643
lifetime mismatchのエラーが分かりにくければ、lifetimeを省略せずに明記して確認すればいい
lifetime mismatchのエラーが分かりにくければ、lifetimeを省略せずに明記して確認すればいい
648デフォルトの名無しさん
2022/04/15(金) 13:07:01.81ID:FU35awjY あと#![feature(nll)]でビルドしても分かるはず
649デフォルトの名無しさん
2022/04/15(金) 13:08:53.72ID:OaJu93JV >>646
むしろ論理とメタわからんプログラマーは言語関係なく向いてないっす
むしろ論理とメタわからんプログラマーは言語関係なく向いてないっす
650デフォルトの名無しさん
2022/04/15(金) 13:30:54.07ID:uTkCAN7R 理解の程度を0か1で考える人は底辺プログラマーに向いてる
651デフォルトの名無しさん
2022/04/15(金) 14:19:47.21ID:Xm9+ELTI 所有権でよくわからないって言えばさあ
fn asdf() -> &str{
let s = "jkl";
s
}
みたいにした時に、関数を抜ける際にstrのライフタイムが尽きちゃう訳じゃない
でも逆になぜ&strしかないのに、どうして関数を抜けるところまでstrのライフタイムが持つのか?そこら辺がよくわからねえな
&strを通じてstrを所有できているのであれば、&strをリターンできても良いような気もするのに・・・・どうなってんの?
fn asdf() -> &str{
let s = "jkl";
s
}
みたいにした時に、関数を抜ける際にstrのライフタイムが尽きちゃう訳じゃない
でも逆になぜ&strしかないのに、どうして関数を抜けるところまでstrのライフタイムが持つのか?そこら辺がよくわからねえな
&strを通じてstrを所有できているのであれば、&strをリターンできても良いような気もするのに・・・・どうなってんの?
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 首相官邸前で「戦争あおるな」 台湾有事巡る答弁に抗議 [蚤の市★]
- 高市首相告白「『なめられない服』を選ぶことに数時間を費やしました」「外交交渉でマウント取れる服、買わなくてはいかんかもなぁ」 [ぐれ★]
- 【高市リスク】立民・小西洋之参院議員「高市総理がとんでもない安全保障オンチで外交オンチ」 [ぐれ★]
- 【赤坂ライブハウス刺傷】逃走していた自衛官の男(43)を殺人未遂の疑いで逮捕 警視庁 被害女性とは知人関係 [Ailuropoda melanoleuca★]
- 『DOWNTOWN+』会員数50万人突破で見えてきた 松本人志の“月収4ケタ万円”驚愕収入 [阿弥陀ヶ峰★]
- 【千葉】コンビニに尿入りペットボトル並べた疑い、26歳男「むしゃくしゃして」…購入した客が飲もうとしたところ臭いに違和感 [ぐれ★]
- 眼帯つけようかな
- 天ぷら食いたい
- 勇者の母「ん……ふっ、起きなさいっ……私のっ……私のかわいい坊やっ、今日は貴方が……んはっ……勇者として旅立つ日……うふふ」
- 大塚芳忠のASMR
- 東京てこんな女ばっかいるの?
- ペヤング超大盛り完食出来そうもない
