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/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
所有権の複製って聞いておかしいと思わない子もそりゃいるよ
みんなが賢いわけじゃなくて残念ながらアホな子もそりゃいるんだよ
あんまりいじめてやるなよ
2023/02/23(木) 21:37:16.18ID:a6t3KRYM
弱者は強者に負けるとかいう理論もまた創作なのに
創作と現実が一致するまで戦争をやめられない現象は実際に起きている
2023/02/23(木) 22:01:41.01ID:6fqNKB/7
よほど誤解を招きやすい情報ソースがあるのか
それともここにはアホの子しかいないのか
はたまた一人が暴れているだけなのか
2023/02/23(木) 22:02:05.98ID:vkbZDErw
C++のリファレンスカウンタの仕組みからやってないヤツにはちんぷんかんぷんだろうぜ
2023/02/23(木) 22:14:56.65ID:A0wb20Dk
経緯は>>770の通りだろうけどそんなに引っ張る話なのかがわからんね。
それで実害があるならともかく。
2023/02/23(木) 22:23:17.99ID:WkxhN+WD
病気な人が荒らすためのネタとしてやってるだけだろうからスルーが一番
2023/02/23(木) 22:41:43.47ID:6seZ46P8
>>830
>はたまた一人が暴れているだけなのか
100%これ
数ヶ月このスレにいれば自ずとわかってくる
2023/02/23(木) 22:51:26.41ID:VTDygilb
オジ連呼の人だろ
放置でええやん
2023/02/23(木) 23:14:02.76ID:7+yv+Q2n
>>823
Rustは様々な点で実装(生成コード)と概念を明確に分けてるね
概念の部分だけを保証するから最適化の余地が大きくて良い感じ
2023/02/23(木) 23:43:30.64ID:a6t3KRYM
概念にも最適化があって概念の「わかりやすさ」を最適化するために
moveとtransferどっちが優れた概念かを決めるバトルをやってたんだな
2023/02/23(木) 23:58:17.97ID:7+yv+Q2n
>>837
Rustではその概念に対しては一貫してmoveを使っていてtransferが出てくるのは一般動詞として
2023/02/24(金) 02:17:51.42ID:9XgCrrYb
ひとり複製おじポエム
2023/02/24(金) 06:23:24.59ID:CUSdLGN9
Interface 2023年5月号予告
Cと比較して理解する 質実剛健 Rust言語
3月25日発売 (定価 1,200円+税)
2023/02/24(金) 16:52:10.17ID:nsUeAOhk
動かして学ぶ!Rust入門
発売日:2023年04月24日
定価:3,960円

【本書の概要】
Rustのプログラミング手法について、サンプルを元に手を動かしながら学ぶ書籍です。主に以下の3つについて丁寧に解説します。

●Rustの概要と開発環境
●Rustの基本的な文法と機能
●Rustによる簡単なアプリ開発

なお本書はエンジニアのための情報共有コミュニティ「Zenn」で公開されている大人気の「Rust 入門」を元にした書籍です。

【対象読者】
Rustに初めて触れるプログラマー

【本書のポイント】
・基本的な文法について丁寧に解説
・Rustの機能を学ぶのに適したサンプルを用意
・学習をもっと深めたい方に向けて「メモ」や「参照」で補足

【目次】
Chapter1 Rust
Chapter2 環境構築
Chapter3 Rustの文法と機能
Chapter4 アプリケーションの開発
2023/02/24(金) 16:55:36.65ID:7VL6jHM8
>なお本書はエンジニアのための情報共有コミュニティ「Zenn」で公開されている大人気の「Rust 入門」を元にした書籍です。

あーはいはい
結構です
2023/02/24(金) 17:23:39.58ID:C63NsF8r
https://zenn.dev/mebiusbox/books/22d4c1ed9b0003/viewer/30450c
束縛
> let 文を使うことでオブジェクトと変数を 束縛 します.変数はそのスコープから外れたときに束縛していた所有権を放棄します.
> また,最初に束縛したオブジェクトの所有権は基本的に原本となり,原本および仮の所有権がすべて放棄された時にオブジェクトは破棄されます.

