这是我的代码,它可以编译
trait AppendBar {
fn append_bar(self) -> Self;
}
impl AppendBar for Vec<String> {
fn append_bar(mut self) -> Self {
self.push("Bar".to_string());
self
}
虽然它取得了所有权,但为什么它能在其实施中变异self ?
这是我的代码,它可以编译
trait AppendBar {
fn append_bar(self) -> Self;
}
impl AppendBar for Vec<String> {
fn append_bar(mut self) -> Self {
self.push("Bar".to_string());
self
}
虽然它取得了所有权,但为什么它能在其实施中变异self ?
因为参数的可变性不是函数签名的一部分.
这个..
fn foo(self) { ... }
...从外表上看和...完全一样.
fn foo(mut self) { ... }
...因为一旦控制转移到函数,参数会发生什么就不是调用者的事了.
因此,特征的实现是允许的,因为从调用者的Angular 来看,签名实际上是相同的.
换句话说,这两个功能有什么不同?
fn foo(mut v: String) {
// ...
}
fn foo(v: String) {
let mut v = v; // Rebind v as mutable.
// ...
}
答案是没有.该函数的值为String
,因此它始终可以对其进行变异.如果它能帮助您理解正在发生的事情,您可以认为第一个示例是第二个示例的"捷径",但它们最终的含义是相同的.
注意:这并不是Rust所特有的;在C++中,函数参数的const
-ness也不是函数签名的一部分.