vector<bool>
我想表达的是std::sort
和use 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表达吗?
答案 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> { .. }
这也不允许这一举动。
至于问题的奖金部分,你想让它移动的地方只要它有足够长的寿命,我认为答案是否定的。我知道阻止某些东西被移动的唯一方法就是借用它,然后停止任何移动。