原本?
仮の所有権?

( ^ω^)…
2023/02/24(金) 17:52:16.90ID:gyp0jO6s
これはまた凄いな
複製おじさん顔負けだわ
2023/02/24(金) 18:03:47.03ID:m9pgynCe
少し読んでみたけど笑いを通り越して背筋が凍るんだが

ほんとにこれの書籍化?
URL間違ってない?
2023/02/24(金) 18:06:55.78ID:/RJs/kHR
借用のことを仮の所有権と呼んでるのか
ひでーな
2023/02/24(金) 18:18:05.46ID:C63NsF8r
オレオレ用語満載の書籍が
初心者界隈に何をもたらしてしまうか…
発売前にぜひご一考願いたい( ^ω^)
2023/02/24(金) 19:58:43.81ID:4A+eO5tS
仮に (あくまでも仮に!) 完全に挙動を説明できているのだとしても
他の人が書いた説明と合わせて読もうとしたら食い違うわけだろ。
書いている人はわかりやすく言い換えてるつもりなんだろうとは思うけど
学習過程全体を考えたらあんまりわかりやすくなってない。

Rust の全てをカバーしてて他の資料を読む必要がないくらいに充実してるなら
独特の定義で押し通すのもありかもしれんが、現実にはそんなことありえないしな……。
2023/02/24(金) 19:59:12.46ID:e5dQOFE4
>>843
オブジェクトという単語は各プログラミング言語で様々な意味で用いられているが
Rustでその文脈で用いられることは少なく
その説明ではオブジェクトではなく値(value)とした方がよい

Rustで用いられるオブジェクトの用法の多くはtrait objectであり
Rustで重要なオブジェクト安全もtrait objectの話
2023/02/24(金) 20:03:54.76ID:C63NsF8r
>>848
> 他の人が書いた説明と合わせて読もうとしたら食い違うわけだろ。
> 書いている人はわかりやすく言い換えてるつもりなんだろうとは思うけど
> 学習過程全体を考えたらあんまりわかりやすくなってない。

そうそれ
無駄で邪魔でしかない
独自用語を野放図に用いる傲慢さ
用語の正しさに対する誠実さが無い
2023/02/24(金) 20:09:21.33ID:hzPT7xYj
パーフェクトRust買った
これまで日本人の書いたRust本の中で1番良い出来だな
変なところに偏ってないし
2023/02/24(金) 20:18:59.08ID:kQOezMEX
参照が入ってる変数は仮でもなんでもなく参照の所有権を持ってるのに仮の所有権とか言われても困る
2023/02/24(金) 21:02:52.36ID:a3OsZb0h
オブジェクトと所有権を切り離せないものと考えてる辺り>>800と全く同じ見解じゃん
ご本人様ではないですよね?
2023/02/24(金) 21:17:18.19ID:X6Gu9Bob
たぶん参照自体じゃなく参照されてる値に対する「借用」のことを「仮の所有権」と表現してる

当然のように「オブジェクト」って言葉を使ってるけどもう少しvalueに寄せてほしいな

>> オブジェクト
>> 数値や関数や参照など,型の実体はすべて**オブジェクト**です.
>> つまり,式が返す値もまたオブジェクトになります.
>> 例えば, 1 という値も数値オブジェクトであり,1 == {1} という関係にあります.

ここの進次郎構文は何を表現してるの?
{1}が1なのはブロック式だからなんだけど
2023/02/24(金) 21:17:49.67ID:/RJs/kHR
>>800だけどちがうよ
所有権なんて存在しない見解だよ
2023/02/24(金) 21:23:19.34ID:e5dQOFE4
>>852
参照の所有権とは言わない
値に対する所有の唯一性が所有権で
値に対する参照が借用
そして所有>借用の生存期間ルールを満たした上で所有のスコープルールとなるため、

>>843
>> 原本および仮の所有権がすべて放棄された時にオブジェクトは破棄されます.

