Rust part19

■ このスレッドは過去ログ倉庫に格納されています
2023/01/17(火) 12:41:32.25ID:nikBFIMQ
公式
https://www.rust-lang.org/
https://blog.rust-lang.org/
https://github.com/rust-lang/rust

公式ドキュメント
https://www.rust-lang.org/learn

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

※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/

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

前スレ
Rust part18
https://mevius.5ch.net/test/read.cgi/tech/1670663822/
2023/02/20(月) 00:29:43.00ID:Ro8B3+Pr
>>727
if letとlet elseは対であり対称な存在だから
「Errにアクセスできたら」なんて意味不明なことを言い出してる時点でif letも理解できていない
まずはif letが適していることとできないことを勉強し直しなさい
2023/02/20(月) 00:33:09.85ID:b1oIUOh6
じゃあ任意のUnionは?
2023/02/20(月) 00:39:36.85ID:x+cCcZkv
>>729
それはものすごく一面的な見方
内部実装だけみてユースケースを見てない
2023/02/20(月) 00:47:31.51ID:Ro8B3+Pr
>>728
中身を取り出す方法を具体的に尋ねられているのに「抽象化すれば」では答えになっていない
2023/02/20(月) 01:16:24.28ID:Ro8B3+Pr
>>731
既存コードをlet elseへと適しているのを置き換えたから把握している

Err(e)値も処理したいときに
if let Ok(v) = ...と書かないのと同様に
let Ok(v) = ... elseも同じく使わないのは当たり前
それはどちらもmatchやResultメソッドを使うべきケース

もしf()がResult<enum, Error>を返す場合ならば
if let Xxx(v) = f()? ...とErrだけ逃がすことができるし
let Xxx(v) = f()? ... elseとErrだけ逃がすことができる点も同じ
2023/02/20(月) 02:35:55.57ID:8Q/b2TJq
>>731
糖衣構文の実装ありきでユースケースベースの検討を疎かにしたRFCと同じだねぇ
2023/02/20(月) 08:12:59.13ID:+rcREq9r
RFCの段階での議論に敗北して採用されちゃったからって5chでギャオってるの見苦しすぎるだろ
2023/02/20(月) 08:32:05.17ID:odEeQ6ui
機能追加は自分の思いつくことを解決する、または大幅な改善をする
銀の弾丸でなければならないって思ってそうだ
2023/02/20(月) 10:59:06.46ID:Dw9X3Ven
条件つき確率を信じない人のような印象
条件が成立しなければ普通の弾丸だから
2023/02/20(月) 11:30:01.73ID:4JKIimXg
(ФωФ)
2023/02/20(月) 13:36:11.72ID:LGz5jnMj
「と言い出しそうだな」「って思ってそうだ」「な印象」

関心事がけっきょくは発言者の人格なんでつねえw
2023/02/20(月) 17:13:31.56ID:dVqCef0V
5chの隅っこでとにかくマウント取りたいだけの人だから
2023/02/20(月) 18:04:32.79ID:Ro8B3+Pr
ただ文句をつけたいだけなのか
とにかく嫌いなだけなのか
ブロックラベル指定breakについてもlet elseについても反対してる人から一貫性や理性を感じられない面はある

例えばlet elseについて不要との主張の理由がこれまで3つ挙げられているが
「自分は使わないから不要」は論外として
「他の書き方ができるから不要」も特定の例にしか適用できない代替策だったり当然if letとlet elseはmatchに代替できる原点の視点を欠いている
「Err(e)値を扱えないから不便で不要」も同様でif letとlet elseはそれを扱わない構文だと理解できていない
もしif letも不要だと開き直るならばそれはそれで主張が一貫しているのであろうが
742デフォルトの名無しさん
垢版 |
2023/02/20(月) 18:35:32.36ID:ONCzk40Q
ぱっと見の印象ほど便利でもないな
と言われてるだけのような気がするが
2023/02/20(月) 18:38:50.78ID:1jTwQy64
理性と一貫性が一番欠落してるオジが何か言ってるぞwww
2023/02/20(月) 18:59:27.30ID:epDqj6rM
冷静な技術的議論にならない原因が誰にあるかは一目瞭然なんだから相手にしないこと

