我能在Rust中将不可变借用标记为独占性吗?

3

我有一个类似RwLock的数据结构。它不是可重入的,但实际上锁定机制是一个const函数。是否有办法将该函数标记为“exclusive_borrow”,而不需要将其更改为可变函数?这样多次调用“read”将在编译时被捕获而不是抛出异常。

struct MyRwLock<T> {
  t: T,
}

impl MyRwLock {
  // Works fine, but doesn't enforce on compile time that there is 
  // only 1 Guard.
  pub fn read(&self) -> ReadGuard<'_, T> { ... }

  // Enforces only 1 ReadGuard at compile time, but unnecessarily 
  // requires MyMutex to be mutable to read.
  pub fn mut_read(&mut self) -> ReadGuard<'_, T> { ... }
}

这是一个有趣的看法,从本地角度来看也是有道理的。从可组合性的角度来看,我担心这可能会有害。现在,如果用户之前有一个调用self.myrwlock.read()的const函数,那么该函数必须标记为"&mut self",进一步强制调用者将结构体标记为mut。不过,现在我写这篇文章时,我想这就是重点。为了保证独占借用,必须从始至终保证它是独占的... - matanmarkind
1个回答

4

&mut这个词有点误导人,实际上它指的是独占引用而不是可变的。如果你需要的是独占引用,那么使用&mut是正确的。

事实上,2014年曾经有一份建议将&mut重命名。虽然该提议从未付诸实施,但你现在可能偶尔会听到有关"mutpocalypse"的流言。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接