この文章の各用語を「仮の所有権」→「借用(参照)」など全て正しく書き換えても根本が間違っている
この説明だと参照が残っていれば所有者がいなくなっても破棄されないことになってしまうため
2023/02/24(金) 21:34:34.77ID:KXIZdqg5
>>855
>所有権なんて存在しない見解だよ
所有権なんて存在しないてどういうこと?
2023/02/24(金) 21:39:26.62ID:C63NsF8r
一個一個挙げてってもキリがないけど

> 所有権
> オブジェクトには 所有権 (Ownership) が付いています.この所有権には2つの属性があります.

付いています?
二つの属性がある?

( ^ω^)…
2023/02/24(金) 21:40:16.86ID:kQOezMEX
「参照」なんて呼んだって中身はただのポインタだから
アドレス値という値を持ってるし、当然その値の所有権もあるし、
&TはCopyで複製される値だし、&mut Tは非Copyでmoveされる値だぞ
2023/02/24(金) 21:41:37.97ID:e5dQOFE4
>>853
値と所有者/所有権を切り離して考えるのが無意味なのは正しい
Rustでは値には必ず所有者が存在し、所有者は必ず値を持ち、これが所有権
それぞれ単独では存在できないため、切り離して考えることは無駄で意味がない
2023/02/24(金) 21:46:41.92ID:AI6ToQ7h
>>854
何かしらの型の実体という意味で
オブジェクトという言葉を使ってるみたいだよ
値をオブジェクトと言い換えるくらいは可愛いもの
2023/02/24(金) 21:50:54.34ID:yxaYrfxm
複オジの系譜ここに極まれり
2023/02/24(金) 21:50:55.01ID:lvFucdpn
これ推理するの楽しいな

型の反対はオブジェクト
式の反対は値
そうしないと値の反対が二通り存在することになりかねない
2023/02/24(金) 21:52:47.93ID:e5dQOFE4
>>859
もちろん参照は実際にはポインタとして登場することが多いけど、必ずしもポインタが登場するわけではなくその保証はない
参照という概念レベルでのみ保証されており、最適化でポインタなんて消えることも多いため、ポインタの存在を仮定してはいけない
もちろん値としての参照がCopy実装型で、可変参照が!Copyなのはその通り
2023/02/24(金) 21:54:43.52ID:/RJs/kHR
>>857
自分が見つけられてないだけなら先に謝っておくけど
Rust公式ドキュメントも含めて誰も(値の)所有権という言葉を定義していないように見えるんだ
つまりそんなものは無いんだと今は自分の中で結論している

とか書くと狂人判定されるんだろなあ、もういいけど
2023/02/24(金) 21:57:38.30ID:kQOezMEX
>>864

&T と&mut Tはポインタだよ

https://doc.rust-lang.org/reference/types/pointer.html

Pointer types
References (& and &mut)
2023/02/24(金) 22:03:23.59ID:kQOezMEX
>>865
https://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 an owner.
・There can only be one owner at a time.
・When the owner goes out of scope, the value will be dropped.