分かりやすい煽りよりも技術的議論に見せかけたマウンティング行為にこそ高いスルー力が求められる
2023/02/20(月) 19:34:52.06ID:z/noiTmG
煽りこそ要らない
技術的な議論なら歓迎
マウンティングとか興味ないためそんな発想も感覚も出て来ないので感じている人はたぶんそれ鏡の自分自身
2023/02/20(月) 19:56:45.86ID:KVc2H5on
技術的論議とか不要やん
売れるシステム作ったもんの勝ちや

でもって世の中で売れてるシステムって意外とクソ技術
2023/02/20(月) 20:36:10.20ID:LGz5jnMj
>>746はきっとこの業界長いなw
昼間書き込んでる学生や無職どもとは面構えが違う
2023/02/20(月) 20:50:17.61ID:z/noiTmG
>>746
ここはプログラミング言語Rustのスレ
興味がないならば別スレへどうぞ

>>747
昼間に書き込んでるIDを見たらあんたやでw
2023/02/20(月) 20:55:08.90ID:KVc2H5on
>>748
勘違いしちゃいけない
言語には興味があるが今行われてる議論には興味も無いし意味もない
2023/02/20(月) 21:14:07.07ID:3GUDPmP7
何年も前からRFC出てて昨年stabled入りした機能に要るも要らねえもねえからな
2023/02/20(月) 21:18:07.99ID:z/noiTmG
stableになった11月に不要だと暴れるならともかく
今になって不要だと暴れてるのも不思議だよな
2023/02/20(月) 21:21:42.34ID:Dr+y9QH4
🦀

みんながインターネットで争ってばかりいるので、Ferrisくんは踊るのをやめてしまいました
お前のせいです
あ~あ
2023/02/20(月) 21:31:44.32ID:Gnfu+Wjk
RFCに特攻しないだけマシなのでは
いや公式に真正面からお伺いたてたほうがマシなのか
2023/02/20(月) 21:53:45.15ID:LGz5jnMj
暴れてる、ってのが被害妄想的表現やわ
俺には誰一人暴れてるようには見えない
このスレで暴れてたのは所有権の複製のあの人だけ
2023/02/20(月) 22:53:31.02ID:5X4Ju8b5
繰り返し同じ主張をしても誰も同意してくれないから
自分の意見に同意してくれないやつらは全員暴れてるということにして無意識に自我を守ろうとしてるんだよ

自己愛的防衛とか躁的防衛というやつ
2023/02/20(月) 23:30:32.01ID:5j6SE1ew
>>754
所有権の複製ってもう5年くらい前だろ
そんな昔のことをいまだに引きずってるとは病んでね?
何の記事に書いてあった話かも忘れた
2023/02/21(火) 00:09:04.47ID:HKXWQrsi
自演オジ
2023/02/21(火) 01:55:16.33ID:Z2SDCDpJ
頭が良くなれば解決することを、性格や健康の問題だと思わないほうがいい気がする
頭が良くなりたいのは色々解決するからだ
マウントしたいからではない
2023/02/21(火) 02:05:43.32ID:KRj8g2tD
俺たちが興味あるのは技術の話題であって他人じゃねーもんな
誰がどうしたとか妄想に取り憑かれているとしか思えん
ところで標準ライブラリがflumeではなくcrossbeamを取り込んだのはなんでだ?
2023/02/21(火) 10:55:47.93ID:F7r6AOZC
https://github.com/rust-lang/rust/pull/93563
> crossbeam-channel has become the most popular alternative on crates.io

これ以上の深い理由はなさそう
2023/02/21(火) 13:28:03.06ID:o6H+BcIs
cargo check --doc-tests
        欲しい!
