2017-04-25 37 views
4

我正试图找到一种方法来解构方法的self参数。根据GitHub comment是否可以解构方法的“自我”参数?

Per today's meeting, we have a different plan to make self arguments destructurable. With universal function-call syntax (UFCS #11938) there will not be any distinction between static methods and instance methods - they will both be 'associated functions'. At that point any function who's first argument is the self type will be callable with method syntax, and self , &self , and &mut self are just sugar for i.e. self: &Self , and destructuring on the self argument can be done as normal by not using the self-sugar.

我写了下面的代码,但我预计,这三个打印功能可以作为一种方法它不工作。

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一种方法的第一个参数。

它给出了这样的编译错误:

error: no method named `print2` found for type `Vector` in the current scope 
    --> 1.rs:27:7 
    | 
27 |  v.print2();   // not work 
    |  ^^^^^^ 
    | 
    = note: found the following associated functions; to be used as methods, functions must have a `self` parameter 
note: candidate #1 is defined in an impl for the type `Vector` 
    --> 1.rs:12:5 
    | 
12 |  fn print2(&Vector{x, y, z}: &Self) { 
    | _____^ starting here... 
13 | |   println!("{} {} {}", x, y, z); 
14 | |  } 
    | |_____^ ...ending here 

error: no method named `print3` found for type `Vector` in the current scope 
    --> 1.rs:29:7 
    | 
29 |  v.print3();   // not work 
    |  ^^^^^^ 
    | 
    = note: found the following associated functions; to be used as methods, functions must have a `self` parameter 
note: candidate #1 is defined in an impl for the type `Vector` 
    --> 1.rs:16:5 
    | 
16 |  fn print3(this: &Self) { 
    | _____^ starting here... 
17 | |   println!("{} {} {}", this.x, this.y, this.z); 
18 | |  } 
    | |_____^ ...ending here 

似乎print2()print3()不认定为Vector方法。

  1. 如何解构self方法的参数?
  2. 根据评论,名称self只是糖。这是否意味着可以使用self以外的名称作为方法的第一个参数?
+0

第一个参数必须命名为'self',如附注说明。 'self'是一个关键字。 – kennytm

+0

@kennytm他说'self'只是一个糖,所以这意味着第一个参数的名字不一定是'self'? – Laurence

+2

@Laurence:你所看到的摘录日期为2014年2月,Rust 1.0于2015年5月15日发布。请注意,在Rust历史上看起来太过分了,因为事情发生了很大的变化,直到1.0;很可能是你基于你的问题的评论已经过时了。 –

回答

8

这个最初的目的是有可能与通用函数调用,而是向后兼容的,因为这将意味着fn foo(bar: &Self)会突然相当于fn foo(self: &Self),这可以打破的方法调用由于突然出现的新方法。

全部理由在this github issue comment

可以解构明确self参数与let函数体结合:

let &Vector { x, y, z } = self; 
相关问题