Rust part9

■ このスレッドは過去ログ倉庫に格納されています
2020/08/23(日) 01:07:35.52ID:MgEpWwVh
Mozilla発のRust言語のスレ

公式
https://www.rust-lang.org/
https://blog.rust-lang.org/
https://github.com/rust-lang/rust

Web上の実行環境
https://play.rust-lang.org

前スレ
Rust part8
https://mevius.5ch.net/test/read.cgi/tech/1579834072/
2020/11/24(火) 01:32:20.18ID:mGIqKDo2
>>321
とりあえず最新のThe Bookを見たほうがいいんでない?
https://doc.rust-lang.org/book/ch15-05-interior-mutability.html

https://doc.rust-lang.org/edition-guide/rust-2018/ownership-and-lifetimes/inference-in-structs.html
2020/11/24(火) 14:58:09.97ID:p7TzmKlx
>>322
ズバリのページありがとうございます!
324デフォルトの名無しさん
垢版 |
2020/11/24(火) 21:59:32.67ID:wabd38wc
どういたしまして
2020/11/25(水) 14:15:02.94ID:3ZJ1Ge7R
&mut TがCopyとCloneをimplしていないのは理解しているんだけど

let a: &mut i32 = &mut 0;
let b = a;
dbg!(a);

これがaがムーブされてエラーになって

let a: &mut i32 = &mut 0;
let b: &mut i32 = a;
dbg!(a);

これがエラーにならないのはナンデ?
2020/11/25(水) 14:51:10.49ID:wYoO0jiQ
>>325
それが借用でしょ。
2020/11/25(水) 14:59:59.26ID:wYoO0jiQ
>>325
b が使われないことはわかってるので無かったことになる。
b が使われるなら借用中ということでエラーになるよ。

↓ これはエラーになる。

let a: &mut i32 = &mut 0;
let b: &mut i32 = a;
dbg!(a);
dbg!(b);
2020/11/25(水) 15:24:43.58ID:s/U6WABr
これは僕もエラーにしてほしいなあ
何か深い理由があるんだろうけど…
2020/11/25(水) 22:28:12.61ID:70iTIiqa
let a: &mut i32 = &mut 0;
let b: &mut i32 = a;
dbg!(b);
dbg!(a);

これをOKにしたいんだから3行目が無くてもOKなのは必然
2020/11/25(水) 22:32:25.21ID:g8/riQpL
エラーにしたい理由がよく分からんな。
実際bを使ってないんならエラーになる意味がないし、
typoでbを使い損ねてるならbが未使用のwarningは出るから気付けるし。
2020/11/26(木) 02:46:48.20ID:Hqg/GFYt
>>329
えっ? て思ったけど確かに通った……
どっちも同じ&mut i32に見えてライフタイムが違うのか
2020/11/26(木) 10:22:00.12ID:LVnm3iYq
fn noop<T>(t: T) -> T {
t
}

let a: &mut i32 = &mut 0;
let b = noop(a);
dbg!(b);
dbg!(a);

これはエラーになる

let a: &mut i32 = &mut 0;
let b: &mut i32 = noop(a);
dbg!(b);
dbg!(a);

エラーにならない
ナンデ?
2020/11/26(木) 14:53:19.68ID:LVnm3iYq
https://users.rust-lang.org/t/questions-about-mut-t-and-move-semantics-mut-t-is-move-only/37484/13
ナンデかわかりました
implicit reborrowというものらしいです
2020/11/26(木) 16:45:55.16ID:02Rh/1GY
俺も↓これみてやっと分かった
https://github.com/rust-lang/rust/issues/35919#issuecomment-304130115
https://stackoverflow.com/a/58587870

関数のシグニチャの場合を含めて型が明示されてれば
&mut T -> & mut Tの場合でもimplicit reborrowが発生してmoveじゃなくなる
(auto-reborrowやreborrow coercionと呼んでる人も)

