Vec的append函数定义如下:
pub fn append(&mut self, other: &mut Vec<T>)
可是在下述的代码中,调用Vec的append函数一个需要&mut ,另一个不需要,这是怎么回事那?
pub trait AddU8<T> {
fn addu8(&mut self, v: T) -> &mut Self;
}
#[derive(Debug)]
struct Foo {
data: Vec<u8>
}
impl Foo {
fn new() -> Self {
Foo {
data : Vec::new(),
}
}
}
impl AddU8<i32> for Foo {
fn addu8(&mut self, x: i32) -> &mut Self {
self.data.append(&mut x.to_string().into_bytes()); // 和这个地方使用&mut OK
self
}
}
impl AddU8<&mut Vec<u8>> for Foo {
fn addu8(&mut self, x: &mut Vec<u8>) -> &mut Self {
//self.data.append(&mut x); // 使用&mut 方式 将报 cannot borrow as mutable 错误,为什么
self.data.append( x);
self
}
}
fn main() {
let mut tmp:Vec<u8> = vec![1,2,3];
let mut x = Foo::new();
x.addu8(32);
x.addu8(&mut tmp);
println!("x={:#?}", x);
}
1
共 3 条评论, 1 页
评论区
写评论多谢解答,理解了,之前对引用和可变引用类型的理解不太深入。
--
👇
Neutron3529: ``` impl AddU8 for Foo { fn addu8(&mut self, x: i32) -> &mut Self { //x :i32 //x.to_string() :String //x.to_string().into_bytes() :Vec //&mut x.to_string().into_bytes() :&mut Vec self.data.append(&mut x.to_string().into_bytes()); // 和这个地方使用&mut OK self } }
impl AddU8<&mut Vec> for Foo { fn addu8(&mut self, x: &mut Vec) -> &mut Self { //self.data.append(&mut x); // 使用&mut 方式 将报 cannot borrow as mutable 错误,为什么 //x :&mut Vec //&mut x :&mut &mut Vec??? self.data.append( x); self } }
Neutron3529: https://play.rust-lang.org/?code=%23!%5Ballow(unused)%5D%0Afn%20main()%20%7B%0Alet%20s%20%3D%20String%3A%3Afrom(%22hello%22)%3B%0Alet%20bytes%20%3D%20s.into_bytes()%3B%0A%0Aassert_eq!(%26%5B104%2C%20101%2C%20108%2C%20108%2C%20111%5D%5B..%5D%2C%20%26bytes%5B..%5D)%3B%0A%7D&edition=2018
运行结果如下
不能borrow as mutable的原因是你的
x
是immutable的,如果你定义x
的时候用的是mut x:T
,那么你可以用&mut x
可变借用x
,但我不保证append
认不认这个&mut &mut alloc::vec::Vec<u8>