2023/02/21(火) 21:08:16.69ID:QxhrM2ln
std::sync::mpscの実装が5年くらい放置されてた
その間に効率的な実装のcrossbeamが広まり更に効率の良いflumeも登場して性能と人気を競っている
放置されてた標準ライブラリを今回は実績のあるcrossbeam実装ベースへ変更したが状況は変わらないだろう
Rustは最小限の標準ライブラリに様々なクレートが競い合ってより良いものを生み出していく文化であるからだ
2023/02/21(火) 21:14:33.40ID:+7EF9kV0
ひとりごとおじさん
2023/02/21(火) 22:02:42.80ID:MpX1NcOI
自分の発言が炎上するかしないかを自分で判定できそう
失言おじさんにはそれができない
2023/02/21(火) 22:06:41.15ID:8LM8nvGY
ずっとおじさんおじさん言ってる「おじさん」おじさんの方が正直こわい
2023/02/21(火) 22:08:33.85ID:IR6nE0nQ
分かってんなら触れんなっての
2023/02/21(火) 22:20:06.54ID:WDpT+Fl1
オジおじ言ってる人は相手にしちゃいけないアンタッチャブル
2023/02/21(火) 22:28:06.23ID:y29mFsWC
「所有権の複製」とかいうアホな用語を使って
ここのみんなにバカにされて涙目で敗走していったおじさんがおるんよ
その可愛そうな子が複オジ
2023/02/21(火) 22:48:33.95ID:MpX1NcOI
主語が小さいのは良い
長期戦すぎるのが悪い
2023/02/21(火) 23:07:04.37ID:3NMnjtHz
>>768
誰かが「所有権の複製」と言い出したのではなくITメディアサイトのRust入門記事に書かれていた話だな
その表現を許容できる範囲か違和感あるかで色んな意見があったのは覚えている
2023/02/21(火) 23:18:12.91ID:ptIHWapX
複オジ必死の自演2
2023/02/21(火) 23:29:58.13ID:01DiY+Ot
Copy実装型は値が複製されて新たな所有権が生じるが正確
それをその入門記事は所有権の複製と表現してたやつだろ
許容でも不許容でもどうでもええわ
2023/02/21(火) 23:35:03.71ID:y29mFsWC
よっぽど悔しかったんやなw
2023/02/21(火) 23:35:15.52ID:MG8QCGMu
ところでいったいどうやってメモリ安全なの?
2023/02/21(火) 23:39:30.48ID:agyNMu4f
緑の文字でMって書いとけばOK
2023/02/21(火) 23:44:02.70ID:Z6LMQwiQ
次のかたどうぞ
2023/02/21(火) 23:44:49.64ID:4zIxg9qg
そんな昔の話をいまだに引っ張ってオジオジ言ってたのかよ
精神病んでるな
2023/02/21(火) 23:54:33.49ID:MG8QCGMu
C言語は知ってる。アセンブラも知ってる。どうやってメモリ安全なのか
サクッと説明できないの?
2023/02/21(火) 23:57:49.69ID:+CfSou71
文句あるならRFCとか記事サイトとかに直接言うしかないな
ここでこれ以上の議論を続けてもしょうがない
2023/02/21(火) 23:59:31.91ID:Z6LMQwiQ
>>778
>>1
2023/02/22(水) 00:14:21.77ID:Y34Ut0PO
複製の方はググってみたらitmediaのRust入門記事だね
型に依って移動と複製の2種類あるのを教えるところだから、入門者向けの解像度として大雑把にしといて後で詳細を学べばいいでしょ