今まで気にしたことなかったわ
2020/11/26(木) 17:14:06.85ID:O9/RzT4k
なんでこんなの入れたんだろう…
2020/11/26(木) 18:11:09.60ID:02Rh/1GY
Type Coercionの一貫
ここに少し理由が書いてある
https://doc.rust-lang.org/nightly/nightly-rustc/rustc_typeck/check/coercion/index.html

↓これも同じ理由でエラーにならない
let a: &mut i32 = &mut 0;
let b = a as &mut i32;
dbg!(b);
dbg!(a);
2020/11/26(木) 23:01:58.61ID:SYxS73xz
最後にアクセスしたところで借用が終了すると思えば特に違和感はない
2020/11/26(木) 23:48:56.99ID:O9/RzT4k
変数宣言時に決まらず、今後スコープが終わるまでに使われるか使われないかで変わってしまうのか
2020/12/04(金) 00:56:22.75ID:g/NRvcV0
>>334
>&mut T -> & mut Tの場合でもimplicit reborrowが発生してmoveじゃなくなる
stackoverflowの方でも説明されてるけど、&mut T -> & mut Tじゃなくて&'a mut T -> &'b mut Tだな。
2020/12/04(金) 03:01:18.62ID:2+VKdPy1
implicitにする必要あった?
便利さより明示・明確で行って欲しい
2020/12/04(金) 11:37:04.89ID:OAjYDL2x
>>334のstackoverflowのコメント見れば必要だとしか
間違えたら単にコンパイルエラーになるわけで
342デフォルトの名無しさん
垢版 |
2020/12/06(日) 23:56:40.78ID:0jqklMIU
imple Trait for Something のTraitとSomething、逆の方が良かったなぁ
トレイトはまとめてモジュールにされることあるからimportしてからstructの直下でimplするからimpl struct with traitのほうが可読性高い、git的にも綺麗な差分の表示にもなるし
これなんか明確な理由とかないのかな?
2020/12/07(月) 00:00:26.20ID:owPfoMMb
ないでしょうね
どっちにでも設計できたでしょうし
2020/12/07(月) 00:39:06.96ID:O/wMvD4W
昔は impl Struct :Trait {} だった気がする
: だとどっちがどっちかわかりにくいみたいな議論はあったような
2020/12/07(月) 00:39:59.19ID:O/wMvD4W
あと impl Struct with Trait だと Struct "を" 実装すると読めるのがイマイチな気はする
2020/12/07(月) 01:03:15.94ID:BaEMz00S
impl Struct with Traitだと複数書くと同一Structを何回もimplすることになってちょっと変かも
このあたりはネイティブだと「てにをは」がおかしい感じに見えるのかもね
2020/12/08(火) 21:05:17.59ID:4EYeOh4b
lifetime関係で文句言われまくって暗黙にした部分が多いんだろう。。そんな輩にrust使わせる必要なんてないのに。
2020/12/09(水) 00:30:14.37ID:jODQKuwy
暗黙はイヤだあぁ〜っ!!
2020/12/09(水) 10:40:53.58ID:LSaC/unp
適当なライフタイムパラメータをつけるとコンパイルできることもあると学んだ
2020/12/09(水) 13:24:40.25ID:WuZTb4kZ
qiitaに久々に良記事あったわ
2020/12/09(水) 13:27:46.69ID:jODQKuwy
>>350
ヒントくれ
2020/12/10(木) 11:18:18.25ID:U7s1vwLT
>>296
可読性と言うか記述性が悪いし、そもそも厳密な仕様が公開されていない
部分が多い。例えば後者についてはライフタイムとか。
2020/12/10(木) 11:43:02.02ID:U7s1vwLT
>>294
実際には沢山あって、例えば、makefileやUnixのシェルスクリプト、BATファイル、
Perlの関数呼び出しなんかがある。
2020/12/10(木) 11:57:47.75ID:U7s1vwLT
正規表現やLISPなんかも可読性が低い。
2020/12/10(木) 12:16:53.52ID:hyB2wVsL
LISPが可読性低いはモグリ
2020/12/10(木) 12:25:40.73ID:YXjbRyJb
クポー!
2020/12/10(木) 12:41:56.12ID:oYgS32h8
>>352
具体的な記述例上げてくれないと何の説得力も無いぞ
2020/12/10(木) 15:03:07.81ID:YBB2SlAl
いつものヤバイ人だってすぐわかるだろ
荒らしの相手をするのも荒らしだぞ
2020/12/11(金) 11:56:33.87ID:/1hdqM5e
Cを日常的に使っていた人がRustに移行しようとするとやりたいことが出来なくて
馬鹿馬鹿しくなる。
数学的には完全に安全な書き方なのにRustには怒られる。
2020/12/11(金) 12:12:02.16ID:NpU6prgS
Rust by Example によれば
drop が (自動で) 呼ばれるのは「スコープの終わり」と書いてあるけど、
それは変わってないと考えていいよね?
最終のアクセスがスコープのまんなからへんだったとしても、
drop はスコープの最後ってのは今でも保証されるんだよね?
2020/12/11(金) 12:22:51.07ID:aOnuSvpC
っぱ、D言語よ
2020/12/11(金) 12:39:48.46ID:RI9UvvOD
>>360
>>289
2020/12/11(金) 18:10:27.06ID:7ILiijQb
数学的に完全に安全であるって証明を必要十分な早さで必要十分な量のコードに対して出きる人なら
おとなしくC使ってた方が良いんじゃないですかね
2020/12/11(金) 20:55:17.88ID:FrajMXPf
>>359
自信あるならコード見せてみな?
https://play.rust-lang.org/
2020/12/12(土) 01:56:14.01ID:4q8SABHv
>>364
いやです。
2020/12/12(土) 01:56:52.38ID:4q8SABHv
>>363
少なくともRustは使いません。
2020/12/12(土) 02:31:40.86ID:ub7HMY53
>>366
さようなら
2020/12/12(土) 02:52:34.60ID:4q8SABHv
問題点を指摘されたら排除する風潮。
2020/12/12(土) 02:55:04.93ID:ub7HMY53
だってあなたがここに残っても得られる物何もないでしょ
370デフォルトの名無しさん
垢版 |
2020/12/12(土) 03:02:09.48ID:SyIWV3x/
アメリカでは人気言語なんだろ?
つまり問題なく安全に使えてるってことだよね
2020/12/12(土) 03:03:58.91ID:4q8SABHv
>>370
本当はそんなに人気無い。
372デフォルトの名無しさん
垢版 |
2020/12/12(土) 03:12:39.08ID:SyIWV3x/
全お前の中ではそうだろうね
2020/12/12(土) 03:12:53.23ID:Dxj0vT3B
>>359
なんでunsafe使わなかったの?
2020/12/12(土) 15:08:06.15ID:c8Fd2aiR
>>365
なぜ?
数学的には完全に安全なのに
375デフォルトの名無しさん
垢版 |
2020/12/12(土) 15:30:46.47ID:0QXb5/mT
数学的にもOKでも、書いてるのはコードなんだからプログラミング的にもOKじゃないといけない
っていうマジレスでいい?
言語には仕様があるわけでどの言語でもそうだろ。
そもそもプログラミングしない方がいいよ、数学でもしてりゃいいじゃん
2020/12/12(土) 16:08:31.70ID:Xc3o7Cw9
コンパイラが証明できないけど人間が証明できるときのためにunsafeがあるんだから使えばいいのに
2020/12/12(土) 16:37:40.21ID:M7Hs6d8R
数学的には完全に安全ww
こんな低脳ワード使ってるやつ相手にして君たち頭おかしいんとちゃう?
2020/12/12(土) 17:13:45.58ID:ub7HMY53
完全に安全ってフレーズだけは韻踏んでて好き
2020/12/12(土) 18:01:42.98ID:E+dxDDH/
チューリング安全
2020/12/12(土) 23:00:12.57ID:a3JdWCxW
ヨシ! 今日も一日 ご安全に
2020/12/12(土) 23:31:38.16ID:Updd5mRQ
今日は安全日なの。
2020/12/12(土) 23:32:54.53ID:obc9b6E9
まあrust使ってれば完全に安全とか言い出す馬鹿もいたしどこにでも馬鹿はおるわ。
2020/12/13(日) 02:17:41.84ID:1g8P/X2h
rustでRSSリーダー作れましゅか?
2020/12/14(月) 12:25:27.59ID:6iyAwzKw
色々調べて学んでみたが個人的にはRustは好きな言語ではないし
本の帯に書かれているようなC/C++の代替になるようなものではない。
メモリー安全なのはポインタが理解できない人向け。
Ruby/Puthon/JSのようなスクリプト言語的な使い方ならある程度できそうだが
それらより遙かに難しくなっている側面が有ることも否めない。
C/C++のように自由にデータ構造を作るには向いていない。
C#やJavaは速度は落ちるが、C/C++のコードを容易に移植できたが
Rustは出来ない。
2020/12/14(月) 12:30:01.03ID:6iyAwzKw
>>384
C#やJavaは、データ構造やアルゴリズムを自由に作りやすいC/C++の自由さを
速度やメモリー効率を落とすことで初心者やポインタが理解できない人でも
手に入れることが出来る言語であった。
RustはC/C++と比べて効率は落ちにくいが C/C++の自由さは手に入らない。
ポインタを良く理解している人であってもRustのsafeモードでは独自の
データ構造やアルゴリズムを作るのは非常に難解。
なぜならライフタイムやBox<T>などの仕様が明言されて無く不明確だから。
2020/12/14(月) 13:20:59.79ID:P41Kk9Hq
>>384 6iyAwzKw
>>385 6iyAwzKw
せっかく関心しかけたのに、自演で信頼性を損なうな
2020/12/14(月) 13:30:32.20ID:B3PAtuba
いつもの人だし関心するような内容あったか?
2020/12/14(月) 13:39:47.48ID:P41Kk9Hq
すまんな、rustスレ初めて覗いたんだ
2020/12/14(月) 14:39:07.69ID:GNvWdWeF
>>388
いや、実際に関心する内容があったんならそれはそれでいいんだが
あと別に自演失敗したとかじゃなく、Twitter的な感じでリプライで補足しただけでは
別人を装う気は微塵も感じられない
2020/12/14(月) 14:40:42.59ID:olJ8vT42
この人ほんとゴミやな
Rustは優秀な老害フィルターかもしれん
2020/12/14(月) 15:05:11.25ID:GNvWdWeF
嫌いなものを無理に使う必要ないんだが、それを何度も何度も言いに来られてもな
説明しても聞く気ないし
2020/12/14(月) 15:39:33.85ID:SRefut4W
仕様が公開されていないおじさん
2020/12/14(月) 16:56:39.26ID:XcunzViE
数学的に正しい仕様が公開されてないおじさん
2020/12/15(火) 09:41:38.47ID:uMItmhUb
老害に失礼だろ(笑)
2020/12/15(火) 09:52:45.57ID:ndUamRAR
具体的に何ができないか言ってくれないとただのお気持ち表明でしかない
2020/12/15(火) 16:41:25.69ID:DgOkpJ7c
リングバッファ実装でさえunsafe使わなきゃ無理だろ。
2020/12/15(火) 18:07:45.20ID:08XnxdOZ
リングバッファにunsafe必須とか正気か?
何も分かってないだけじゃん
2020/12/15(火) 18:38:51.06ID:cTRY0FQu
仮に unsafe 必須だとしてそれがどうだっていうんだ?
2020/12/15(火) 19:50:18.09ID:DgOkpJ7c
なるほどunsafeでもかまわんと。。まあそれでいいならそれでいいんじゃないですかね。
rustの旨味半減もいいとこだが。
https://github.com/rust-lang/rust/blob/master/library/core/src/alloc/mod.rs
2020/12/15(火) 20:31:28.92ID:ndUamRAR
Vec使ったsafeな実装もできるだろうし、
パフォーマンスを求めるなら直接allocのAPIを叩くunsafeの実装もできる

