Rust 是否可以对方法的“self”参数进行解构?
我试图找到一种方法来分解方法的Rust 是否可以对方法的“self”参数进行解构?,rust,pattern-matching,Rust,Pattern Matching,我试图找到一种方法来分解方法的self参数。根据一份报告: 根据今天的会议,我们有一个不同的计划,让自我论证变得可分解。使用通用函数调用语法(UFCS#11938),静态方法和实例方法之间没有任何区别——它们都是“关联函数”。此时,任何第一个参数是self类型的函数都可以使用方法语法调用,self、&self、和&mut self都只是一种糖类,即self:&self,不使用self-sugar可以正常地对self参数进行解构 我编写了以下代码,但它并没有像我预期的那样工作,因为所有三个打印函数
self
参数。根据一份报告:
根据今天的会议,我们有一个不同的计划,让自我论证变得可分解。使用通用函数调用语法(UFCS#11938),静态方法和实例方法之间没有任何区别——它们都是“关联函数”。此时,任何第一个参数是self类型的函数都可以使用方法语法调用,self
、&self
、和&mut self
都只是一种糖类,即self:&self
,不使用self-sugar可以正常地对self参数进行解构
我编写了以下代码,但它并没有像我预期的那样工作,因为所有三个打印函数都可以用作一种方法
struct Vector {
x: i32,
y: i32,
z: i32,
}
impl Vector {
fn print1(self: &Self) {
println!("{} {} {}", self.x, self.y, self.z);
}
// destructure self argument
fn print2(&Vector{x, y, z}: &Self) {
println!("{} {} {}", x, y, z);
}
// use another name for the first argument
fn print3(this: &Self) {
println!("{} {} {}", this.x, this.y, this.z);
}
}
fn main() {
let v = Vector{x: 1, y: 2, z: 3};
Vector::print1(&v); // work
v.print1(); // work
Vector::print2(&v); // work
v.print2(); // not work
Vector::print3(&v); // work
v.print3(); // not work
}
print3()
仅用于测试方法的第一个参数是否可以使用除self
以外的名称
struct Vector {
x: i32,
y: i32,
z: i32,
}
impl Vector {
fn print1(self: &Self) {
println!("{} {} {}", self.x, self.y, self.z);
}
// destructure self argument
fn print2(&Vector{x, y, z}: &Self) {
println!("{} {} {}", x, y, z);
}
// use another name for the first argument
fn print3(this: &Self) {
println!("{} {} {}", this.x, this.y, this.z);
}
}
fn main() {
let v = Vector{x: 1, y: 2, z: 3};
Vector::print1(&v); // work
v.print1(); // work
Vector::print2(&v); // work
v.print2(); // not work
Vector::print3(&v); // work
v.print3(); // not work
}
它给出了以下编译错误:
错误:在当前作用域中找不到类型为“Vector”的名为“print2”的方法
-->1.rs:27:7
|
27 | v.print2();//不行
| ^^^^^^
|
=注意:找到以下关联函数;要用作方法,函数必须具有“self”参数
注:候选#1在impl中定义为`向量'类型`
-->1.rs:12:5
|
12 | fn print2(&Vector{x,y,z}:&Self){
|从这里开始。。。
13 | | println!(“{}{}{}{}”,x,y,z);
14 | | }
|这里结束
错误:在当前作用域中找不到类型为“Vector”的名为“print3”的方法
-->1.rs:29:7
|
29 | v.print3();//不行
| ^^^^^^
|
=注意:找到以下关联函数;要用作方法,函数必须具有“self”参数
注:候选#1在impl中定义为`向量'类型`
-->1.rs:16:5
|
16 | fn print3(此:&Self){
|从这里开始。。。
17 | | println!(“{}{}{}}”,this.x,this.y,this.z);
18 | | }
|这里结束
似乎print2()
和print3()
没有被识别为Vector
的方法
self
参数self
以外的名称这原本是为了在通用函数调用中实现的,但向后不兼容,因为这意味着
fn-foo(bar:&Self)
将突然等同于fn-foo(Self:&Self)
,这可能由于新方法突然出现而中断方法调用
充分的理由
您可以使用函数体中的let
绑定来分解显式self
参数:
let &Vector { x, y, z } = self;
如注释中所述,第一个参数必须命名为
self
self
是一个关键词。@kennytm他说,self
只是一个糖,那么这是否意味着第一个参数的名称不必是self
?@Laurence:你正在查找的摘录日期是2014年2月,Rust 1.0于2015年5月15日发布。在锈蚀历史中看得太远时要小心,因为在1.0之前,情况发生了很大变化;很有可能你的问题所依据的评论已经过时了。@MatthieuM。是的,这是一篇比较老的帖子,但是我没有找到其他关于这个问题的最新帖子,所以我把它放在这里。@Laurence虽然第一个参数必须是self
,&self
,或者&mut self
,但是如果它是一个方法,你可以在函数内部进行解构,就像这样:let&Vector{x,y,z}=self代码>