可变所有权类型
其实是个问答帖,官方回答问题太多了,不想回答了,
看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 协议》,转载必须注明作者和本文链接
我看文档都吃力,大佬都看源码了?? :sob:
这个应该是命名遮盖,后面的变量名会遮盖前面定义的变量名
push函数中你使用的这个变量本身,执行完这个函数之后所有权就已经转移。
let x = B{name: String::from("123")}.push("hi");
x重新绑定了push函数返回的变量