dogmaticにならず目的に応じて適切な手段を使い分けられるというRustの良いところの例だと思うが
なんでunsafe使ったら負けみたいな思考になるのかが分からない
2020/12/15(火) 20:32:49.79ID:WLyCzOT+
むしろ libc crateだけで作ればいいんじゃないか
2020/12/15(火) 21:30:40.05ID:+RD1gPFt
unsafe使ったリングバッファで数学的に完全に安全てw
自分の書いたロジックをコンパイラが検証してくれないって話だったのかよ
2020/12/15(火) 21:56:57.57ID:/27NEAtR
safeとunsafeを混ぜられるところはまさにRustの旨味そのものなんだが
2020/12/16(水) 01:59:42.07ID:yml2nxMy
そこまでしてRust使うならC++で十分。
2020/12/16(水) 07:41:21.74ID:L6k9APCP
>>404
unsafeじゃない実装もできるいうてますやん
2020/12/16(水) 11:49:20.44ID:tsGP+5/P
全部unsafeで常に安全性に気を使わなければならないC++
一部のunsafeな箇所の安全性にさえ気をつければ、大部分のsafeな箇所はコンパイラに従うだけで安全になるRust

C++の方が楽と感じるのはなぜ?使い慣れているから?コンパイラに叱られないから?
2020/12/16(水) 12:51:22.00ID:N/7dwjAk
数学的にというがそれはどうせ高校までの数学でしょ?
大学で教わった群論や離散数学を含んでるのか?
2020/12/16(水) 12:57:08.01ID:XkwPQibg
数学的に安全というのはCoq使って検証したとか
言ってもらわないとなあ
2020/12/16(水) 13:02:30.37ID:2c+prgNQ
一気に議論がチープになった
「数学的」でNG推奨
2020/12/16(水) 13:56:32.92ID:zVHRhpaQ
RustBeltやRustHornみたいな取り組みに期待したい
2020/12/16(水) 14:07:09.63ID:tsGP+5/P
miriってどうなの?
2020/12/16(水) 14:47:33.79ID:zVHRhpaQ
miriは普通に使えるんじゃない?
といっても実行パスでUB踏んでないか見るだけだから
RustBeltみたいな証明とは違うけど
2020/12/16(水) 16:16:13.30ID:qBZDuvPr
>>409
お前それ数学的に証明できんの?
2020/12/16(水) 18:05:54.84ID:QJd1nMyw
>>406
はっきりいえば、頭がいいから。
学生時代、ほとんど数学は満点だった。
2020/12/16(水) 18:20:40.19ID:YefQ566E
>>414
私は馬鹿だから、あなたがとってもうらやましいですね…
2020/12/16(水) 18:22:19.17ID:tsGP+5/P
>>414
C++の言語仕様完全に理解してそう。すごい
2020/12/17(木) 00:47:25.43ID:X4tT/GwL
>>406
普通にc++使ってれば安全性に気を使わなきゃならん部分は一部だとわかるし、
それがどういう部分かと言えばrustがunsafeで書かなきゃならん部分だからだよ。
2020/12/17(木) 15:00:55.83ID:dPcuBcMK
>>417
それでもミスるのが人間。そういった経験からシステム的にミスを無くそうと試みているのがrust。
それをわかった上で俺はミスしないって言ってるのはただの経験不足か、プログラムを全然組まないやつだな。
2020/12/17(木) 16:21:39.70ID:lSe9thVt
>>417
(とりあえず unsafe を使う必要がないようなコードで)
Rust を使って最初からエラーなしで通すことが出来るんか?
それでどこかで引っかかるようなら C++ でもたぶん出来てないぞ。
2020/12/17(木) 17:13:31.93ID:lDGBWs83
触れるなよもう……
421デフォルトの名無しさん
垢版 |
2020/12/17(木) 17:54:41.43ID:Lgh9khpQ
cd ~/.cargo/registry/index/github.com-1ecc6299db9ec823
git pull https://github.com/rust-lang/crates.io-index.git
■ このスレッドは過去ログ倉庫に格納されています