Rust part12

■ このスレッドは過去ログ倉庫に格納されています
2021/08/24(火) 22:55:27.78ID:972JwtmU
公式
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のasyncについて知りたければ「async-book」は必読
https://rust-lang.github.io/async-book/

※C++との比較は専用スレへ
C++ vs Rust
https://mevius.5ch.net/test/read.cgi/tech/1619219089/

前スレ
Rust part11
https://mevius.5ch.net/test/read.cgi/tech/1623857052/
2021/09/23(木) 17:44:30.23ID:NjDt/riq
静的チェックでその1%が埋まると思ってるのがお気楽だなと思うわ。
2021/09/23(木) 18:01:26.98ID:j+XImBaS
usize祭りコネ━━━━(゚д゚;)━━━━!!

let mut dp = vec![i32::MAX; n_list.len() + 1];
for &i in &n_list {
 for j in 0..dp.len() {
  if dp[j] > i {
   dp[j] = i;
   break;
  }
 }
}
let mut cnt = n - dp.iter().filter(|&x| x != &i32::MAX).count();
531デフォルトの名無しさん
垢版 |
2021/09/23(木) 18:27:08.03ID:3ZM+sTU9
vscodeでセーブした時に、ifに付けちゃった括弧を外して欲しいんだけど、何をどう設定すればいいの?
2021/09/23(木) 18:28:49.30ID:l8duufjf
処理系の勉強をかねてRustで
ttps://www.sigbus.info/compilerbook
これをやってみようと思う
序盤で二分木&再帰・・・うへー
2021/09/23(木) 18:32:58.93ID:HaJtCNmP
>>532
二分木はむしろ非再帰で組めといわれたら罰ゲームなんですよ‥‥
2021/09/23(木) 19:12:11.01ID:+qAUZiId
なんかこのスレ競プロの厄介な人に乗っ取られた?
クソコードを延々と貼り付けてるあたり開き直ったか
2021/09/23(木) 19:15:36.83ID:+msTnWug
競プロは別スレ建てて分離しましょう
競プロの件はいずれもRustを利用&学習する人々にとって役に立たない有害なものばかりでこのスレと別件ですから
2021/09/23(木) 19:22:24.57ID:pkzlOfob
競技プログラミング総合スレ 63
https://mevius.5ch.net/test/read.cgi/tech/1627477128/
2021/09/23(木) 19:48:26.70ID:j+XImBaS
>>535
いやRustで競プロをする人もいるじゃんね
Rustを使用している人は、仕事だけの人、競プロだけの人、仕事でも競プロで使う人、のそれぞれの合計