メモリ安全の方は解説記事が山ほどあるから、まずは読んで分からないところだけを質問したら?
2023/02/22(水) 00:45:10.48ID:kRg6p3dR
参照されている間はmove禁止にする
それができたらその意味で安全
どうやってそれができるのか実装依存かな
2023/02/22(水) 00:59:45.76ID:Y34Ut0PO
稀に誤解する人がいるけど、moveはメモリ上の移動ではなく所有権の話だから注意ね
メモリ上の移動の禁止を保証するのはstd::pin::Pinだけど、初心者は知らなくても大丈夫
2023/02/22(水) 01:45:26.03ID:7qIc4ux9
moveを所有権の移動だと捉えてるから
copyも所有権の複製だと勘違いする
これが世に言う複製おじさん
2023/02/22(水) 07:55:16.15ID:nAgCXC1p
稀に誤解するオジ
2023/02/22(水) 11:19:00.04ID:QrBlGoqy
>>783
一応ちゃんとCopyのdocで「It’s important to note that in these two examples, the only difference is whether you are allowed to access x after the assignment. Under the hood, both a copy and a move can result in bits being copied in memory, although this is sometimes optimized away.」って説明されてんだよな
2023/02/22(水) 12:20:22.57ID:IphXoUwR
所有権が移動するからその後はアクセスできなくなるんだよな
2023/02/22(水) 12:56:45.35ID:BSuKB2Vo
>>784
Copy非実装型は所有権が移動するで合ってるぞ
それをmoveと呼ぶ
2023/02/22(水) 16:14:06.54ID:TLbBZAeA
メモリ安全に関しては実行時の、
すなわち実装上の工夫があるわけでは一切なく、
単にメモリの使途をコンパイラが把握できるようにして
コンパイラが厳しいチェックを入れるってだけのことなのかな
極めて有用だと思うけどつまんないね
2023/02/22(水) 16:29:14.84ID:5E1hhDZe
安全性の証明をこの前目標にしてなかったっけ?
791デフォルトの名無しさん
垢版 |
2023/02/22(水) 16:30:09.13ID:rz+Hc8C4
>>789
実装上の工夫をコンパイラが自動的に出来るように、メモリの使途をコンパイラが把握できるようにしているんじゃないの?
2023/02/22(水) 16:59:49.22ID:TLbBZAeA
>>791
出来上がるプログラムのメモリ実装はC/C++並みに速く、
なのにそれはコンパイラの厳しいチェックをくぐってて安全
それだけのことでしょ
2023/02/22(水) 18:54:03.56ID:pxjFrvRx
他言語由来なんだろうけど、moveという命名はセンス無いわな。
transferあたりならまだマシな気がする。
2023/02/22(水) 19:30:38.74ID:LddiDqOW
moveがふさわしい
ドキュメントでも至るところでmove or copyと対比され使われている
transfer or copyではおかしい
2023/02/22(水) 22:03:03.74ID:9y2tPN5s
moveやcopyの対象はvalue
ownershipはtransfer(譲渡/移転)されたりtake(取得)するもの

moveとcopyが対比されるのは同じ対象について述べているものだから当たり前
2023/02/22(水) 22:04:44.93ID:hwzB7q2o
>>795
それな
そのことをずーっと理解できないやつがおって草
2023/02/22(水) 22:32:54.84ID:ejRdyGcN
同じことを言い合っていて、間違ったことを言ってる人もいなさそうだが、何をもめているのだろう
2023/02/22(水) 22:43:58.95ID:8Lnlg+wO
>>795
それらのふるまいの違いを明確にしないとただの言葉遊びに見える
2023/02/22(水) 22:46:55.03ID:SB7jqjIk
>>793だけ理解できていない
Rustで使われているmoveという用語は所有権が移動することで値が移動する概念を指す
例えばエラーメッセージのmove occursなどのmoveはその事象を指している
だからそこはtransferではなくmoveで正しい
2023/02/22(水) 22:59:45.22ID:H3r2EuTC
RustはC++から輸入して所有権って言葉を使っているだけであって
C++で言う「所有権を失ったがオブジェクトとしては存在している」みたいな状態は少なくともsafe Rustには無いからね
だから値と所有権を切り離して考えるだけ無駄
2023/02/22(水) 23:28:17.85ID:ejRdyGcN
値と所有権を切り離して考えてもムダなのはその通りだね
値には必ず所有者(owner)すなわち変数が対応してる
そして所有者である変数がスコープを尽きて消えるときに値もdropで消える
だから切り離すことはできない

