15:24:09 @azyobuzin@mstdn.maud.io
icon

ドコモおおおおおおおおお

Attach image
20:51:28 @azyobuzin@mstdn.maud.io
icon

Rc の clone、 clone ではないし Clone trait で実現するべきではないのではと思ってる

20:55:21 @azyobuzin@mstdn.maud.io
icon

> The Rc::clone(&from) syntax is the most idiomatic because it conveys more explicitly the meaning of the code.
doc.rust-lang.org/stable/std/r

あー公式ドキュメントがそういう書き方推しなのか(そういう問題じゃなくて、 add_ref とかそういう表現にするべきだよなという意見を僕は持ってるけど)

20:57:42 @azyobuzin@mstdn.maud.io
icon

@kb10uy new_ref でよくない?

21:00:56 @azyobuzin@mstdn.maud.io
2020-03-07 20:58:34 らりお・ザ・何らかの🈗然㊌ソムリエの投稿 lo48576@mastodon.cardina1.red
icon

たとえば

#[derive(Clone)]
struct Foo {
bar: Rc<Bar>,
baz: Baz,
}

みたいなことができてほしいとき、 Rc<T>: Clone がないと自明な impl Clone for Foo { ... } を手書きすることになってしまう

21:00:58 @azyobuzin@mstdn.maud.io
icon

これは Rc が Clone であるという前提で語ればそうだけど、そうじゃなかった場合、そもそも Rc を含む構造体の clone ってどういう意味? からスタートするので、実際に Clone を実装するなら、手書きする方が筋がいい

21:08:44 @azyobuzin@mstdn.maud.io
2020-03-07 21:05:39 らりお・ザ・何らかの🈗然㊌ソムリエの投稿 lo48576@mastodon.cardina1.red
icon

たとえば raw pointer の Clone / Copy がアドレスのコピーであることに疑いはないと思うんだけど、よーするにポインタとそれが指すオブジェクトは区別されているわけね。
それで Box / Rc / Arc も Deref を実装した smart pointer であるわけで、その Clone は smart pointer が指すオブジェクトではなく smart pointer そのものの「複製」を意味していると考えるのが自然だと思うんですよ。
であれば、 Rc の Clone 実装が refcount 増加であっても不自然さはないと考えられる

21:08:45 @azyobuzin@mstdn.maud.io
icon

Box では clone は中身の clone になるので、そもそも Rust の文脈でポインタのコピーというもの自体が不自然では?

21:09:28 @azyobuzin@mstdn.maud.io
icon

あーでも &T はコピー可能か