ということは、そこから競プロを排除するってことは、より少ない人数だけを対象にするスレを立てるってことだから、
競プロの話題を禁止したい人が、「Rust原理主義者スレ」とでもして、自分たちが別スレをたてて
原理主義者たちだけで移動するのが論理的かつ合理的ヽ(´ー`)ノ
2021/09/23(木) 20:01:59.63ID:jGNo4sQ0
とキチガイが申しております
2021/09/23(木) 20:06:06.82ID:pkzlOfob
>>537
あなたはまず何の説明も無しにコード貼り散らかして祭りだとか言うことの目的を教えなさいよ
2021/09/23(木) 20:19:26.28ID:O5HtXMYP
ブログトップにキモい自撮り写真貼ってるやつを見てから
競プロ臭のくっさいコードはスルーすることに決めてる
2021/09/23(木) 20:34:50.85ID:j+XImBaS
>>538-540
スレッドは知識の集合知である場所だと思うから、
B木を考えても、情報が細分化される場合には、
携わる人数(情報)が少ないほうを葉にするのが妥当だと思うけど

>>539
Rustにはメリットもあるし、デメリットもある
様々な側面から、こういうことがあり得るとか、こういうこともできるとか
そういう情報がプラスになるんじゃないかと思っている

仕事のみの人にとっては競プロの書き方は我流だと思うだろうし、
競プロでも書いている人は、別に仕事で競プロの書き方はしてないが
直感的にやりたいことができないこともあるという思いもある

そのあたりの折り合いを付けるのが正しいRustスレなんだと思うんだよね。個人的に。
だから競プロ以外の話をしたいなら、原理主義スレを立てればいいし、
競プロだけの話をしたいなら、競プロスレを立てればいい。

ただし、ここはRustのrootだと解釈している
2021/09/23(木) 21:50:54.44ID:9wzKaMiq
ってことで以降は競プロ禁止
やりたい人は競プロのスレで
2021/09/23(木) 22:02:49.74ID:j+XImBaS
>>542
そういう強権的なやり方は嫌われると思う
544デフォルトの名無しさん
垢版 |
2021/09/23(木) 22:22:06.57ID:WWdZV+h/
俺はお前が嫌い
2021/09/23(木) 22:56:16.76ID:pkzlOfob
>>541
要はフィードバックが欲しくてソース貼ってるのか?
ならせめて入力仕様と出力仕様くらいは書こうな
競プロなら問題へのリンクでもいい
2021/09/23(木) 23:17:56.15ID:Peq2Gbnq
codeLLDBを消去しやがるからavastアンインストールしてやったわ
2021/09/24(金) 00:59:53.09ID:HPu5FO6/
>>541 添削しました。お納めください。

1. Cをそのままコピペしただけじゃねえか
  Rustの機能を試すだぁ?enumもtraitもパターンマッチも使えないのに何が検証だ馬鹿野郎
  「Cコピペしたけどメリット無いね!」って後何回繰り返すんだ?
2. なんだこの察してちゃんなコードは。保育園にいるつもりか?
  意図の明確なコードが1行も無いんだが?
3. お前がここにゴミを貼る妥当性が一つも無い
  Rustの世界に持ってきた概念のどれも使わないで、何が検証できると思ってるんだ?
  例えるなら「ひらがなしか知らない外国人が日本語の良し悪しを検証します!」っていうもんだぞ
  誰がマトモに付き合うんだ?
2021/09/24(金) 01:50:08.20ID:Dee2NcuI
>>529
CやC++だと非安全コードはどこにでも現れる可能性があるので100%のコードを人力で確認する必要があったが
rustでは安全性に関してはunsafeな部分のみ(例えば全体の1%)を確認すれば良いという話では
静的チェックで100%なんとかしようという話はしていないと思うが
2021/09/24(金) 02:35:54.11ID:Bn8yEU3N
そうだなーと思う反面unsafeだらけのコードを目の前にしてげんなりする未来も見えるという…
2021/09/24(金) 04:43:03.82ID:ow12Eod1
ほとんどの用途でunsafeを直接使うことは無いんじゃない?
グローバル変数はOnceCellで解決してしまったし
もし生ポ操作するとしたら新たな型を作ってその中に閉じ込める
551デフォルトの名無しさん
垢版 |
2021/09/24(金) 08:02:15.31ID:ljIO2QUf
そういうコードが書ける事が問題だとあれほど批判してたのに
2021/09/24(金) 08:30:26.85ID:ow12Eod1
>>551
それは何も問題ではないよ
例えばVec型もpushやpopですら内部はunsafe利用だけど我々はそれを知らず気にせず安全に使うことができる
2021/09/24(金) 10:22:26.34ID:RvXrBe+X
>>551
どのレスに対するコメント?
2021/09/24(金) 13:18:46.57ID:/gk8ByXn
そもそも競プロにメモリ安全性とかいらないしC++で書いといてくださいよ
2021/09/24(金) 14:03:53.31ID:6DqL6o69
Rustの良いところはメモリ安全だけではなかろう?
2021/09/24(金) 19:03:51.27ID:clPGC+m8
機能性で言えば競プロに必要なものは大抵の言語が備えてるだろうし
使いやすさで言えばRustはきっちり書くことを求められてるから素早く書くのには向いてないし
それでも敢えてRustを選ぶ理由は趣味や慣れくらいなのでは
2021/09/24(金) 21:51:28.01ID:73j3AhJA
releaseビルドするとTrojan:Script/Wacatac.B!mlを検出して
Windows Defenderに怒られる
--release付けないと大丈夫
誤検知かな?
2021/09/24(金) 22:12:48.28ID:ow12Eod1
>>553
ごめん
例えばUnsafeCellの存在はRustの借用ルールに制約されることなく自由に新たな型を設計して作る道を開いているけど
あくまでも安全な型を作るための素材であって具体的にはRefCellやOnceCellなどの様々な安全な型を提供する素材となっているように
unsafeの存在も上位レベルで安全な関数やモジュールを提供するための素材としてのみ用いるべきではないか
ということを伝えたかったのです
559デフォルトの名無しさん
垢版 |
2021/09/24(金) 23:54:29.51ID:561kcuCK
つまり競プロ君のunsafeの使い方はただ危ない逸脱のみであり、
安全かつ便利な何かを提供する目的のための使い方ではなく、
Rustの精神に反している、と。
したがって競プロの話は、
このRust本スレでやるべきことではなく、
ここでは禁じて別スレでやるべき、と。
2021/09/25(土) 00:09:12.18ID:bZXyxueH
>>559
競プロくんを競プロの代表扱いするのはさすがに競プロの人に失礼では
2021/09/25(土) 01:22:46.71ID:HzR9ZlyY
Rustの精神とかそんな大層な話でもないでしょ
建設的に話せない奴に付き合う必要はないというだけ
562デフォルトの名無しさん
垢版 |
2021/09/25(土) 03:09:21.77ID:r08K7R9X
>>558
違う人が書いた事を、さも自分が書いたように返答するのはどうかと思う
2021/09/25(土) 08:30:11.81ID:0L4s8Q79
>>562
え??
>>558は自分の意見を書いただけでこのスレにしか書いていないし参考にしたサイトや書き込みもないよ
もし偶然にそっくりな内容なものがどこか他にあるなら見てみたいので教えて
2021/09/25(土) 22:50:40.30ID:jDRrdRW5
>>559
こういう自分の意見にあわないと何でも排除したいヤツはどこにでもいるんだよなあ
2021/09/26(日) 00:09:45.69ID:EgHC/Y9j
Range関連での質問です

(Included(&x), Included(&y)) はx..=yと書けますが、
(Excluded(&x), Included(&y)) を似たように書く方法ってありますか?
2021/09/26(日) 01:40:54.44ID:v4wa9AaY
>>565
ないんじゃない?

(3..=5).skip(1)で、妥協するかなぁ
2021/09/26(日) 01:56:26.69ID:wsLZ/M6d
Range はよく使うから構文糖を入れてちょっと簡単にするという判断がうまれたんだと思うんで、
それほど頻出しないパターンは明示的に書くしかしょうがないと思う。
自分のプログラムでよく使うのであればそういう関数を用意しておけというくらいの妥協になる。
2021/09/26(日) 03:07:15.60ID:RXeC0HEE
>>565
range式も魔法があるわけではなく
それぞれ対応する構造体があって各traitなどを実装してるだけなのですが
stdにあるのは以下の6種類のみですね
assert_eq!(.., std::ops::RangeFull);
assert_eq!(3.., std::ops::RangeFrom { start: 3 });
assert_eq!(..7, std::ops::RangeTo { end: 7 });
assert_eq!(..=7, std::ops::RangeToInclusive { end: 7 });
assert_eq!(3..7, std::ops::Range { start: 3, end: 7 });
assert_eq!(3..=7, std::ops::RangeInclusive::new(3, 7));
例えば開始点のあるRangeFrom・Range・RangeInclusiveはIteratorも実装

一方でその(Excluded(&x), Included(&y))形式すなわち
(Bound<T>, Bound<T>)および(Bound<&'a T>, Bound<&'a T>)型だと
実装されているのはRangeBoundsトレイトのみでIteratorトレイトなどは無いという違いがあるようです
開始がUnboundedだと意味がないからでしょう
つまりイテレータで回したい時にはこの形式では使えないので
(Excluded(x), Included(y)) は (x+1)..=y と書くしかないと思います
もちろんSkip構造体のコストを払って(x..=y).skip(1)もアリです
2021/09/26(日) 03:55:02.75ID:EgHC/Y9j
>>566 >>568
すみません、言葉足らずでした
BTreeMap/Setのrangeメソッドに渡す引数を意図していました
こちらに渡すのはイテレータではないのでskip(1)はできないようです

>>567 >>568
あまり頻出ではないですし仕方ないですかね
実際困るわけではないのですが、
アンバランスなので気になってしまいました
570デフォルトの名無しさん
垢版 |
2021/09/29(水) 09:06:12.26ID:W9rNFdvq
無職の人工衛星おじさん来て
2021/09/30(木) 11:51:35.89ID:8/yMCOJS
ttps://lkml.org/lkml/2021/7/7/349
完全にストップしたな。最低だよ。
2021/09/30(木) 12:33:08.03ID:Ti8kA/OA
>>571
どういう意味や?
2021/10/01(金) 12:54:11.60ID:xF/FYN4O
>>573
どういう意味や?
2021/10/01(金) 13:00:05.87ID:EZf94GZ+
自問自答かいな
2021/10/01(金) 14:16:55.18ID:5hzjqknK
Rust for Linuxに関しては結局それ以降進展無しということ?
2021/10/01(金) 14:33:36.85ID:2Q9z0ScR
そりゃ普段の作業はGitHub上でやって、まとまったところでパッチ投げるんだから
LKMLで日々の進捗報告なんかしたら迷惑でしかない
2021/10/01(金) 14:40:28.89ID:5hzjqknK
https://github.com/Rust-for-Linux/linux
ここかな? 全然活発だったわ
2021/10/01(金) 15:23:00.24ID:25/eRB6c
いや実際のドライバーが動かないのにごねてるだけやん。。話になってないんだが。
2021/10/01(金) 23:00:07.65ID:CSO4Qyhi
as usize祭りの回避ができてきてる━━━━(゚∀゚)━━━━!!

let mut heap: BinaryHeap<Reverse<(usize, usize)>> = BinaryHeap::new();
heap.push(Reverse((0, 0)));

while let Some(Reverse((_, now))) = heap.pop() {
 let mut que: VecDeque<(usize, usize)> = VecDeque::new();
 que.push_back((now, 0));
 while let Some((next, cnt)) = que.pop_front() {
  if cnt == price[now].1 { break; };
  for &i in &list[next] {
   if total[i] > total[now] + price[now].0 {
    total[i] = total[now] + price[now].0;
    heap.push(Reverse((total[i], i)));
   }
   que.push_back((i, cnt + 1));
  }
 }
}
2021/10/02(土) 02:05:08.49ID:JhHEfT92
>>578
そうなんだ。誰がどこでごねてるの?
581デフォルトの名無しさん
垢版 |
2021/10/02(土) 07:25:57.30ID:VZaTbxB/
VSCodeか何かで、編集中のファイルを(保存する度ではなく)リアルタイムで構文チェックしてもらうことってできないの?
目が悪いもので、C#みたいに間違えたら即指摘みたいなのがすごく助かるんだけど・・・・
2021/10/02(土) 08:17:40.16ID:KFBxuoB8
rust-analyzer入れれば若干のラグはあるけどそんな感じでやってくれると思うが
2021/10/02(土) 08:21:40.61ID:KFBxuoB8
すまんオートセーブもつこうてたわw
2021/10/02(土) 09:01:16.43ID:hpIN2xHl
>>581
IntelliJRustにon the fly analysisあるぞ
2021/10/02(土) 15:27:53.04ID:4qLxMBdK
普通にVscodeでRustの拡張入れたらやってくれん?
俺が思てる構文チェックとかの支援とは違うんかな
2021/10/02(土) 15:48:21.44ID:BIOPTGX0
vscode+rust-analyzerでオートセーブ無効でもリアルタイム構文チェックしてくれるよ
2021/10/02(土) 17:14:40.18ID:0lneUYYy
いつrust-analyzerに移行するか悩み中。
2021/10/02(土) 17:43:54.53ID:KFBxuoB8
>>586
Auto Saveオフだと、指摘してくれないやつ結構ない?
セーブして初めて指摘されるやつが結構あるような
2021/10/02(土) 17:45:45.06ID:cWlg4bES
rust-analyzerってvimでも使える?
流石にvim捨てるべきかなあ
2021/10/02(土) 18:12:12.35ID:kCAgHltC
vimでもneovimでも使えるよ
2021/10/02(土) 21:14:54.36ID:Yx61ypoH
rls から rust-analyzer の移行なんて躊躇するもんじゃないぞ。
試して合わなければすぐに戻せばいいだけだし、戻りたいと思う可能性は俺はゼロだと思う。
2021/10/02(土) 21:57:31.81ID:BIOPTGX0
>>588
構文チェックとrust-analyzerの検知できる型エラーは保存しなくても指摘されるはず(前者は即時、後者は少しラグがある)
rustcじゃないと検出できないものは確かに保存時しか出ないかもね
特に害あるものじゃないしauto save有効にしても良いのでは?
2021/10/02(土) 23:35:42.15ID:qO3WxvTl
>>589
実際にビルドしてみてそのエラーメッセージをエディタに反映するという仕組み (いわゆる flycheck) は昔からあったんだが、
頻繁に実際にビルドするんじゃなくて処理系の構文解析プロセスとエディタを連携させればもっと効率的なんと違うか?という
のがマイクロソフトによって LSP (Language Server Protocol) として標準化されたという経緯がある。

エディタにとっては場当たり的なエラーメッセージの解析をせずによくなったので昔より楽になってるんだよ。
昔から flycheck をやってるようなエディタはだいたい LSP にも対応してる。
2021/10/04(月) 23:18:59.60ID:AvMOOeeY
https://thenewstack.io/linus-torvalds-on-community-rust-and-linuxs-longevity/
> “Probably next year, we’ll start seeing some first intrepid modules being written in Rust, and maybe being integrated in the mainline kernel.”
2021/10/05(火) 01:50:58.24ID:lj8Vtprb
統合早いな。多言語プロジェクトでcargo面倒くさい問題はなんかやってんだろうか?
統合されたらソース読んでみよ。
2021/10/05(火) 03:19:27.62ID:jICKdFeA
言語を組み合わせる場合を含めてビルドプロセスの記述はなんだかんだで make が万能なんだよな。
クソみたいに場当たり的だけど必要だから機能を追加してきたという現実の前には
どんな美しいパラダイムも砂上の楼閣という印象だわ。
2021/10/05(火) 11:23:44.05ID:+tJei17t
cargoが勝手にクレートダウンロードしてくれるのは便利だけどね
セキュリティ的には……どうなんかなー
2021/10/05(火) 11:55:21.23ID:ds6mcw9v
ビルドはmakeからrustc呼ぶ形になってたはず
カーネルに関してはクレートのダウンロードなんかもしないならそれで問題ない
2021/10/05(火) 12:47:41.98ID:ZN1Pvbj4
余計なことするツールに限ってモジュラリティ低い
2021/10/05(火) 12:55:43.82ID:I8WE2KTE
>>596
既存のものがクソだから俺が全く新しいクールな奴を作ってやるぜ!っていって新しいクソが1つ増えるのはもはや伝統芸やね
2021/10/05(火) 15:46:57.33ID:q+7ifQX8
>>597
そのための --offline オプション
2021/10/05(火) 18:59:42.65ID:EBA9Mr3p
>>600
makeの機能を持つprologは欲しいなぁ。

論理プログラミング言語を拡張したmakeとか堅牢そうな気がするけど、誰もやらないのかしらん。
603デフォルトの名無しさん
垢版 |
2021/10/05(火) 20:24:54.05ID:aXfbUEx/
>>602
prolog難しいから流行らない
2021/10/05(火) 21:06:12.38ID:ZN1Pvbj4
宣言的なものの依存がゴタゴタしたもののデバッグのしずらさを知らんのだろう。呑気なもんだ。
605デフォルトの名無しさん
垢版 |
2021/10/06(水) 17:08:43.54ID:XAVgSOSv
rust-analyserだかに移行しようとうおもったけどemacs とは相性悪過ぎて結局rlsに戻した
analの方はcodeいれんとインストール出来んかったりとほぼvs用だなあれ(´・ω・`)
2021/10/06(水) 18:10:02.17ID:msHyc08D
>>605
lsp-modeとの組み合わせで普通に使えるが
607デフォルトの名無しさん
垢版 |
2021/10/06(水) 19:54:44.67ID:yydNkGdJ
マジかeglot使ってたからかも
何かfunction defとかの問い合わせ方法間違ってんのか知らんが常にno docみたいのがmessage表示されて使いもんにならんかった
lspってマジで全然分からんちんで小鳥の餌待ち状態で微塵も弄れないのよね俺(´・ω・`)
2021/10/06(水) 23:28:27.48ID:msHyc08D
rlsもlspだよ
rlsのlsはlanguage serverのls
2021/10/06(水) 23:40:35.33ID:ET8OV0WS
>>607
標準ライブラリのソースコードがないとか?
rustup component add rust-src
で入ると思う
610デフォルトの名無しさん
垢版 |
2021/10/07(木) 00:12:56.69ID:3bOhB6en
あんま多くは試しでないがrust-analyzerインストールする時に入れさせられたvscodeではanal pluginで動いてたしanal自体はインストール出来てると思うんだがな

>>608
そのfuckin msの策定したlspを部分的にとか言語ごとに異なるoverrideてかimplで構成するプロジェクト群がrust-analyzerとかclangdだかとかgoplzとか
ただこれらだけじゃ意味不明のjson object返したり読み込んだりするだけのdaemonで役に立たないから
仲介者としてのeglotとかlsp-modeが必要になる
ここらまでも簡単に弄れるというか(弄れる必要があると言うのか...)がemacsの良いところ(´・ω・`)
2021/10/07(木) 06:40:58.97ID:F5HUOmxy
anal plug?
2021/10/07(木) 11:35:48.71ID:DOEkOZlT
インストールもなにも実行ファイルのパス通すだけだからね
~/.vscode/ 配下にあるはずだからそれを使うか GitHub からダウンロードしてくれば良い
2021/10/08(金) 22:14:06.47ID:XK73QT2t
べき剰余をオーバーフローさせずに作る関数を作ったヽ(´ー`)ノ

fn calc(num: usize, pow: usize, m: usize) -> usize {
 let mut bit: usize = 1;
 let mut res: usize = 1;
 let mut tmp_pow: usize = num;

 while pow >= bit {
  if pow & bit > 0 {
   res = (res * tmp_pow) % m;
  }
  bit = bit << 1;
  tmp_pow = (tmp_pow * tmp_pow) % m;
 }
 res
}
2021/10/09(土) 10:18:30.30ID:0okuLqNl
>>613
普通にオーバーフローするが
calc(usize::MAX, usize::MAX, usize::MAX-1);
2021/10/09(土) 11:49:04.73ID:zLg6zd/V
多分競プロのやつだから各数値は32bitなんだろう
そらオーバーフローしねえよって話
2021/10/10(日) 09:49:29.12ID:bzbLkL2i
都合のいい仮定置いてそうなのがらしい感じだわな
2021/10/10(日) 11:17:36.59ID:2mgB061S
↓これと同じアルゴリズムなのに>>613のは読みにくいね
https://ja.wikipedia.org/wiki/冪剰余#途中で剰余をとる

u64で受け取って内部ではu128で計算して
u64で返すようにしとけばオーバーフローしない
2021/10/10(日) 11:36:29.13ID:2mgB061S
u16ならu32、u32ならu64、u64ならu128みたいな関係をジェネリクスで表現できたりする?
2021/10/10(日) 11:52:04.33ID:a5kt/zmp
trait作ってassociated typeで表現するのはできるかな
620デフォルトの名無しさん
垢版 |
2021/10/10(日) 12:00:59.32ID:ZuTCKPOD
関連型使えよ
2021/10/10(日) 12:15:12.30ID:2mgB061S
Traitを各データ型に対して全部実装するのが面倒だから
対応する倍のサイズの型を表現する方法はないのかなって話だったんだけど
なさそうってことだね
622デフォルトの名無しさん
垢版 |
2021/10/10(日) 16:41:29.53ID:X3SL3SyY
コンパイラを単純化(高速化)するためにプリミティブ型の型クラスはありません。例えば、Haskellに
あるような数値型全般を表す Num という型クラスは、数値型全般を表しますが実体は IntやDoubleなど。
またはtypescriptのtype Tree = Leaf | Nodeはサポートされません
623デフォルトの名無しさん
垢版 |
2021/10/10(日) 17:11:17.77ID:X3SL3SyY
rustはどちらかと言えばほとんどをトレイトで表現しますが、技術的にはこれらは、Tagged unionと呼ばれ
昔はSum typeともバリアント型とも呼ばれていました。プリミティブ型ではありませんが、似た機能を実現
する技術はenum variantsでも表現できます。C20にあるstd:variantもTagged unionです
もちろんassociatedでも似たことは出来るでしょう
https://en.wikipedia.org/wiki/Tagged_union
2021/10/10(日) 17:13:00.50ID:2mgB061S
>>622
num-traitsとenum
2021/10/10(日) 19:43:56.21ID:a5kt/zmp
>>621
マクロの使いどころ
2021/10/10(日) 19:46:17.72ID:a5kt/zmp
>>622-623 の言ってることが何一つわからんのだが
2021/10/10(日) 19:56:58.54ID:XwgBItsn
>>622
おっしゃる通りですがRustでは別の解決方法を取っていますね

まず前者の全般的なNum型がない件ですが
Rustでは単純な例だと以下のように1を足す関数add1ををジェネリックに書こうとすると
(注釈: 足し算の「+」はstd::ops::Add traitを満たせば使えて任意の型でオーバーロード可)
fn add1<T: std::ops::Add<Output=T>>(n: T) -> T {
 n + 1
}
これはコンパイラが通らなくて「1」を型Iにする必要があり「1::<T>」等とでも書ければいいのですが無理です
そこでnum craitのOne traitを使って以下のように書きます
fn add1<T: std::ops::Add<Output=T> + num::One>(n: T) -> T {
 n + num::one::<T>()
}
これで以下のようにジェネリックに1を足すことができました
assert_eq!(add1(36), 37);
assert_eq!(add1(5.0), 6.0);
assert_eq!(add1(1000i128), 1001i128);
さらにこの方式ならば自分で定義する構造体など任意の型もAddとOneのtraitを満たせばadd1()を使える利点があります
つまり最初の話に戻ると全般的なNum型があるよりももっと高度なことができるわけです

後者の件は一般的に代数データ型の直和をどう扱うかという話になりますが
Rustではenumがタグ付き共用体でもあるのでenumでサポートできますね
2021/10/10(日) 19:58:36.14ID:S81FmWQC
>>617
rustは可変参照を基本的に好まないスタイルだから、ああなるのは仕方ないな
2021/10/10(日) 21:20:06.28ID:Dxd5NlvW
他人のフリして自分のレスに返信してるやつなんなのwww
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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