[過去ログ]
プログラミング言語 Rust 4 (1002レス)
プログラミング言語 Rust 4 http://mevius.5ch.net/test/read.cgi/tech/1507970294/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
35: デフォルトの名無しさん [sage] 2017/10/26(木) 17:41:17.14 ID:iL6gP4TT typedef struct Foo { int x; int * x_ref; } Foo; Foo foo; foo.x = 11; foo.x_ref = &foo.x; C で書くとこんな感じになる、自分の要素への参照を要素として持つ構造体って、Rust じゃもしかして書けない? 苦心してこんなん書いてもやっぱ無理だし。 use std::mem; struct Foo<'a> { x: i32, x_ref: &'a i32, } impl<'a> Foo<'a> { fn new() -> Self { let mut foo = Foo { x: 32, x_ref: unsafe { mem::uninitialized() }, }; foo.x_ref = &foo.x; foo } } http://mevius.5ch.net/test/read.cgi/tech/1507970294/35
58: デフォルトの名無しさん [sage] 2017/10/30(月) 21:06:32.26 ID:4dqnj7Aj >>35 まず、そのままのコードでは new() の返り値が move されるときに &x のアドレスが変わってしまう(実際には最適化で move されない だろうけど言語仕様的には)ので、そのコードがエラーになるのは正当。 なので x か Foo 全体を box 化する必要がある。ただ box 化すれば コンパイルが通るかというと、 box を deref して得られる参照は box の中身の寿命ではなく box 自身の寿命になるので、 transmute で チートする必要がある。 fn new() -> Self { let mut foo = Box:new(Foo { x: 32, x_ref: unsafe { mem::uninitialized() }, }); foo.x_ref = unsafe{ mem::transmute::<_, &'static _>(&foo.x) }; foo } http://mevius.5ch.net/test/read.cgi/tech/1507970294/58
メモ帳
(0/65535文字)
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.037s