dupchecked22222../4ta/2chb/656/96/tech164459665621737807882 Rust part14 ◎正当な理由による書き込みの削除について:      生島英之とみられる方へ:

Rust part14


動画、画像抽出 || この掲示板へ 類似スレ 掲示板一覧 人気スレ 動画人気順

このスレへの固定リンク: http://5chb.net/r/tech/1644596656/
ヒント:5chスレのurlに http://xxxx.5chb.net/xxxx のようにbを入れるだけでここでスレ保存、閲覧できます。

1デフォルトの名無しさん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
http://2chb.net/r/tech/1619219089/

※次スレは原則>>980が立てること

前スレ
Rust part13
http://2chb.net/r/tech/1636247099/

2デフォルトの名無しさん2022/02/12(土) 01:27:40.45ID:aHobc4uM
Rust The Book (日本語版)
https://doc.rust-jp.rs/book-ja/
Rust edition guide (日本語版)
https://doc.rust-jp.rs/edition-guide/
Rust by example (日本語版)
https://doc.rust-jp.rs/rust-by-example-ja/
Rust cookbook (日本語版)
https://uma0317.github.io/rust-cookbook-ja/
Rust API guideline (日本語版)
https://sinkuu.github.io/api-guidelines/
Rust nomicon book (日本語版)
https://doc.rust-jp.rs/rust-nomicon-ja/
Rust WASM book (日本語版)
https://moshg.github.io/rustwasm-book-ja/
Rust embeded book (日本語版)
https://tomoyuki-nakabayashi.github.io/book/
Rust enbeded discovery (日本語版)
https://tomoyuki-nakabayashi.github.io/discovery/

3デフォルトの名無しさん2022/02/12(土) 01:28:24.19ID:aHobc4uM
Rust CLI (Command Line Interface) apps Book
https://rust-cli.github.io/book/
Rust async-std Book
https://book.async.rs/
Rust The Unstable Book
https://doc.rust-lang.org/nightly/unstable-book/
Rust rustc Book
https://doc.rust-lang.org/rustc/
Rust Cargo Book
https://doc.rust-lang.org/cargo/
The Rust Reference
https://doc.rust-lang.org/reference/
The Rust Standard Library
https://doc.rust-lang.org/std/

4デフォルトの名無しさん2022/02/12(土) 13:48:10.54ID:kNBFVDwU
新スレ乙です

前スレ994流れてたので
(以下引用)
struct S;
impl Drop for S {
fn drop(&mut self) {
println!("drop");
}
}
fn main() {
S;
}
↑じゃあこれは何が所有権をもってて何がdropさせてんの?
インスタンス説のほうがまだシックリくる?
変数も所有権を持てるしスコープ終了で手放せる?
(以上引用)

この場合はmain内の
S;
のところに隠れた一時変数がいて
{ let _s = S; }
みたいに変換されると考えれば自然だと思う

5デフォルトの名無しさん2022/02/12(土) 13:53:07.63ID:qPU2UgbF
前スレ>>994
匿名の一時変数(temporary)が所有者になってenclosing scopeを抜ける時にdropが呼ばれる

公式の見解とは違うけど変数じゃなくスコープが所有者になるという捉え方のほうが分かりやすければ別にそれでもいいと思う
実装的にはその方が近い

6デフォルトの名無しさん2022/02/12(土) 13:54:01.32ID:qPU2UgbF
すまん、モロ被りした

7デフォルトの名無しさん2022/02/12(土) 16:30:44.26ID:v8ccrYYP
>>4 >>5
それで正解。

所有権については公式がこう↓うたってんだから、値だとかインスタンスだとかいってる奴は公式に文句言えと。

4.1. What is ownership?
http://doc.rust-lang.org/book/ch04-01-what-is-ownership.html

Ownership Rules

First, let’s take a look at the ownership rules.
Keep these rules in mind as we work through the examples that illustrate them:

* Each value in Rust has a variable that’s called its owner.
* There can only be one owner at a time.
* When the owner goes out of scope, the value will be dropped.

8デフォルトの名無しさん2022/02/12(土) 16:59:30.70ID:v8ccrYYP
非同期のデファクトライブラリはtokioかと思うがasync-std使ってる人おる?

