是否有针对 Rc 或 Arc 的操作可以克隆基础值并将其 returns 传递给调用者?
Is there an operation for Rc or Arc which clones the underlying value and returns it to the caller?
我正在寻找大致像这样的东西 take
,但是原子的:
impl<T: Clone> for Arc<T> {
fn take(mut self) -> T {
Arc::make_mut(&mut self);
Arc::try_unwrap(self).unwrap()
}
}
换句话说,我想要 Arc::make_mut
其中 returns 值本身,而不是可变引用。
我们可以使用the *
deref operator来寻址Rc
或Arc
内部的底层值,然后调用.clone()
到return一个新拥有的该值的克隆(假设它是可克隆的)。
use std::rc::Rc;
fn main() {
let rc = Rc::new("Hello".to_string());
let mut cloned = (*rc).clone();
cloned.truncate(4);
// verify that it's modified
println!("{:?}", cloned); // "Hell"
// verify that the original was not
println!("{:?}", rc); // "Hello"
}
Rc
/Arc
语义将阻止在您的引用存在时创建任何可变引用,因此此操作是线程安全的;克隆数据时无法更改数据。您也不需要对原始基础值的可变引用,因为您没有修改它。
在某些情况下,Rust 允许您省略 *
取消引用运算符:如果您尝试调用指针上不存在但确实存在的方法,它将隐式取消引用非可变指针类型存在于基础价值上。但是,在这种情况下我们需要明确说明,因为 .clone()
方法确实已经存在于 Rc
/Arc
上:它用于创建对相同值的新引用。我们不想调用它,所以我们需要显式取消引用以访问内部类型的 .clone()
。
我们还可以通过适当的类型显式调用它来告诉 Rust 我们想要哪个 .clone()
方法,编译器将根据需要隐式应用尽可能多的取消引用。
use std::rc::Rc;
fn main() {
let rc3 = Rc::new(Rc::new(Rc::new("Hello".to_string())));
let mut cloned = String::clone(&rc3);
cloned.truncate(4);
// verify that it's modified
println!("{:?}", cloned); // "Hell"
// verify that the original was not
println!("{:?}", rc3); // "Hello"
}
我正在寻找大致像这样的东西 take
,但是原子的:
impl<T: Clone> for Arc<T> {
fn take(mut self) -> T {
Arc::make_mut(&mut self);
Arc::try_unwrap(self).unwrap()
}
}
换句话说,我想要 Arc::make_mut
其中 returns 值本身,而不是可变引用。
我们可以使用the *
deref operator来寻址Rc
或Arc
内部的底层值,然后调用.clone()
到return一个新拥有的该值的克隆(假设它是可克隆的)。
use std::rc::Rc;
fn main() {
let rc = Rc::new("Hello".to_string());
let mut cloned = (*rc).clone();
cloned.truncate(4);
// verify that it's modified
println!("{:?}", cloned); // "Hell"
// verify that the original was not
println!("{:?}", rc); // "Hello"
}
Rc
/Arc
语义将阻止在您的引用存在时创建任何可变引用,因此此操作是线程安全的;克隆数据时无法更改数据。您也不需要对原始基础值的可变引用,因为您没有修改它。
在某些情况下,Rust 允许您省略 *
取消引用运算符:如果您尝试调用指针上不存在但确实存在的方法,它将隐式取消引用非可变指针类型存在于基础价值上。但是,在这种情况下我们需要明确说明,因为 .clone()
方法确实已经存在于 Rc
/Arc
上:它用于创建对相同值的新引用。我们不想调用它,所以我们需要显式取消引用以访问内部类型的 .clone()
。
我们还可以通过适当的类型显式调用它来告诉 Rust 我们想要哪个 .clone()
方法,编译器将根据需要隐式应用尽可能多的取消引用。
use std::rc::Rc;
fn main() {
let rc3 = Rc::new(Rc::new(Rc::new("Hello".to_string())));
let mut cloned = String::clone(&rc3);
cloned.truncate(4);
// verify that it's modified
println!("{:?}", cloned); // "Hell"
// verify that the original was not
println!("{:?}", rc3); // "Hello"
}