【发布时间】:2022-08-18 00:48:44
【问题描述】:
我有一个名为层和一个save_as_ppmimpl块内的函数,函数的签名是这样的:
fn save_as_ppm(&self, filename: &str){}
但是 impl 块中的其他函数有 &mut self 参数,所以当我创建一个实例时,我必须让它可变(我不知道它是否在 Rust 中被称为实例)
let mut inputs = Layer::new(SAMPLE_SIZE as usize, SAMPLE_SIZE as usize);
但是当我调用这个 save_as_ppm 函数时:
inputs.save_as_ppm(&filepath)
它编译。我的问题是它为什么编译? Save_as_ppm 函数引用自己但我刚刚通过了一个可变的自我。编译器不应该报错吗?至少是一个警告?
-
允许编译器自动将
&mut T转换为&T,而不是相反。 -
遵循鸭子类型的规则,因为与不可变引用相比,可变引用具有所有功能 + 更多,我认为没有理由不应该传入可变引用,因为函数本身不会能够以任何方式改变状态
-
需要共享引用的方法会很乐意接受可变引用,因为“降级”对共享引用的可变引用总是安全的。如果
let mut v = vec![]; v.push(1); println!(\"{}\", v.len())不能编译确实会很烦人,因为Vec::len()需要&self,但v是mut。 -
@merovingian 是的,该函数将无法改变状态,因为它的签名用于不可变引用。尝试改变状态会导致编译器错误。
-
另请注意,对可变值的引用和可变引用之间存在差异
标签: rust