9デフォルトの名無しさん2022/02/12(土) 17:24:19.71ID:LO6bM52V
sqlxがasync-stdのサポート切るって聞いたけどほんと?

10デフォルトの名無しさん2022/02/12(土) 23:26:08.10ID:/iL1/Dd6
>>5
同感
変数に入れないまま関数の戻り値となったり
その関数の戻り値が変数に入れないまま式の中で消費もしくは移動することが多い
そしてdropタイミングはスコープを抜ける時
だから変数よりもスコープが所有権を持っていると考えた方がより近いとの考えに同意する
ただし同じスコープ内で別変数へ移動させた場合もスコープ視点では移動なしとなる
それはdropに関して全く問題ないが変数間の移動を表現しきれていない

一方で属する変数もスコープも移動により次々と移り変わって行く
だから所有権と1対1でリンクしていて不変なものはインスタンスだというのも納得できるしそれ自体は正しく確定
ただし所有権と1対1でリンクしているインスタンス自体も移動していくからその移動を表現しきれていない

したがって
『所有権と1対1でリンクしているのは当然インスタンスとしつつも
そのインスタンスが代入や式や戻り値で使われるたびに変数もしくは見えない一時変数に必ず入っていると考え
さらにその変数が属するスコープの中にインスタンスが毎回イドウすると考え
他へ移動されぬまま属するスコープが消滅するとインスタンス及びその1対1となる所有権も消滅する』
というのが正確なところなのであろう

ただしそれでは学習するには長すぎるから大幅に端折って>>7の定義で良いと思う
そして学習した後で端折ってある部分が上述の長い説明だと後で理解できれば十分なのではないだろうか

11デフォルトの名無しさん2022/02/12(土) 23:33:37.93ID:/iL1/Dd6
>>8
使っている

>>9
その議論を少し読んでみたけど
サポート続けるべきの声もある程度あるし
何らか用途ごとにもう少し抽象化したインタフェースを確立して両立利用できるようにすべき声もあるようだ
明るい未来になるとうれしい

12デフォルトの名無しさん2022/02/13(日) 09:35:24.39ID:ykPYhkFQ
見えない一時変数とか想像しなくても
オーナー変数がある場合は
* There can only be one owner at a time.
* When the owner goes out of scope, the value will be dropped.
で、無い場合は
* When the value ほにゃららタイミング, the value will be dropped.
と公式で書いてくれてたらスッキリなのにな

13デフォルトの名無しさん2022/02/13(日) 11:34:54.98ID:NHDjNJ0w
>>12
一時変数は想像上の産物ではないよ
リファレンスに変数の一つとして定義されてるし
どういう時に一時変数が作られるのかも定義されてる
The Bookに詳しく書いてないだけ

14デフォルトの名無しさん2022/02/13(日) 11:56:22.68ID:ykPYhkFQ
>>13
勉強になりました

https://doc.rust-lang.org/reference/variables.html
> A variable is a component of a stack frame, either a named function parameter,
> an anonymous temporary, or a named local variable.

https://doc.rust-lang.org/reference/expressions.html#temporaries
> When using a value expression in most place expression contexts,
> a temporary unnamed memory location is created and initialized to that value.
> The expression evaluates to that location instead, except if promoted to a static.
> The drop scope of the temporary is usually the end of the enclosing statement.

匿名一時変数は式の終わりでdropされそうやね

15デフォルトの名無しさん2022/02/13(日) 12:07:59.97ID:ykPYhkFQ
おっと式じゃなくて文の間違い

16デフォルトの名無しさん2022/02/14(月) 21:08:19.96ID:JD6MLhyb
外部ライブラリを使わずに
コマンドライン引数の処理を昔ながらのシェルスクリプト風に処理したい場合
こんな感じでいいのでしょうか?
let mut args = std::env::args().peekable();
let cmd_name = args.next().unwrap();
let usage = || {
eprintln!("Usage: {cmd_name} [-d] [-q] [--] <target>");
std::process::exit(1);
};
let mut is_debug = false;
let mut is_quiet = false;
while let Some(b'-') = args.peek().and_then(|arg| arg.as_bytes().first()) {
let option = args.next().unwrap();
match option.as_str() {
"-d" => is_debug = true,
"-q" => is_quiet = true,
"--" => break,
_ => usage(),
}
}
if args.len() != 1 {
usage();
}
let target = args.next().unwrap();
もっと楽に記述できるよ、とか、もっと無駄を省けるよ、とか
何でもいいのでアドバイスお願いします

