可变所有权类型

其实是个问答帖,官方回答问题太多了,不想回答了,
看String的add方法的源码看到的一段代码,有点脑袋绕,记录下。

下面这个是简单的实例

#[derive(Debug)]
struct B {
  name:String
}

impl B {
  fn push(mut self, s:&str) ->Self {
    self.name.push_str(s);
    self
  }
}

对可变的认识一直是在可变绑定这块,比如有个结构体B,这样创建一个可变的绑定

 let mut x = B{name:String::from("abc")};

创建一个可变的变量x,并绑定到结构体B的实例,x拥有B的这个实例的所有权,B结构体有个方法push,,可以调用

let x = x.push("a");

这样子没有任何问题,对之前的所有权理解的也是这样的。但我仔细想了下换了另外一种方式调用

let x = B{name:String::from("abc")}.push("ii");

也没错,正常编译和执行,绕就绕在一个类型的可变不用指定mut吗?暂时没理解,有理解的可以评论说下


做了几个实现,感觉还是引用和所有权没有理解透,只要函数使用了所有权对象的可变参数,则只需要把实例转移过来即可,是否由变量绑定(可变和非可变)都无关紧要。
变量绑定不是对这个实例的引用(不要考虑内存存储),就应该当做就是这个实例类型
fn main() {
    let x1 = B{name:String::from("abc")};
    let mut x2 = B{name:String::from("123")};
    mut_test(x1);
    mut_test(x2);
}

fn mut_test(mut s:  B) {// mut去掉会编译异常
    s.name.push_str("abc");
    println!("{}", s.name);
}
其实脑袋还是没理解透 引用和所有权的关系

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 3

我看文档都吃力,大佬都看源码了?? :sob:

5年前 评论
vms_g (楼主) 5年前

这个应该是命名遮盖,后面的变量名会遮盖前面定义的变量名

5年前 评论

push函数中你使用的这个变量本身,执行完这个函数之后所有权就已经转移。
let x = B{name: String::from("123")}.push("hi");
x重新绑定了push函数返回的变量

5年前 评论
vms_g (楼主) 5年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!