Rust part14

■ このスレッドは過去ログ倉庫に格納されています
2022/02/12(土) 01:24:16.59ID:XYE+Rws6
公式
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/
2022/03/14(月) 08:02:53.43ID:fAU8x8Os
真面目な質問はワッチョイありに書き込んでワッチョイ無しスレから誘導すればいいよ。

ワッチョイ無しスレは過疎らないし、ワッチョイスレは荒らしNGできるし文句言うやつは荒らし以外おるまい。
スレの再利用もできるしな。
513デフォルトの名無しさん
垢版 |
2022/03/14(月) 11:19:45.82ID:ptWJKaRn
https://tech.aptpod.co.jp/entry/2021/12/03/070000

これとかそれっぽい?
でもcratesはそれっぽい名前の奴ほど放置ライブラリという特長があるから正直調べ方がわからん
2022/03/14(月) 12:57:45.51ID:KdHvJNkw
Linuxでコンソールアプリだとncursesが思い浮かぶ
Rustでは使ったことないけど

https://crates.io/crates/ncurses
515デフォルトの名無しさん
垢版 |
2022/03/14(月) 13:19:49.96ID:qGkzd/mK
あ、そうか。コンソールアプリか。じゃあcrosstermでいいのかも
https://docs.rs/crossterm/0.5.5/crossterm/enum.KeyEvent.html
2022/03/14(月) 13:24:17.18ID:2R75ztaH
kbihitぽいのなら自分はtermion使ってます。
https://github.com/redox-os/termion/blob/master/examples/keys.rs
2022/03/14(月) 16:56:04.09ID:U570WKgz
# 俺様はcrosstermに一票w
cargo install cargo-edit cargo-geiger
cargo new crossterm_example
cd crossterm_example
cargo add crossterm
cat >src/main.rs <<EOF
use std::time::Duration;
use crossterm::event::{poll, read, Event, KeyCode};
use crossterm::terminal::{enable_raw_mode, disable_raw_mode};
use std::io::Error;
fn main() -> Result<(), Error> {
enable_raw_mode()?;
loop {
if poll(Duration::from_millis(1_000))? {
let event = read()?;
println!("Event::{:?}\r", event);
if event == Event::Key(KeyCode::Esc.into()) {
break;
}
} else {
println!(".\r");
}
}
disable_raw_mode()
}
EOF
cargo build
cargo run
cargo geiger

# Run cargo-geiger!
# 💀💀💀☢☢☢☢💀💀💀 !!!! Rust is ☢UNSAFE☢ !!!! 💀💀💀☢☢☢☢💀💀💀
2022/03/14(月) 23:31:15.69ID:zZd4y2TR
>>511
Rustで書いてもstdinへの設定自体は他の言語の時と全く同じ
以下C言語風でRust的に書けるnixクレート使用

まずstdinがエコーされたり改行まで入力されないのを解除
let mut stdin = stdin();
let mut termios = tcgetattr(stdin.as_raw_fd())?;
termios.local_flags &= !(LocalFlags::ECHO | LocalFlags::ICANON);
tcsetattr(stdin.as_raw_fd(), SetArg::TCSANOW, &termios)?;
これでstdin.read()で1文字ずつ入力キーを得られる

次に入力がない時にブロックされないように設定
let mode = fcntl(stdin.as_raw_fd(), FcntlArg::F_GETFL)?;
let mode = OFlag::from_bits_truncate(mode);
fcntl(stdin.as_raw_fd(), FcntlArg::F_SETFL(mode | OFlag::O_NONBLOCK))?;
これで入力がなくてもstdin.read()がすぐに返ってくる

あとは自分の好きな仕様で例えば
let mut input = [0; 1];
let code = match stdin.read(&mut input) {
Ok(_) => Some(input[0]),
Err(ref err) if err.kind() == ErrorKind::WouldBlock => None,
Err(err) => Err(err)?,
};
これで入力ASCIIコードがOptionで得られる

