< 返回版块

fly542 发表于 2020-06-26 15:54

Tags:&mut,

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);
}

评论区

写评论
作者 fly542 2020-06-26 16:25

多谢解答,理解了,之前对引用和可变引用类型的理解不太深入。

--
👇
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 2020-06-26 16:21

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

#![allow(unused)]
fn print_type_of<T>(_: &T) {
    println!("{}", std::any::type_name::<T>())
}
fn main() {
let s = String::from("hello");
let bytes = s.into_bytes();
assert_eq!(&[104, 101, 108, 108, 111][..], &bytes[..]);
print_type_of(&bytes);
let mut mb= bytes;
print_type_of(&mb);
print_type_of(&mut mb);
let mut x=&mut mb;
print_type_of(&x);
let y=&mut x;
print_type_of(&y);
}

运行结果如下

alloc::vec::Vec<u8>
alloc::vec::Vec<u8>
alloc::vec::Vec<u8>
&mut alloc::vec::Vec<u8>
&mut &mut alloc::vec::Vec<u8>

不能borrow as mutable的原因是你的x是immutable的,如果你定义x的时候用的是mut x:T,那么你可以用&mut x可变借用x,但我不保证append认不认这个&mut &mut alloc::vec::Vec<u8>

Neutron3529 2020-06-26 16:11
impl AddU8<i32> for Foo {
    fn addu8(&mut self, x: i32) -> &mut Self {
//x                                          :i32
//x.to_string()                              :String
//x.to_string().into_bytes()                 :Vec<u8>
//&mut x.to_string().into_bytes()            :&mut Vec<u8>
        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 错误,为什么
//x                                          :&mut Vec<u8>
//&mut x                                     :&mut &mut Vec<u8>???
        self.data.append( x);
        self
    }
}
1 共 3 条评论, 1 页