値が消えないためには所有者である変数のスコープが尽きる前に、他の変数へ代入か、関数引数渡しか、関数戻値返し、をしなければならない
その時にCopy実装型だと値が複製されて渡した先にも別の所有者が生じて各々が別の人生を辿る
!Copy実装型だと値が「概念的に」移動して渡した先に所有者が変わる
この両者の違いを端的に表した用語がcopyとmove
2023/02/22(水) 23:31:46.84ID:9y2tPN5s
所有権が「移る」という意味の英訳として「move」という単語を当てるのが間違ってるわけではないが
「所有権を複製する」といった致命的な間違いを生む原因になってるの可能なら避けた方が良い
2023/02/22(水) 23:55:25.59ID:ejRdyGcN
>>802
いや、所有権に対して直接moveと言っているわけではないんだよ
値の所有者(=変数)が変わることを、視点を変えると、旧所有者から新所有者へ値が移動している、それはさらに視点を変えると、所有権が移動していると表現してもいいわけだけど、
それら視点は様々あるけど同じことを指してRustでは『move』と呼んでいる
だから所有権(ownership)という単語に対して一般的な英語の用法として動詞にtransferやtakeを文章では使うけれど、そのこととは全く関係ない
2023/02/22(水) 23:57:57.68ID:H3r2EuTC
いや、そんな状態が無いはさすがに嘘か……
Option<T> where T: Dropのtake()は実質ムーコンみたいなことやるし

所有権=リソースの解放義務と考えればそもそも!Dropには所有権なんてものは存在しないって考え方が正しいのかねえ
2023/02/23(木) 00:13:31.19ID:C4cWdlsx
>>804
その場合も値と所有者は単体には生じてない
take()で新しい所有者に値が移動している
ただしデフォルト値のNoneにスワップされるため元の所有者も生きたままというだけ
これは一般的にはstd::mem::swap(),replace(),take()であり
互いに相手にmoveが生じただけ
2023/02/23(木) 00:58:23.78ID:a6t3KRYM
exeを実行するみたいなトートロジーは極めて有用だけどつまんないね
2023/02/23(木) 00:58:28.47ID:esRNNZX1
やっと分かったかも
コードのある時点において、仮にその時点での継続を全部消したとき、Drop::dropが自動で差し挟まれることになるブロックはその時点でそのリソースを所有している、と解釈できるわけか

