LearningOS / rust-based-os-comp2023

2023秋冬季开源操作系统训练营
https://github.com/LearningOS/rust-based-os-comp2023
GNU General Public License v3.0
2.13k stars 351 forks source link

[Question] rust中是否有办法将不可变但已经转移所有权的的函数参数变为可变 #126

Closed xxczxp closed 2 years ago

xxczxp commented 2 years ago

Describe the question

问题来源是在学习rustlings时做trait2题时

trait AppendBar {
    fn append_bar(self) -> Self;
}

impl AppendBar for Vec<String> {
    fn append_bar(self) -> Self {
        let mut result=self.clone();
        result.push(String::from("Bar"));
        result
    }
}

需要实现一个函数,接受一个参数(发生所有权转移但不可变),对其进行一定的操作(发生改变),之后再返回,有除了clone以外的其他写法吗?感觉clone会带来额外的开销 又或者应该改变函数签名接受可变参数?

idlercloud commented 2 years ago

两种方案参考一下吧

// 改函数签名,但 `trait` 里的签名不用改
impl AppendBar for Vec<String> {
    fn append_bar(mut self) -> Self {
        self.push("Bar".to_string());
        self
    }
}
// 局部可变变量 shadow
impl AppendBar for Vec<String> {
    fn append_bar(self) -> Self {
        let mut ret = self;
        ret.push("Bar".to_string());
        ret
    }
}

两种方法都没有发生 clone ,效率上来说基本上是一样的。 其实我怀疑就算是 clone 的写法也会被优化掉。

另外,贴代码最好使用 markdown 的代码块哦,这样排版更美观,也会加强他人回答的意愿。

YdrMaster commented 2 years ago

@xxczxp 我把你格式改了。

@cxz888 说的对。self 只是一个变量名而已,就好像 c++ 里 this 只是个指针一样,当然可以直接在上面加个 mut

xxczxp commented 2 years ago

好的,感谢修改。 感谢回答,是我没有想到还有强大的编译器了。