他にも例えば非同期とチャネルを使ってインタフェースを洗練して
ノンブロッキングにせずともread()とチャネルへのsend()を繰り返す
というキー入力専用の非同期タスクを作って
使う側ではチャネルからpoll_recv()で入力があるか見るとか
あるいはそもそも入力なしという状態を得る必要がないならば
その非同期タスクでread()がある度に指定クロージャを呼び出すなど
2022/03/14(月) 23:33:12.59ID:zZd4y2TR
ちなみにstdinからのASCIIコード取得では不満で
もっとrawレベルのイベントが欲しいならば
libevdevをRustで扱えるevdev-rsを使う
2022/03/16(水) 14:04:08.44ID:shSPVxo8
turbo rustはまだですか?
2022/03/17(木) 08:28:29.04ID:H9cH52GC
regex crateの問題って
外部ユーザー入力の正規表現をパースして使っていた時に
めっちゃ複雑な正規表現だとDoS攻撃になっちゃう恐れがあったという話か
2022/03/17(木) 22:36:27.41ID:IHLBrgoM
よほどのことがない限り
外部のユーザに正規表現を入力してもらうケースは無さそうだよな
2022/03/17(木) 23:20:48.15ID:Eu4GzPZT
>>521
rustのregexってNFAベースなんだっけ?
2022/03/18(金) 12:37:25.55ID:B5OelSHS
iteratorのメソッドのnthってどういう意味?なんかの略?
2022/03/18(金) 12:41:29.69ID:slshVm4c
1st, 2nd 3rd, 4th, 5th, 6th, ..., Nth ←コレw