というのがNLL以前の話ってやつなんだなたぶん
そうなると所有の主体はブロックじゃなくてライフタイムってことになるのかね?
2023/02/23(木) 01:29:31.74ID:rq0OeSBM
どうしてドキュメントと違う言い回しの独自解釈を捻り出そうとしてしまうのか。
2023/02/23(木) 01:50:57.31ID:Kuyiw7Zm
複オジる バレてあばれて ぼけつほる
2023/02/23(木) 02:02:47.49ID:bPCulnq5
>>807
値の所有はそれを他へ渡さない限りレキシカルにブロックスコープが尽きるまで続く
ただし参照のライフタイムについてはレキシカルなスコープではなく実際の使われ方に応じて短くなりうる
例えば非可変参照を使っていて、後から可変参照を使うことになった時は、
それらが重なってなければ非可変参照のライフタイムは終わった扱いにして、同じブロックスコープの中で新たに可変参照を借用できるのがNLL
2023/02/23(木) 02:18:44.46ID:UvuOvWmE
>>804
もちろん正しくない
2023/02/23(木) 09:29:02.67ID:BoWU7ZWJ
以前指摘されたDrop Obligationを今になって勉強して一人芝居してるw
ほんと滑稽な人やでww
2023/02/23(木) 09:41:47.82ID:nQ2ppFvg
説明をわかりやすくするために創作された抽象概念と実装が1対1で結びついてるわけないのにね
2023/02/23(木) 09:55:07.36ID:FonN/9hK
>>800
>「所有権を失ったがオブジェクトとしては存在している」
値が所有権を持ってるわけじゃないから
2023/02/23(木) 09:57:21.40ID:rJOtMcwO
C++のはmoveした後に抜け殻が残る話じゃね
2023/02/23(木) 11:25:42.30ID:pfd9YhIH
値に所有権フラグ的なものがくっついてるイメージでとらえてしまってるんでしょ
だからコピーしたら所有権も複製されるし
値と所有権を切り離して考えても無駄だと勘違いしてしまう
全部つながってる
2023/02/23(木) 11:47:29.47ID:suv8L/am
>>816
値と所有者はそれぞれ単独に存在できないので、値と所有者を切り離して考えても無駄なのはRustの基本たぞ
値は必ず所有者を持つし、所有者は必ず値を持つ
2023/02/23(木) 13:08:38.52ID:Oid02u1J
複オジの常識は
Rustの非常識
このスレでは常識
2023/02/23(木) 13:34:12.46ID:esRNNZX1
>>807
っていうかそこまで難しい話じゃなくて
move a value と transfer its ownership を同義語として、自然言語としてわかりやすいように適宜言い分けてるだけなのか?

じゃあ結局「ownershipとは〜〜」という形でのownershipの定義なんてものはRustにはない?
公式のドキュメント検索しても見つからなかったんだよね
2023/02/23(木) 13:44:46.02ID:lWMy0tB5
>>817で合ってるよ
オジ使いの人は文句をつけることが主目的なのか正しいことにも文句をつける印象
2023/02/23(木) 13:46:51.41ID:a6t3KRYM
不動産みたいな移動できないものの代わりにその所有権を移動する
メモリ上では実は複製と消去しかできないので本当は移動ができない
2023/02/23(木) 13:56:15.25ID:lWMy0tB5
>>821
そこの理解が重要だよね
あくまでもmoveは概念上のもの
だから皆が概念という単語を使っているね

>>799
> Rustで使われているmoveという用語は所有権が移動することで値が移動する概念を指す

>>801
> !Copy実装型だと値が「概念的に」移動して渡した先に所有者が変わる
> この両者の違いを端的に表した用語がcopyとmove
2023/02/23(木) 14:13:14.00ID:lWMy0tB5
そしてmoveの概念とは異なりmoveの実際の生成コードは最適化によって多種多様
基本はmove先に複製して元が無効となるけど、最適化によって複製が発生せずそのまま使ったり、
関数でサイズがある程度あるものをmoveで返す場合には、関数呼び出し元のスタック上に呼び出し先関数から直接書き込んでしまったりもする
2023/02/23(木) 14:28:29.93ID:sG3kr234
書けば書くほど的外れになっていくのが凄い
やっぱり基礎が重要なんだね
2023/02/23(木) 15:57:28.87ID:suv8L/am
言い掛かりつけるだけの人はこのスレ常駐の荒らしだから無視しとけ
2023/02/23(木) 17:27:04.57ID:knazEHUl
たまにはCloneのことも思い出してあげてください
2023/02/23(木) 18:26:04.33ID:G9ttzE8v
moveは値と所有権の移動
copyは値と所有権の複製
cloneは値と所有権の複製
borrowは値と所有権の借用
mut borrowは値と所有権の書き換え可能な借用

(๑•̀д•́๑)何ら問題ないキリッ
www
2023/02/23(木) 19:16:28.85ID:3Mx58NHj
所有権の複製って聞いておかしいと思わない子もそりゃいるよ
みんなが賢いわけじゃなくて残念ながらアホな子もそりゃいるんだよ
あんまりいじめてやるなよ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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