借用弱<t>

时间:2016-01-15 23:07:14

标签: rust

我觉得set.seed(31) while(TRUE) { A = floor(runif(100, 1,1e6)) B = c(1,floor(runif(300, 1,1e6))) if (!any(c(A %in% B, B %in% A))){break} } x = floor(runif(1e5, 1,1e6)) Marat = function (A,B,x) { d <- rbind(data.frame(x=TRUE,y=A),data.frame(x=FALSE,y=B)) d <- d[order(d$y),] return (d$x[findInterval(x,d$y)]) } Remi = function (A,B,x) { Sol = rep(NA,length(x)) for (i in 1:length(x)) { xi = x[i] mA = max(A[A<=xi]) mB = max(B[B<=xi]) if (mA>mB) {Sol[i]=TRUE} else {Sol[i]=FALSE} } } benchmark(s1 <- Marat(A,B,x), s2 <- Remi(A,B,x), order="elapsed") test replications elapsed relative user.self sys.self user.child sys.child 1 s1 <- Marat(A, B, x) 100 1.003 NA 0.964 0.065 0 0 2 s2 <- Remi(A, B, x) 100 144.118 NA 130.320 14.867 0 0 可以使用(某种)rc::Weak特征实现。我试图从弱指针借用一些共享内容,但这不会编译:

AsRef

我理解为什么:已升级的use std::rc::Weak; struct Thing<T>(Weak<T>); impl<T> Thing<T> { fn as_ref(&self) -> Option<&T> { self.0.upgrade().map(|rc| { rc.as_ref() }) } // For clarity, without a confusing closure fn unwrapped_as_ref(&self) -> &T { self.0.upgrade().unwrap().as_ref() } } 无法在Rc电话中存活。然而,在我看来它是完美的声音。使用as_ref进行编译的可能魔术:

unsafe

所以:

  • 此解决方案有任何缺点吗?听起来不错吗?你能想到一个更简单的选择吗?
  • 在标准库中实现impl<T> Thing<T> { fn unwrapped_as_ref<'a>(&'a self) -> &'a T { let rc = self.0.upgrade().unwrap(); unsafe { std::mem::transmute(rc.as_ref()) } } } 是否有意义?

1 个答案:

答案 0 :(得分:3)

你不能借用引用,你就是不能。它很弱,不能保证底层对象存在(这就是upgrade()返回Option的原因)。即使你很幸运,当你通过弱引用(upgrade()返回Some)访问它时,值仍然存在,下一刻就可以释放它,只要{{{ 1}} d引用超出范围。

为了获得对底层值的引用,您需要某些来保持它的存活(例如强引用),但这意味着您必须将它与引用一起返回。