3 回答

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超8個(gè)贊
您可以創(chuàng)建一個(gè)與所Ref<'a,T>返回的后衛(wèi)類似的新結(jié)構(gòu)RefCell::borrow(),以對(duì)其進(jìn)行包裝Ref并避免其超出范圍,例如:
use std::cell::Ref;
struct FooGuard<'a> {
guard: Ref<'a, MutableInterior>,
}
然后,您可以Deref為其實(shí)現(xiàn)特征,以便可以像使用它一樣使用它&Vec<i32>:
use std::ops::Deref;
impl<'b> Deref for FooGuard<'b> {
type Target = Vec<i32>;
fn deref(&self) -> &Vec<i32> {
&self.guard.vec
}
}
之后,更新您的get_items()方法以返回FooGuard實(shí)例:
impl Foo {
pub fn get_items(&self) -> FooGuard {
FooGuard {
guard: self.interior.borrow(),
}
}
}
并Deref做魔術(shù):
fn main() {
let f = Foo {
interior: RefCell::new(MutableInterior {
vec: Vec::new(),
hide_me: 2,
}),
};
let borrowed_f = &f;
let items = borrowed_f.get_items();
let v: &Vec<i32> = &items;
}

TA貢獻(xiàn)1807條經(jīng)驗(yàn) 獲得超9個(gè)贊
您可以使用Ref::map(從Rust 1.8開(kāi)始)而不是創(chuàng)建全新的類型。這與Levans的現(xiàn)有答案具有相同的結(jié)果:
use std::cell::Ref;
impl Foo {
pub fn get_items(&self) -> Ref<'_, Vec<i32>> {
Ref::map(self.interior.borrow(), |mi| &mi.vec)
}
}
您還可以使用新功能,例如從API中impl Trait隱藏Ref:
use std::cell::Ref;
use std::ops::Deref;
impl Foo {
pub fn get_items(&self) -> impl Deref<Target = Vec<i32>> + '_ {
Ref::map(self.interior.borrow(), |mi| &mi.vec)
}
}

TA貢獻(xiàn)1801條經(jīng)驗(yàn) 獲得超16個(gè)贊
你可以包裝Vec在Rc。
use std::cell::RefCell;
use std::rc::Rc;
struct MutableInterior {
hide_me: i32,
vec: Rc<Vec<i32>>,
}
struct Foo {
interior: RefCell<MutableInterior>,
}
impl Foo {
pub fn get_items(&self) -> Rc<Vec<i32>> {
self.interior.borrow().vec.clone() // clones the Rc, not the Vec
}
}
fn main() {
let f = Foo {
interior: RefCell::new(MutableInterior {
vec: Rc::new(Vec::new()),
hide_me: 2,
}),
};
let borrowed_f = &f;
let items = borrowed_f.get_items();
}
當(dāng)您需要對(duì)進(jìn)行突變時(shí)Vec,可使用Rc::make_mut獲取對(duì)的可變引用Vec。如果還有其他的Rc小號(hào)指的是Vec,make_mut將分離的Rc與其他RcS,克隆Vec和更新本身指的是新的Vec,然后給你一個(gè)可變的引用。這樣可以確保其他Rcs中的值不會(huì)突然改變(因?yàn)镽c它本身不提供內(nèi)部可變性)。
- 3 回答
- 0 關(guān)注
- 682 瀏覽
添加回答
舉報(bào)