即使借不变的借款,它是否有可能移动?

时间:2016-08-20 16:56:11

标签: rust

vector<bool>

我想表达的是std::sortuse std::marker; use std::ops; pub struct Shared<'r, T: 'r> { data: *mut T, _pd: marker::PhantomData<&'r T>, } impl<'r, T> Shared<'r, T> { pub fn new(value: T) -> Shared<'r, T> { let boxed = Box::new(value); Shared { data: Box::into_raw(boxed), _pd: marker::PhantomData, } } pub fn as_ref(&self) -> SharedRef<'r, T> { SharedRef { data: self.data, _pd: marker::PhantomData, } } } impl<'r, T> ops::Deref for Shared<'r, T> { type Target = T; fn deref(&self) -> &T { unsafe { &*self.data } } } pub struct SharedRef<'r, T: 'r> { data: *mut T, _pd: marker::PhantomData<&'r T>, } impl<'r, T> ops::Deref for SharedRef<'r, T> { type Target = T; fn deref(&self) -> &T { unsafe { &*self.data } } } impl<'r, T> Drop for Shared<'r, T> { fn drop(&mut self) { unsafe { Box::from_raw(self.data); } } } fn main() { let s = Shared::new(42); let s_ref = s.as_ref(); { let s1 = s; } // lifetime should end here println!("{}", *s_ref); } 之间的混合。唯一拥有的指针,也能够发出引用。

问题在于我希望能够移动Box,即使目前有不可靠的借款。在这种情况下它应该是合法的,因为它是堆分配的。

问题在于我不知道如何表达这一点。

Arc

在这里,我将Shared移动到一个比以前更少“生命周期”的范围内。但是,在我将fn main() { let s = Shared::new(42); let s_ref = s.as_ref(); { let s1 = s; } // lifetime should end here println!("{}", *s_ref); } 移至s之后,s不再可访问了。所以我想说的是,如果生命周期不变小,可以移动s1

这可以用Rust表达吗?

1 个答案:

答案 0 :(得分:1)

Rust允许您退出Shared的原因是您没有将返回的SharedRef的生命周期与之关联起来:

pub fn as_ref(&self) -> SharedRef<'r, T> {
    SharedRef {
        data: self.data,
        _pd: marker::PhantomData,
    }
}

注释&self修正:

pub fn as_ref(&'r self) -> SharedRef<'r, T> { .. }

我目前的理解是,这里的关键区别是,这表示SharedRef的生命周期现在与self借用的生命周期匹配,保留借用活。实际上它不必与'r中的生命周期(Shared)相同;它适用于借用/返回的新生命周期:

pub fn as_ref<'b>(&'b self) -> SharedRef<'b, T> { .. }

这也不允许这一举动。

至于问题的奖金部分,你想让它移动的地方只要它有足够长的寿命,我认为答案是否定的。我知道阻止某些东西被移动的唯一方法就是借用它,然后停止任何移动。