rust


Is it possible to destructure the `self` argument of a method?


I am trying to find a way to destructure the self argument of a method. According to a 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.
I wrote the following code, but it does not work as I expected in that all three print functions can be used as a method.
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() was just used to test if it is possible to use a name other than self for the first argument of a method.
It gives this compile error:
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
It seems that print2() and print3() are not identified as methods of Vector.
How to destructure the self argument of a method?
According to the comment, the name self is just sugar. Does it mean that a name other than self can be used for the first argument of a method?
This was originally intended to be possible with the Universal Function Calls, but is backwards incompatible, because it would mean that fn foo(bar: &Self) would suddenly be equivalent to fn foo(self: &Self), which can break method calls due to new methods appearing suddenly.
Full rationale in this github issue comment
You can destructure the explicit self parameter with a let binding in the function body:
let &Vector { x, y, z } = self;

Related Links

Repetitive trait bounds on generic structs [duplicate]
Choose to borrow or pass ownership without duplicating code in Rust
How to get the name of current program without the directory part?
Changing key of HashMap from child method
Cannot build a delete function for a binary search tree in Rust because the borrowed value does not live long enough
Why does AtomicUsize not implement Send?
How can I define a list of functions to call? [duplicate]
How can I tell if a Rust library is deprecated?
error: non-scalar cast: `core::option::Option<i32>` as `usize`
Lifetime of variable in map/flat_map in Rust
Can associated constants be used to initialize fixed size arrays?
Why do Arc and Mutex allow me to change the value of an immutable variable?
Unable to download a package via cargo — timeout
“borrowed value does not live long enough” seems to blame the wrong thing
Is the destructor of Arc guaranteed to be called before upgrading a Weak reference will return None?
Can't find crate for `rayon`

Categories

HOME
hpoo
windows-8.1
qc
systemd
haproxy
hid
stacktrace.js
dry
nsview
azure-data-lake
position
onvif
sympy
migrate
xades4j
chromecast
orange-api
user-defined-types
l20n
asciimath
fosuserbundle
varnish-vcl
xsl-fo
salt-cloud
nullreferenceexception
gitkraken
quartz.net
managed-c++
pubxml
introspection
multi-dimensional-scaling
pyspark-sql
bobo-browse.net
bitbake
progid
nsmutablearray
amazon-kms
xerces-c
jfxtras
netstat
nanogallery
utf
jacoco-maven-plugin
ejml
xcode8.2
linq-to-excel
deployd
beeline
karabiner
android-sharing
front-camera
oid
cefpython
jsf-2.3
processor
urbit
polymerfire
teamviewer
psd
wikimedia-commons
ssmtp
dos2unix
string.format
ildasm
utf8-decode
osascript
jini
sql-function
compiler-flags
mute
codahale-metrics
virtual-channel
proc-open
cmath
smartfox
tridion-2011
xalan
websphere-6.1
image-scanner
java.lang.class
trialware
algol68
play2-mini
azure-acs
photo-management
ognl
hungarian-notation
ninject-interception
server-load
error-detection
synthesizer

Resources

Mobile Apps Dev
Database Users
javascript
java
csharp
php
android
MS Developer
developer works
python
ios
c
html
jquery
RDBMS discuss
Cloud Virtualization
Database Dev&Adm
javascript
java
csharp
php
python
android
jquery
ruby
ios
html
Mobile App
Mobile App
Mobile App