# Run cargo-geiger!
# 💀💀💀☢☢☢☢💀💀💀 !!!! Rust is ☢UNSAFE☢ !!!! 💀💀💀☢☢☢☢💀💀💀
2022/03/18(金) 13:17:22.26ID:2Ztz8OnF
4th, 5th, 6th.....
2022/03/18(金) 13:55:50.66ID:B5OelSHS
いやいやいやいやいやいやいやいやいやいや
うそやろ?だまされないぞ!( `・ω・´)
2022/03/18(金) 14:22:27.69ID:2Ztz8OnF
起源は何かなEmacs Lispにもあるし相当古そう
(nth N LIST)
Return the Nth element of LIST. N counts from zero. If LIST is not that long, nil is returned.
2022/03/18(金) 14:29:42.95ID:7XcvYw+s
色んな言語で使われている
Lispでnthはリストのn番目を返す
C++でstd::nth_elementはn番目を基準とする並べ替え
CSSで:nth-child()はn番目を選択
など
2022/03/18(金) 14:33:37.94ID:F1TvbrVr
nthの起源はプログラミングじゃなくて数学かなー
数学用語としてOxford Dictionaryとかにも掲載されてる
https://www.lexico.com/en/definition/nth
2022/03/18(金) 14:37:03.84ID:F1TvbrVr
と思ったけど、辞書の意味とはちょっと違うかな・・・
2022/03/18(金) 15:51:11.43ID:B5OelSHS
nthでもgetでもいいけど、添え字で取得するのは無理なんだよね?
2022/03/18(金) 15:55:18.13ID:rmmV0EJL
定数時間でアクセスできないものに添え字を使うのは紛らわしいからやってないのでは
あとイテレータの場合nextが&mut selfを要求するのでIndexは実装できないし
IndexMutを実装するにしても0..n番目の要素をconsumeするから添え字のセマンティクスに合わないと思う
2022/03/18(金) 15:57:14.32ID:d7SFtIuN
コストが高かったり危険だったりするものは字面の上でも目立って欲しいしな。
2022/03/18(金) 16:12:59.80ID:slshVm4c
iteratorは原則順次アクセスだから、原則ランダムアクセスな添字は一般的ではないw
何でも聞いてしまう子は想像力がやや不足しているw

# Run cargo-geiger!
# 💀💀💀☢☢☢☢💀💀💀 !!!! Rust is ☢UNSAFE☢ !!!! 💀💀💀☢☢☢☢💀💀💀
2022/03/18(金) 16:13:55.18ID:d7SFtIuN
>>527
arity (アリティ; 引数の個数) も unary とか binary の -ary を名詞化したものダゾ
2022/03/18(金) 16:22:51.49ID:8ZTH26QZ
>>532
自由に添え字でアクセスしたい時はcollect()する
もちろんcollectはその分のコストがかかるけど他の言語では常にそのコストを強制されてるのだから
もし必要ならばRustでもそのコストを払えばよい
2022/03/18(金) 17:17:28.19ID:rmmV0EJL
>>532
昔は RandomAccessIterator があったけど unstable のまま rust 1.2.0 で deprecate されたみたい
https://doc.rust-lang.org/1.3.0/std/iter/trait.RandomAccessIterator.html
> trait has not proven itself as a widely useful abstraction for iterators, and more time may be needed for iteration on the design

C++やDには random access iterator はあるけど、 rust では今のところ必要ないという判断みたい
2022/03/18(金) 17:40:43.61ID:RcRFkS5N
>>538
それは内部でメモ化のコストを払うだけだからね
どうしても残したいならtake/take_while等してcollectでもいい
一方でnthはメモ化コストゼロ
2022/03/18(金) 18:26:51.78ID:rmmV0EJL
>>539
RandomAccessIteratorはslice::Iterなどランダムアクセスできるイテレーターに実装されてるトレイトなのでメモ化のコスト云々は関係ないよ
2022/03/18(金) 22:57:59.74ID:l4s3ZEj8
>>537
ヒープ確保と解放はコスト高いけど
定数もしくは上限Nがある時は
collect::<ArrayVec<_,N>>()でスタックに確保できる
2022/03/19(土) 00:16:53.31ID:Ul4y/GRp
ある型 T がトレイト A とトレイト B を実装していることという制約はたとえば以下のように書けますが、

struct Foo<T: A + B> {
state: T
}

ここで T がトレイト C を実装して「いない」という制約を付ける (C を実装していたらコンパイルエラーにする) 方法はありますか?
543デフォルトの名無しさん
垢版 |
2022/03/19(土) 01:34:14.63ID:Ksx+z9b2
なさそう
2022/03/19(土) 10:14:06.85ID:Ul4y/GRp
直接的にトレイトが実装されていないことを指定することは出来ないようですが
optin_builtin_traits を使えば表現は出来そうですね。
Rust ユーザー向けのドキュメントが見つからないんですがこれって stable なんですかね?
2022/03/19(土) 14:36:55.65ID:KmQbL+gm
まだこうだな
#![feature(negative_impls)]
#![feature(auto_traits)]
546デフォルトの名無しさん
垢版 |
2022/03/19(土) 19:35:20.82ID:mtaqaIpW
始めたばっかでよくわかんないんだけど、https://docs.rsって公式か何かのまともなサイトなの?
10進数の小数が使いたくてhttps://docs.rs/rust_decimal/latest/rust_decimal/#これ見てたんだけど、sourceってところ押したらよくわからんものが表示されてしまう・・・・
2022/03/19(土) 20:51:08.52ID:jYZm0dN8
>>546
https://www.rust-lang.org/governance/teams/dev-tools#docs-rs
ここにあるとおりrustの開発元でメンテされてる
よくわからんものがどんなものなのかよくわからないけど、マクロやderiveで生成されたコードのソースは変な場所が表示されることはあるかも
2022/03/20(日) 01:49:46.57ID:oj1vR2vz
docs.rsは公式サイトだけど内容はオープンソースで登録されたソースコード(コメント)から
機械的に生成してるだけだからちゃんとしてるとは限らない
sourceは生成元のソースコードのリンクになってて説明が分からんかったらソース読めってスタンス
549デフォルトの名無しさん
垢版 |
2022/03/28(月) 17:41:10.51ID:T53tBXly
始めたばっかでよくわかんないんだけど、ちょっとコードを書いただけで.unwrap()だらけになってしまう
もう、3行に1つは.unwrap()、ひどいと1行に3箇所ぐらい.unwap()だ
素人目に見ても流石におかしいように見えるも、解決法がよくわからないぜ
550デフォルトの名無しさん
垢版 |
2022/03/28(月) 17:42:54.07ID:T53tBXly
.unwrap()ってさっきまで沢山打ってたのに、1箇所打ち間違ったぜ
2022/03/28(月) 18:04:16.18ID:4U9zlcIi
まずはif let試してみたら?

if let Ok(v) = r {v使ったほにゃらら}
if let Some(v) = o {v使ったほにゃらら}
2022/03/28(月) 18:35:07.91ID:GscKI9M9
>>549
エラーなどの分岐が発生しうる時に
必ず正常値だと確信できる場合、もしくは、正常値でなければpanic終了してよい場合に
unwrap()を用いる

逆に言えば上記の場合でなければ
unwrap()を用いてはいけない

エラーなどの有無による分岐処理が必要とされている場面なのだから
if letやmatchや?オペレータ(=エラー時に即return)を用いなければならない
2022/03/28(月) 18:50:10.35ID:2Ad/srHw
>>549
そのコードを晒せば識者が添削してくれるんじゃね?
2022/03/28(月) 18:52:11.66ID:3OxWqSrL
rustでCのライブラリラップしてるけどまじでわからんこと起こりまくってて泣きそう
構造体に保持したはずのハンドラが不可解なタイミングで消えてつらい
Cにも疎いからしんどすぎる
2022/03/28(月) 20:40:56.66ID:BmyJew6n
>>554
それはさすがにCでのメモリ管理とRustでのメモリ管理とそれらの違いを把握できていることが最低条件
2022/03/28(月) 23:00:56.50ID:51Y1Thh9
このスレに識者がいるという錯覚wwww

# Run cargo-geiger!
# 💀💀💀☢☢☢☢💀💀💀 !!!! Rust is ☢UNSAFE☢ !!!! 💀💀💀☢☢☢☢💀💀💀
2022/03/28(月) 23:06:14.30ID:labVp7ij
>>556
C/C++/Rustスレでも次世代言語Rustスレでも暴れ回って嫌われてるようですねガイガーくん
ここRust本スレには来ないでもらえますか?
2022/03/28(月) 23:21:53.41ID:ie9Ayk2m
>>553
それがいいね
対処方法はコード次第だから一部でも晒さないと一般的なアドバイスに留まってしまう
2022/03/29(火) 08:06:04.87ID:mWQ/GdlN
>>555
ラップ用のライブラリて無いの?
560デフォルトの名無しさん
垢版 |
2022/03/29(火) 10:43:23.37ID:4onO4vig
>>559
うまくラッピングしてあってもCライブラリの内部の参照とかのあたりがうまくRustの所有権システムに乗らなくてしんどいことが多々あるから仕方ないことな気がする
2022/03/29(火) 13:05:38.54ID:jPLnZtHI
ハンドラのトラブルで思い浮かぶのはDropで解放する機能を実装したのにCopy可能になってるケースかな
数値型で表現される場合が多いから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.
2022/03/29(火) 22:49:23.99ID:zunmlMTL
>>557
え?なんで?w
# Run cargo-geiger!
# 💀💀💀☢☢☢☢💀💀💀 !!!! Rust is ☢UNSAFE☢ !!!! 💀💀💀☢☢☢☢💀💀💀
564デフォルトの名無しさん
垢版 |
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の一部分)
このアロー演算子みたいなのが並んでいる部分って、どういう意味の文法なんですか?
一見してセッターかクロージャーなのかと思いきや、全然違うようで!?・・・・これは一体何なんですか????
2022/04/03(日) 01:41:18.67ID:9lFqLTmO
>>564
マクロの呼び出し
566デフォルトの名無しさん
垢版 |
2022/04/03(日) 02:40:58.52ID:1As0eesQ
>>565
マクロはわかんなかった、ありがとう!
ゆっくり調べてくる!
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);
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
2022/04/04(月) 16:48:14.52ID:y2zkcNcq
>>568>>567 宛て
2022/04/04(月) 16:57:22.99ID:k6lsU7ys
>>568
ありがとう。
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;
2022/04/04(月) 23:30:29.31ID:Uk+ayJmh
unwrapじゃなく;がunwrapの代わりになったらよかったのに、構文解析に;なんてもう使ってないでしょうに
2022/04/04(月) 23:41:54.63ID:3iHsJPtq
>>572
なぜ?
>>552にもあるけどunwrapなんて非常に特殊な時のみ使うもの
論理的にNoneやErrではないと保証できる場合は使うべきだが頻度も限られる
残りはNoneやErrの時にpanic終了という簡易エラー処理の場合でしかunwrapは使われない
その簡易エラー処理をしたい場合でも?オペレータでエラーを最上位に集めて1カ所だけエラー表示を設けるとpanic unwrapを無くせる
2022/04/05(火) 04:14:10.02ID:opdT/MNM
>>572
文は式と区別するため必ず「;」を伴う
例えば関数やブロックの最後(=「}」の直前)に
「;」があると文となり返り値が()となる
「;」がないとその式の値が返り値となる
そしてブロックやif-elseやloopはその値の式なので文を形成する最後に登場する時は「}」の直後に「;」が来る
このように他のプログラミング言語とは異なりRustでは「;」の存在は重要である
2022/04/05(火) 07:02:36.93ID:l+kYPJyP
ブロックの最後の式がブロックの評価値になるのはRubyもそうだよ
だからと言って;にunwrap割り当てろとは思わないけど
2022/04/05(火) 11:45:54.41ID:AUzgrMft
unwrap はそれなりに目立つべきだろう。
一文字でどうにかするのはよろしくない。
2022/04/05(火) 15:21:06.80ID:owP7OoVB
unwrap連打することもあるんだからないな
他の言語みたいにunwrapを!で書けるようにするほうがマシ
2022/04/05(火) 16:32:58.11ID:bH2gxj8m
むしろunwrap_or_dieとかにして欲しいくらいだな
2022/04/05(火) 17:27:14.20ID:jhOIIm2D
使いにくく書きにくくさせることで
馬鹿に知らず識らずマナーを強いてるんだよ

だからJavaでアクセッサ書くのダルいと怒ってるのと
rustでmutってタイプするのダルいと怒ってるのと
unwrapってタイプするのダルいと怒ってるのと

言ってる人はみなおなじバカ
ちなみに馬鹿に迎合してプロパティを準備してみせたウルトラバカ言語がC#
2022/04/05(火) 17:46:43.00ID:QA37bGpe
>>578
これすき
2022/04/05(火) 18:59:43.74ID:ZwTPjiXX
だったらfnなんて短さ、どうなん?とは思うけどな。
2022/04/05(火) 19:10:52.07ID:5iTMb1Xf
予約語と比較してどうする
2022/04/05(火) 19:39:53.86ID:RVaVR3wo
unwrap()は論理的に安全に剥がせると明確になる特殊な場合のみ使うべきもの
見てすぐ明確でない時はコメントを付けること推奨
2022/04/05(火) 20:30:38.50ID:AUzgrMft
エラーメッセージ中で便宜上のライフタイム (?) として '1 というのが出てくることがあるけど、
これは一個目の引数のライフタイムという解釈でいいのかな?
2022/04/05(火) 20:31:56.58ID:iTms6SBF
unwrap()はリリースビルドでコンパイルエラーにして欲しい
Elmみたいにデバッグビルドでのみ使えるって感じで
2022/04/05(火) 20:33:43.79ID:mQ5E2nDT
unwrapでpanic起こしたら死刑
2022/04/05(火) 20:45:42.53ID:RriiMuS9
>>585
論理的に剥がして安全なことをコンパイラが追いかけてくれるならそれもありだけど
現状で全面unwrap禁止は無理
2022/04/05(火) 20:52:13.73ID:VJaRyQKx
書き捨てのコードでいちいち例外処理書かされるの面倒だからunwrapは必要
2022/04/05(火) 20:54:37.54ID:AUzgrMft
unwrap を排除したらそれぞれで unwrap みたいなものを定義して使うようになっちゃうのがオチだよ。
2022/04/05(火) 20:56:22.37ID:m6fZyHop
>>583
コメントつけるならexpectでpanic時メッセージ出した方が良いのでは
2022/04/05(火) 21:09:00.11ID:ks20fz6N
>>590
論理的に起きない場合にexpectは単なるコードの無駄
エラー発生時にパニック終了していいプログラムで補完エラーメッセージとしてexpectを使う
2022/04/05(火) 21:21:53.89ID:m6fZyHop
>>591
趣味の問題な気がするけどその理屈だと論理的に起きない場合はコメントの無駄とならない?
それともコミュニティーで広く普及してる慣例があるのかしら
2022/04/05(火) 21:39:41.29ID:u7gEIfJv
一般的に、論理的に正しいがコードを見てすぐに把握できない可能性がある場合は、コメントを付ける慣例
2022/04/05(火) 21:55:10.17ID:l+kYPJyP
>>591
コードの無駄というのは正確には何が無駄なのだろう
文字列分の領域?
2022/04/06(水) 00:04:36.01ID:L0tmrFUv
>>578
Javaっぽいですね
2022/04/06(水) 00:19:00.36ID:QeRv7PuV
>>575
Null条件演算子とか他言語には一般的になって来てるけど、ライブラリでしかないはずのOption,Resultが言語の中核みたいになってるRustが
採用するとは思えない。Option条件演算子?
2022/04/06(水) 00:29:51.46ID:NjGChFO7
他でのNull合体演算子つまりNull時にデフォルト値とする演算はRustではunwrap_or
もちろんそれら他の言語ではT型そのものにNullがありミスを防げないが
RustではT型とOption<T>型に分かれているためミスが起きない
2022/04/06(水) 03:59:22.01ID:pOKs9eQ1
いや言語的な特性のこと言ってるわけじゃねーからwいちいち知識疲労で解説しなくていいからw
2022/04/06(水) 08:23:07.29ID:V4186sOU
ルビー君と同じ病気だよね
しかも間違ってるし
2022/04/06(水) 09:21:37.82ID:X0SajXCN
>>596
rust の場合 try {} 構文が対応するものかな
try { a?.b?.c }
みたいに書ける
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));
}
2022/04/06(水) 10:33:16.53ID:Dw8vI7FQ
>>596が言ってるのはnull条件演算子
>>597が言ってるのはnull合体演算子

そりゃ話が通じるわけない
2022/04/06(水) 11:49:10.11ID:rSNzLcDe
>>597
C#とかSwiftとかKotlinとかNull safetyを備えてる言語も勉強してね
ちょっと恥ずかしいよ
2022/04/06(水) 17:06:15.48ID:SXJV6JXP
>>601
なるほど、クロージャにすれば?使えるって発想なかったわ
2022/04/06(水) 18:11:52.43ID:9SYtmHqH
なるほどじゃねーよwww
2022/04/07(木) 04:17:47.69ID:tEZE72Zs
stableでどうしてもtryっぽく書きたい場合の苦肉の策でしかないな
2022/04/07(木) 07:08:56.80ID:GJZ5/Xn8
クロージャ(ラムダ)の即時実行は他の色々な言語でも行なう頻出パターン
Rustでは他にもforやwhileから値を返したい時などにもクロージャの即時実行で行なう
608デフォルトの名無しさん
垢版 |
2022/04/07(木) 07:19:00.45ID:M1TIObhS
これって、公開するメソッドのの数だけディスパッチャメソッドが増えてく感じなの?
https://tourofrust.com/81_ja.html
結構めんどくさいような気もするんだけど・・・・こういうのってエディタの拡張とかが勝手やってくれたりとか、支援みたいなのあるの???
2022/04/07(木) 07:36:57.92ID:GySucWIC
>>608
プログラマーは全く何もしなくてよい
dyn Traitの場合はメソッド数分の関数ポインタを持つディスパッチ用テーブルが各使用型毎に自動的に生成されて実行時に自動的に適用される
impl Traitの場合は使用メソッドの関数がモノモーフィゼーションすなわち各使用型毎にコンパイル時に展開される
逆にプログラマーが自分で分岐処理する第三の方法としてenumに各使用形を収容してmatchによる分岐処理があってこの方法が有利になるケースもある
2022/04/07(木) 10:32:38.29ID:bzCO3d2+
C++ だと静的な多相はテンプレートで、動的な多相は仮想関数 (抽象クラス) でやってるわけだけど、
Rust だと dyn だけで切り替えられるってわけだな。
2022/04/07(木) 12:45:48.26ID:Qjh8kwCx
>>608
tour of rustでRustに入門するのはやめたほうがいいぞ
中身が更新されてないしGoと違ってtourから始めるのは害にしかならないから
2022/04/07(木) 13:22:38.91ID:bzCO3d2+
わかる。
Rust の型システム・所有権システムは理屈が分かってないと慣れでどうにかなるもんではない。
理解した上でなら手を動かしてみるのは悪くないと思うけど。
■ このスレッドは過去ログ倉庫に格納されています