Rust中能否解构self参数?foo2编译失败问题咨询
问题解答
Rust目前不支持直接在&self这类方法参数语法糖后结合@绑定与结构体解构,所以你写的foo2写法会被编译器拒绝。不过可以通过以下几种方式实现和foo1完全一致的行为:
方案1:函数体内解构self
直接在函数开头对self进行解构,代码简洁直观:
struct Foo { x: usize, y: usize } impl Foo { fn foo1(f @ Foo { x , ..}: &Foo) -> usize{ f.y + x} fn foo2(&self) -> usize { let Foo { x, .. } = self; self.y + x } }
方案2:放弃self语法糖,使用普通参数写法
和foo1保持一致,不用&self语法糖,直接定义完整参数:
impl Foo { fn foo1(f @ Foo { x , ..}: &Foo) -> usize{ f.y + x} fn foo2(f @ Foo { x , ..}: &Foo) -> usize { f.y + x } }
方案3:通过match语句实现绑定+解构
如果需要同时保留self的语义和@绑定的需求,可以用模式匹配:
impl Foo { fn foo1(f @ Foo { x , ..}: &Foo) -> usize{ f.y + x} fn foo2(&self) -> usize { match self { f @ Foo { x, .. } => f.y + x, } } }
补充说明
&self是Rust提供的语法糖,等价于self: &Self,但这个语法糖仅用于简化参数声明,不支持直接追加@绑定和解构模式,这就是编译器拒绝foo2写法的原因。
内容的提问来源于stack exchange,提问作者ajp
相关产品推荐
相关产品推荐