17デフォルトの名無しさん2022/02/15(火) 00:56:03.94ID:qT41k7yT
peekableにする意味ある?
手間かかってるだけに見えるし-o output.txtみたいなオプション引数も扱えなくならない?

18デフォルトの名無しさん2022/02/15(火) 16:20:56.03ID:yLJ5RfL8
look aheadのパターンにしたかったのかな
Peekableならnext_ifがいい感じにはまりそう

...
let mut is_debug = false;
let mut is_quiet = false;
while let Some(option) = args.next_if(|s| s.starts_with("-")) {
match option.as_str() {
"-d" => is_debug = true,
"-q" => is_quiet = true,
"--" => break,
_ => usage(),
}
}
if args.len() != 1 {
usage();
}
...

19デフォルトの名無しさん2022/02/15(火) 22:18:31.12ID:57mqcwZM
>>17
そういうのは >>16にこれ追加で行けそう
"-o" => output = args.next().or_else(|| { usage(); None }),

20デフォルトの名無しさん2022/02/15(火) 22:42:34.06ID:57mqcwZM
ところで
>>16の as_bytes().first() と
>>18の s.starts_with("-") はどっちが速いのかな?
今回は誤差として例えば数万行のテキストで#から始まるコメント行を除外したい場合
最善手は何?

21デフォルトの名無しさん2022/02/15(火) 23:44:22.03ID:je481k6i
どちらも文字列の先頭数byte参照するだけだから大差ないよ
as_* じゃなくて to_* を使うとかだと差が出るかもね

22デフォルトの名無しさん2022/02/16(水) 01:25:58.91ID:3jEsfDTa
短くてもいつもの汚コード氏だと分かるコードなのがすごい