「所有権」はownershipの訳語だから、このルールにおける「ownerであること」がownershipの定義と言っていいんじゃない?
2023/02/24(金) 22:04:46.98ID:e5dQOFE4
>>866
すまんね
そこでポインタをアドレス値と言ってるから、そういう具体的なアドレス値に必ずしも対応するわけではないという説明
もちろん型の分類としてはpointer型でその通り
2023/02/24(金) 22:06:26.65ID:e5dQOFE4
>>865
Rust公式本のここが分かりやすい
Ownership Rules
・Each value in Rust has an owner.
・There can only be one owner at a time.
・When the owner goes out of scope, the value will be dropped.
2023/02/24(金) 22:07:32.25ID:e5dQOFE4
すまん、>>867と被ってしまった
2023/02/24(金) 22:12:54.01ID:kQOezMEX
>>868
具体的なアドレス値を利用していない場合に限っては最適化で消えることはあるけど
&Tも&mut Tも取り出したいときには中身のRaw Pointerの具体的なアドレス値を取り出すことはできるんだから
参照にポインタの存在を仮定してもなんの問題もなくない?
2023/02/24(金) 22:26:37.20ID:e5dQOFE4
>>871
アドレス値として取り出すこともできるのはもちろんその通り
しかしRustの参照の概念を初心者に教える入門でアドレス値を仮定した教え方は完全に間違いです
2023/02/24(金) 22:36:10.73ID:kQOezMEX
Safe Rustの範囲内で raw pointer として中身のアドレス値を取り出すこともできるものを
アドレス値を仮定してはいけないと言われてもお前の個人的思想なんかシラネー
2023/02/24(金) 22:42:58.52ID:ifsiIFbz
俺も最初の頃は参照をアドレス値ポインタだと誤解してた
そしてRustではちょっとしたことまでわざわざポインタ経由でアクセスするのかよ無駄だなあと思ってたら
プログラムの生成コードを見るとアドレス値ポインタを使わずにちゃんと処理してた
参照はアドレス値ポインタを仮定しないもっと概念的なものであると今はわかるのうになった
2023/02/24(金) 22:43:48.83ID:X6Gu9Bob
むしろC言語の知識があるRust初心者には
「参照はコンパイラが有効性をチェックする安全なポインタ」くらいの方が伝わりやすいと思う
メモリ上に値が保持されるならアドレスは存在するわけだし最適化でメモリにすら乗らないケースの方が特殊でしょ
2023/02/24(金) 22:57:52.27ID:ifsiIFbz
参照経由でアクセスしてもポインタ使わずに済むときはポインタ出て来ないから
参照はポインタではなくアドレス値が必要になった時だけポインタになるものじゃないかな
ポインタになる場合も含むもっと上位な概念かな参照は
2023/02/24(金) 23:00:37.34ID:kQOezMEX
普通に公式がポインタだっつってんだからポインタなんだよ
お前の脳内ポインタ定義はどうでもええよ
2023/02/24(金) 23:03:04.68ID:C63NsF8r
>>877
正しい
そしておまいはこのスレにしては珍しく聡明でレスも簡潔
2023/02/24(金) 23:03:07.40ID:E8WzyA/e
このスレ、マイルールを他人に押し付ける奴が多いな
2023/02/24(金) 23:12:26.43ID:zZXMvOGK
もうこの言語だいしゅき、ソートアルゴリズムの美しい実装でこだわり過ぎて目の下に幕ができそう♡
2023/02/24(金) 23:14:18.16ID:igKefKVx
ポインタ云々より「参照にも所有権がある」と言われたら初心者にとってはわかりにくいでしょ
所有権やそれに関連するルールを概念レベルで説明する際に
不必要に実装の詳細に依存すべきじゃないと思うよ
2023/02/24(金) 23:17:10.37ID:E8WzyA/e
このスレだったっけ?
以前クイックソートの実装でHaskellが最も美しいかどうかでレスバしてたのは?
2023/02/24(金) 23:19:48.91ID:kQOezMEX
>>881
公式ドキュメントに
・Each value in Rust has an owner.
・All pointers are explicit first-class values.
とあって、 Pointer types のひとつとして References (& and &mut) が紹介されてんだから
参照にも所有権があるのは実装の詳細じゃなくて定義の問題だよ

参照はポインタの一種であり、ポインタは値の一種であり、すべての値にはownerがいるんだよ
公式ドキュメントで、実装ではなく公式ドキュメントでそう定義されてんだよ

最適化でポインタとしての実体が消えるとかいうのこそ実装の詳細に依存した話だよ
2023/02/24(金) 23:21:40.39ID:3W5ZdpBM
The bookだと参照はポインタに似てるけどポインタとは違うと書いてあるね

https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html
A reference is like a pointer in that it’s an address we can follow to access the data stored at that address; that data is owned by some other variable.
Unlike a pointer, a reference is guaranteed to point to a valid value of a particular type for the life of that reference.
2023/02/24(金) 23:27:50.41ID:kQOezMEX
>>884
もっかい貼るけど公式リファレンスね
https://doc.rust-lang.org/reference/types/pointer.html

