我希望foo1foo2的行为类似,但是编译器不接受foo2.有没有任何方法可以像 destruct 其他参数那样来 destruct self 参数?我在docs美元中看不到明确的答案.

struct Foo {
    x: usize,
    y: usize
}
impl Foo {
    fn foo1(f @ Foo { x , ..}: &Foo) -> usize{ f.y + x}
    fn foo2(&self @ Foo { x , ..}) -> usize { self.y + x }
}

推荐答案

不可以,您不能在函数参数中从self开始进行分解.

如果你看一下Rust参考文献(associated items引用)中functions的语法,self左右的部分是唯一处理的(修剪):

Function :
   FunctionQualifiers fn IDENTIFIER GenericParams?
      ( FunctionParameters? )
      FunctionReturnType? WhereClause?
      ( BlockExpression | ; )

...

FunctionParameters :
      SelfParam ,?
   | (SelfParam ,)? FunctionParam (, FunctionParam)* ,?

SelfParam :
   OuterAttribute* ( ShorthandSelf | TypedSelf )

ShorthandSelf :
   (& | & Lifetime)? mut? self

TypedSelf :
   mut? self : Type

...

在使用self时,不考虑通过@进行其他绑定.它需要是identifier pattern或使用类似的语法才能起作用.

您将can&Self类型中分离出来,但是由于您仍然不能调用绑定self,它将被取消作为method receiver的资格,因此与您的foo1()版本相比,这不会有任何改变.如果希望它在析构某些字段时作为一种方法运行,则需要分两个步骤来完成,如@drewtato's answer中所示.

Rust相关问答推荐

如何在Rust中获得高效的浮点最大值

Rust为什么应用于引用的操作符可以强制,而具有显式类型的let则不能?

Tauri tauri—apps/plugin—store + zustand

把Vector3变成Vector4的绝妙方法

trait声明中的生命周期参数

rust 蚀生命周期 行为

这种获取-释放关系是如何运作的?

Rust类似功能是C++命名空间吗?

在本例中,为什么我不能一次多次borrow 可变变量?

Rust 的多态现象.AsRef与Derf

在0..1之间将U64转换为F64

如何在Rust中缩短数组

使用Rust WASM读取文件

为相同特征的特征对象使用 move 方法实现特征

borrow 是由于对 `std::sync::Mutex>` 的解引用强制而发生的

trait 对象指针的生命周期

从光标位置旋转精灵

Rust 函数指针似乎被borrow 判断器视为有状态的

If let expression within .iter().any

类型组的通用枚举