23デフォルトの名無しさん2022/02/16(水) 18:46:05.60ID:4BNkCNLv
>>20
他にも色々方法がある
例えば落とし穴だが一番表記が短いスライス &(&s)[..1]
ただし空行をs.len()で回避した場合でも
if "#" == &(&s)[..1] { これは先頭が非ASCIIだとpanicなので注意
utf8境界を見極めて最初の1文字を取り出すには面倒で
if "#" == &(&s)[..s.char_indices().nth(1).unwrap().0] { となり本末転倒
なので最初の1文字を取り出すには普通はイテレータchars()を使って
if Some('#') == s.chars().next() { となるが
今回は正しく先頭1文字ではなく先頭1バイトを取り出せれば判断できるので
if Some(b'#') == s.bytes().next() { の方が速い
しかしイテレータを使うまでもないから
if Some(&b'#') == s.as_bytes().get(0) { と配列アクセスでも十分だろう
先頭は需要が大きいためなのか
if Some(&b'#') == s.as_bytes().first() { と専用メソッドが用意されてるようだ
ただしここでもサボって
if b'#' == s.as_bytes()[0] { とすると空行でpanicするので注意
以上ここまでは先頭取り出し系だがシンプルに
if s.starts_with("#") { が一番わかりやすい
ただしこれは実装でinline指定がないから不利で遅いかもしれない
inlineで&[u8]に読み替えるだけの as_bytes() は確実に速い
あとは get(0) と first() がどちらもinlineでコードが
前者が if self < slice.len() { unsafe { Some(&*self.get_unchecked(slice)) } } else { None }
後者が if let [first, ..] = self { Some(first) } else { None }
たぶん展開して最適化した最終コードは同じになるのではないか
そしてSomeやNoneは最適化で if Some(&b'#') == 部分と反応しておそらく消えると予想しているが
if let [b'#', ..] = s.as_bytes() { と最初からOption使わなければその点も確実という結論か
あとはみんなでツッコミしてくれ

24デフォルトの名無しさん2022/02/17(木) 10:37:24.58ID:nN2LTJ+a
premature optimizationの典型例
このレベルの最適化が本当に必要ならまずは計測しろ

25デフォルトの名無しさん2022/02/17(木) 10:41:11.69ID:J5He3Z4Q
百理ある

26デフォルトの名無しさん2022/02/17(木) 11:01:53.16ID:W9idHeI8
結論の if let [b'#', ..] = s.as_bytes() { なら可読性も落ちず意味もわかりやすいからいいんじゃね?
それを満たした上で長さが0でないことと先頭バイトの定数比較コードになると誰もが予測可能

27デフォルトの名無しさん2022/02/17(木) 11:06:38.82ID:reqFguXW
うーんRustのデフォルトがムーブになっているのはおもしろいな
かなり思い切った設計をしている

28デフォルトの名無しさん2022/02/17(木) 11:42:39.48ID:RuZDOzbq
千里ある

29デフォルトの名無しさん2022/02/17(木) 12:41:58.72ID:TvxpbZK8
>>20
リテラルなら差はないみたいね
https://godbolt.org/z/hGrPEa5rc


lud20220217174028
このスレへの固定リンク: http://5chb.net/r/tech/1644596656/
ヒント:5chスレのurlに http://xxxx.5chb.net/xxxx のようにbを入れるだけでここでスレ保存、閲覧できます。

TOPへ TOPへ  
このエントリをはてなブックマークに追加現在登録者数177 ブックマークへ



全掲示板一覧 この掲示板へ 人気スレ | Youtube 動画 >50 >100 >200 >300 >500 >1000枚 新着画像

 ↓「Rust part14 」を見た人も見ています:
citrus
Rust part8
Rust Part5
Rust part6
Rust Part7
The Struts
SUGIZO Part. 52
CRUSTスレ Part.8
AVG Anti-Virus Ver 124
iTunes Match Part4
OnePlus Part55
OnePlus Part27
Russkij Avanpost
CRUSTスレ Part.19
AVG Anti-Virus Ver 125
【PS4】The Surge
今井マサキ on chorus
Justin Bieber Vol.4
加藤純一のRUST!3
加藤純一のRUST!2
RUSH ラッシュ Sector5
citrus [無断転載禁止]©bbspink.com
加藤純一、RUST実況
CRUSTスレ Part.20
UberEats冬はどうなる?
JUDAS PRIEST vol.91
DANCERUSH STARDOM
CRUSTスレ Part.13
CRUSTスレ Part.14
AVG Anti-Virus Ver 126
AVG Anti-Virus Ver 123
DANCERUSH STARDAM Part7
citrus シトラス Part.9
【W杯総合】2018 RUSSIA
【XO】Crossout part14
citrus シトラス Part.12
DANCERUSH STARDOM Part24
Guns N' Roses Part125
ヤマダSIM plus PART2
citrus シトラス Part.2
DANCERUSH STARDAM Part9
DANCERUSH STARDOM Part7
DANCERUSH STARDAM Part6
au AQUOS R SHV39 Part9
ASUS ZenFone 5 (2018) Part26
citrus シトラス バレスレ 5
DANCERUSH STARDAM Part12
DANCERUSH STARDOM Part14
DANCERUSH STARDOM Part15
SAMSUNG Galaxy Note7 Part3
AVG Anti-Virus Ver 128
citrus シトラス Part.4
【フレッツ格安】 DIX 【CRUST】
DIANA ROSS THE SUPREMES
iPhone 8 / 8plus Part9
DANCERUSH STARDOM Part4
Huawei P9/P9Plus Part39
DANCERUSH STARDAM part3
DANCERUSH STARDAM Part5
DANCERUSH STARDOM Part4
Aqours5thLiveぶっちゃけ感想スレ
【W杯総合】2018 RUSSIA ★2
【KNIVESOUT】荒野行動 Part194
UberEatsなど福岡のデリバリー22
JustSystems ATOK総合スレ Part102
07:24:42 up 12 days, 8:28, 2 users, load average: 7.45, 8.29, 8.93

in 0.039869070053101 sec @0.039869070053101@0b7 on 012521