Pointer types
All pointers are explicit first-class values. They can be moved or copied, stored into data structs, and returned from functions.

References (& and &mut)
(中略)
Copying a reference is a "shallow" operation: it involves only copying the pointer itself, that is, pointers are Copy.

公式リファレンスのIntroductionね
This book is the primary reference for the Rust programming language.

the primary reference って書いてるんだから食い違ったらどっちを参照すべきかわかるよね
2023/02/24(金) 23:30:24.61ID:kQOezMEX
A reference is like a pointer in that it’s an address we can follow to access the data stored at that address;

The Book でも参照はアドレスだって言ってんじゃねーか!
2023/02/24(金) 23:35:53.64ID:/RJs/kHR
>>867
ではownerの定義はどこに?
何がownerになり得る?
ぱっと見ownerは変数だよと言えそうな気がするけど、temporary valueは束縛されないのでルールの例外になってしまう
MIRレベルだとtemporary valueも変数に束縛される(あってる?詳しくない)ならMIRレベルの変数がownerと言えるかもしれないけど、the Bookごときがそこまで考えて書いてると思う?

さらにRc<T>/Arc<T>はstd docやらnomiconやらで"shared ownership"なる表現を平気で使っていて、
そのOwnership Rulesを絶対視するなら2番目のルールに全力で中指突き立ててることになっちゃう、よね?
もちろんTを共有しているよって意図は自然言語から分かるんだけど、その所有は変数への束縛とはまた別だし、
術語としてのowner/ownershipの定義は曖昧に思えちゃうのよね
2023/02/24(金) 23:36:51.47ID:kMIGeBWL
>>885
それはポインタ型だな
参照が実際に受け渡される時は参照値となってポインタ型になるのは当たり前
2023/02/24(金) 23:40:22.02ID:igKefKVx
>>883
>・Each value in Rust has an owner.
↑これはThe Bookという初心者向けチュートリアルに書いてある概念レベルの話

>・All pointers are explicit first-class values.
> Pointer types のひとつとして References (& and &mut) が紹介されて
↑これらはリファレンスに書いてある実装レベルの話
後者は言語使用者に現在の実装を正確に伝えるためのもの
前者とは目的も抽象度も違う

The Bookでは参照自体をvalueと呼ぶことを意図的に避けてる
by valueといえば&Tや&mut Tは含まないTを指すように区別して書かれてる
初心者にとってのわかりやすさと実装を反映した説明の正確さを両立できない事情があるから
2023/02/24(金) 23:44:20.54ID:lvFucdpn
実装依存の悪口を言うだけの方がじつはわかりやすいんだよね
建設的な造語や新ルールを提案したりしないから
2023/02/24(金) 23:45:12.43ID:igKefKVx
>>887
これも同じで初心者にとってのわかりやすさと説明の正確さが両立しないのでお茶を濁してる点
ownerを変数だけに限定してしまうといろいろ困る
‘static &strのownerとか

変数には限られない何かownerという概念的存在がいるんだ!!!ということで理解しといて
2023/02/24(金) 23:45:39.79ID:L3ynq/JH
>>883
それは値に所有権があるだけだぜ
そしてそれが参照の時はその本体より長生き出来ないんだから
「参照の所有権」なんて分かりにくい言葉は出す必要がない
それだと>>843
>原本および仮の所有権がすべて放棄された時にオブジェクトは破棄されます.
と発想が同じ
2023/02/24(金) 23:46:25.60ID:kQOezMEX
>>889
>↑これらはリファレンスに書いてある実装レベルの話
>後者は言語使用者に現在の実装を正確に伝えるためのもの

お前の妄想は知らねえよ
https://doc.rust-lang.org/reference/introduction.html
This book is the primary reference for the Rust programming language.

現在の実装じゃなくて言語としてのRustについてのリファレンスだよ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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