Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 是否可以对方法的“self”参数进行解构?_Rust_Pattern Matching - Fatal编程技术网

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的名字就是糖。这是否意味着方法的第一个参数可以使用
    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