假设有一个Rust选项:
let mut x = Some(3);
为什么我能直接调用
x.as_mut()
?从文档中可以看到,as_mut
被定义为:
该函数期望第一个参数是
pub fn as_mut(&mut self) -> Option<&mut T>
从 &mut Option 转换成 Option<&mut T>。
&mut self
,即 &mut Option<T>
。那么我难道不应该使用 (&mut x).as_mut()
吗?假设有一个Rust选项:
let mut x = Some(3);
x.as_mut()
?从文档中可以看到,as_mut
被定义为:
该函数期望第一个参数是
pub fn as_mut(&mut self) -> Option<&mut T>
从 &mut Option 转换成 Option<&mut T>。
&mut self
,即 &mut Option<T>
。那么我难道不应该使用 (&mut x).as_mut()
吗?.
操作符会隐式地借用变量并完成你的意图。如果没有这个操作符,使用非借用值将变得很麻烦,因为声明为let mut v = vec![1, 2, 3]
的值不能被像v.push(4)
这样的语句操作,除非你写成(&mut v).push(4)
。同样的情况也适用于字段,所以如果一个结构体包含一个向量,则无法在不显式地借用container.vec
的情况下调用container.vec.push(element)
,即使container
本身是一个可变引用。.
和->
,后者会自动解引用。Rust的.
则有意进行必要的借用或解引用,以使方法调用正常工作。