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/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
2021/10/10(日) 21:23:34.82ID:XwgBItsn
>>628
可変参照は関係あるのかな?
どちらもbit処理を下から順にするアルゴリズムで変わりなく
>>613はbitマスクを大きく(左シフト)していく方法
>>617はbitマスクは常に1で本体を小さく(右シフト)していく方法の違いだけだよね
だから後者の方式でもRustでコーディングできて動くよね
両者の差分
  fn calc(num: usize, pow: usize, m: usize) -> usize {
 - let mut bit: usize = 1;
 + let mut bit: usize = pow;
   let mut res: usize = 1;
   let mut tmp_pow: usize = num;
 
 - while pow >= bit {
 -  if pow & bit > 0 {
 + while bit > 0 {
 +  if bit & 1 > 0 {
     res = (res * tmp_pow) % m;
    }
 -  bit = bit << 1;
 +  bit = bit >> 1;
    tmp_pow = (tmp_pow * tmp_pow) % m;
   }
   res
  }
2021/10/11(月) 00:12:55.43ID:EeZezr6D
>>630
アルゴリズムではなくて、ポインタを渡すのか、実数値を渡すのか
そこを明確にしているRustの仕様から引数を可変参照にするのは・・という意味では

そして>>617が何を読みにくいといっているのかも、よくわからんし
632デフォルトの名無しさん
垢版 |
2021/10/11(月) 00:34:40.68ID:JbC5nNmw
>>624 >>627
がねがねその通りで、言った通りトレイトだが、「Num型があるよりももっと高度なことができる」これは弁明的。
近代的な言語はmixinもしくはアドホック多相で(高度なことが)出来る場合がほとんどであり、無いものを無いと
要求できず弁護をするのはちょっと違う。他にも角度のように、0-360まで制限したいプリミティブ型が欲しいのに
PascalのようなSubrange型も足りていない。範囲を表す表現、0..360はあるのに。些細な事だが、コンパイラを
速くする事を現在は主眼なので(仕様に矛盾が無ければ)いずれは拡張されるのかもしれないが
633デフォルトの名無しさん
垢版 |
2021/10/11(月) 06:54:36.68ID:95tWd+L1
mutをつけたベクター型について教えてください
これはまず、入っているのは参照なんですか?
また、参照が変わらない(?)のに、参照先を変更するにはmutがなぜ必要になってくるのですか?
(所有権概念のせいなのでしょうか?それともスマートポインタの仕組み上、参照するアドレスが変わるのでしょうか?)
2021/10/11(月) 08:28:39.20ID:LNZ+tGdJ
>>633
let mut x = vec![1,2,3];

xに入ってるのはVec<i32>、これはスマートポインタ(pointer, capacity, length)。
「参照」というのはRustでは&Vec<i32>のようにアンパサンドがついてる型のこと
なのでxに入ってるのは参照ではない

例えばx.push(10)するのにxがmutじゃなきゃいけないのは
直接的にはpushのシグニチャが&mut selfを要求してるからだけど
考え方としては「multiple readers or single writer」ルールをコンパイル時に強制するため

連続したバッファを確保できなければアドレスが変わる可能性も有るし
ゼロキャパシティなら具体的なアドレスを持ってない
2021/10/11(月) 13:32:30.30ID:15cV1HfU
Cortex-M対応がClangよりRustの方が進んでいて草
2021/10/11(月) 14:07:37.59ID:lgurMcJY
core::ptr::unique::Uniqueもalloc::raw_vecもただのdoc(hidden)なのに
Vecがスマートポインタってデタラメ広めてる奴らどこが出処だよ。

以下の関係で、
Vec has-a RawVec
RawVec has-a Unique

- Vecがrustの作法を強制するためのnewtypeパターン←composition
- RawVecが動的配列の低レベルapi←composition
- Uniqueがユニークポインタ←smart pointer

これだけだろ。
rustのコレクションはデータ構造上直接実装することになる型以外
Box含めて基本newtypeパターン(composition)だぞ。

>>633
GCのある言語しか触ったことない限りその発想にはならんから
まずアロケータの仕組みからやりな。
2021/10/11(月) 14:34:19.59ID:Ei1usHzb
ホラふきが あらわれた!
2021/10/11(月) 14:44:50.63ID:CP46ljNK
また他人のフリして間違いを指摘するレスが来るから乞うご期待www
2021/10/11(月) 15:28:05.06ID:YVW/m0g2
compositionだからスマートポインタでないという理屈だと Rc も Arc も非公開な内部型の composition だからスマートポインタでなくなってしまう
2021/10/11(月) 15:42:18.11ID:LNZ+tGdJ
>>636
C++のことは一旦忘れて、Rustにおけるスマートポインタの意味を学ぶことをすすめる
https://doc.rust-lang.org/book/ch15-00-smart-pointers.html
2021/10/11(月) 18:57:50.60ID:0Mn4AOx6
>>640
The concept of smart pointers isn’t unique to Rust: smart pointers originated in C++ and exist in other languages as well.
とあるけど?
2021/10/11(月) 19:29:34.65ID:YVW/m0g2
We’ve already encountered a few smart pointers in this book, such as String and Vec<T> in Chapter 8, although we didn’t call them smart pointers at the time. Both these types count as smart pointers because they own some memory and allow you to manipulate it. They also have metadata (such as their capacity) and extra capabilities or guarantees (such as with String ensuring its data will always be valid UTF-8).

というわけで Rust の定義では Vec<T> はスマートポインタ
2021/10/11(月) 20:38:32.88ID:oB6cAYFd
クイズ: この中にウソはいくつウソがある?

「またはtypescriptのtype Tree = Leaf | Nodeはサポートされません」
「rustはどちらかと言えばほとんどをトレイトで表現しますが、技術的にはこれらは、Tagged unionと呼ばれ 昔はSum typeともバリアント型とも呼ばれていました。」
「rustは可変参照を基本的に好まないスタイルだから、ああなるのは仕方ないな」
「Vecがスマートポインタってデタラメ広めてる奴らどこが出処だよ。 」
644デフォルトの名無しさん
垢版 |
2021/10/11(月) 23:52:58.48ID:FfJkoMsS
>>633
pub struct Vec<略> {
buf: RawVec<T, A>,
len: usize,
}
pub struct RawVec<略> {
ptr: Unique<T>,
cap: usize,
alloc: A,
}
pub struct Unique<T: ?Sized> {
 pointer: *const T,
 _marker: PhantomData<T>,
}
push|insertの際にlen|capとアロケート先が変化するという事、上のは難しい事をわざと言ってる
スマートポインタ議論は無視でOK。しかしPhantomDataなんて理解してる人に会ったことない
2021/10/11(月) 23:58:39.10ID:ATb6fs5R
>>631
その冪剰余関数の引数は全て数値すなわちCopy traitを持つので
関数呼び出しに参照を渡す必要はありません

また、可変参照の数値を渡す必要がある別の関数がもしあったとしても
普通に値を渡して変更値は返り値とする方がわかりやすいでしょう
2021/10/12(火) 02:02:02.32ID:yPuGDG3+
>スマートポインタ議論は無視でOK。
他人のフリして我がフリ直せww
2021/10/12(火) 02:33:26.85ID:1W2DSIiH
>>633
初級者ならばこのスレで言及されている内部実装の話は知らずとも使えるので無視してもよい
それよりもmutableとimmutableの意味となぜ区別が必要かを理解したほうがいい
あと参照の意味も理解していないようだからそこもまず基本だからおさえるべき
それら基本を理解すればVecの中身が書き換わるならばmut指定が必要とわかるはず
Rustは簡素に理解しやすく出来ているのに他言語のポインタ周辺の概念を無駄に持ち出してきて難しく考えて失敗する人たちが一部いる
2021/10/12(火) 07:19:09.45ID:SacTrMIO
これが基本を理解してないと指摘されたやつのレスw
649デフォルトの名無しさん
垢版 |
2021/10/12(火) 08:17:13.13ID:FR/wdn5M
Rusterは他人を同一人物と思い込む素性の悪い病人しか居ないな
650633
垢版 |
2021/10/12(火) 08:42:15.75ID:5WgWwJH0
初心者丸出しの質問で、なんでこうなった・・・・・
2021/10/12(火) 10:28:07.94ID:XIKPR8ou
>>647
>Rustは簡素に理解しやすく出来ているのに

それには賛同できない
2021/10/12(火) 10:28:20.90ID:h0zcLGc7
このスレにはアンチRustのC++爺さんと
間違った知識を上から目線でレスするRust初心者が各1名住み着いてるから

質問者は回答内容を自分で精査しないとダメだよ
特に後者はタチが悪いので注意して
2021/10/12(火) 10:37:06.05ID:BYAG38Ke
Rustに近々追加される機能で熱いものなにかありますか?
2021/10/12(火) 10:43:27.65ID:Br1er+Qs
Rustに関する質問はteratailで
2021/10/12(火) 10:55:07.59ID:aJ9lzwpY
現時点でRustなんかどうでもいい
10年後に普及してたら一般プログラマーも使う程度
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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