-
Notifications
You must be signed in to change notification settings - Fork 12.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
RFC: Allow matching against n-ary variants with just the name #1701
Comments
Haskell does something like |
The implementation is already trivial even without extra syntax -- in fact, I think it'd mostly be a matter of removing the check that currently causes the error. |
I like the idea of making this case easier, but I think using the same syntax as nullary variants could make refactoring very difficult in one situation. Right now every time you change a tag you can lean on the compiler to tell you everything you need to update. Giving both these scenarios the same syntax will mean the compiler can't distinguish between the 'I believe this is a nullary variant' and 'I don't care how many arguments this variant has' cases. So promoting a variant from 0 arguments to some arguments gets you no feedback from the compiler. |
But what is the situation where this might actually introduce a bug? If you |
What if you change a variant from nullary to unary? It's possible that code might have to treat values constructed with that constructor differently depending on the value of the field. It's true that we can't protect the user from all refactoring hazards, but to me that doesn't seem like a very good argument for disregarding any particular hazard. Obviously, there are some we'll address and some we won't, but the fact that there'll be some that we won't doesn't provide any help in choosing which ones to address. |
A) Extra syntax is also a cost. B) The idea to distinguish nullary from n-ary doesn't even solve the (theoretical) problem. You'd still have the same issue adding an argument to a tag that already had arguments—the existing cases that match 'this variant with any arguments' would keep on matching. But that is exactly the point of this proposal. To reduce needless coupling. If coupling is something you guys consider a good thing, then we're just arguing from completely different standpoints. |
I'd tend to agree with Tim — sometimes coupling is good because it helps refactoring, and sometimes it's a nuisance. Depends on the situation, I think. I like the idea of having a pattern (maybe |
How about |
I think this would be great. I was going to propose the syntax |
|
I personally like |
It is my understanding that |
It seems like there is consensus that we should implement this, and it's just down to choosing the syntax. I volunteer to do it -- I favor |
I've implemented the new syntax, but going through and using it is still a separate task (probably easiest to do it incrementally, or I suppose someone could do an automated search-and-replace). |
…chenkov Move some tests to more reasonable directories - 5 cc rust-lang#73494 Threshold is 0.95. Next time I promise I will take a look into the special/misclassified directories. - [issues/issue-23208.rs](https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-23208.rs) <sup>[issue](https://github.com/rust-lang/rust/issues/23208)</sup>: associated-types 0.951 - [weird-exprs.rs](https://github.com/rust-lang/rust/blob/master/src/test/ui/weird-exprs.rs) <sup>unknown</sup>: destructuring-assignment 0.958 - [issues/issue-1701.rs](https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-1701.rs) <sup>[issue](https://github.com/rust-lang/rust/issues/1701)</sup>: structs-enums 0.974 - [issues/issue-48508-aux.rs](https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-48508-aux.rs) <sup>[issue](https://github.com/rust-lang/rust/issues/48508)</sup>: numbers-arithmetic 0.991 - [fn_must_use.rs](https://github.com/rust-lang/rust/blob/master/src/test/ui/fn_must_use.rs) <sup>unknown</sup>: lint 1.000 - [mir_check_nonconst.rs](https://github.com/rust-lang/rust/blob/master/src/test/ui/mir_check_nonconst.rs) <sup>unknown</sup>: consts 1.002 - [issues/issue-52060.rs](https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-52060.rs) <sup>[issue](https://github.com/rust-lang/rust/issues/52060)</sup>: consts 1.017 - [issues/issue-45729-unsafe-in-generator.rs](https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-45729-unsafe-in-generator.rs) <sup>[issue](https://github.com/rust-lang/rust/issues/45729)</sup>: generator 1.024 - [issues/issue-10392.rs](https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-10392.rs) <sup>[issue](https://github.com/rust-lang/rust/issues/10392)</sup>: pattern 1.039 - [no-implicit-prelude.rs](https://github.com/rust-lang/rust/blob/master/src/test/ui/no-implicit-prelude.rs) <sup>unknown</sup>: resolve 1.071 - [issues/issue-68000-unicode-ident-after-missing-comma.rs](https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-68000-unicode-ident-after-missing-comma.rs) <sup>[issue](https://github.com/rust-lang/rust/issues/68000)</sup>: parser 1.079 - [shadow.rs](https://github.com/rust-lang/rust/blob/master/src/test/ui/shadow.rs) <sup>unknown</sup>: binding 1.099 - [issues/issue-65611.rs](https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-65611.rs) <sup>[issue](https://github.com/rust-lang/rust/issues/65611)</sup>: consts 1.139 - [concat-rpass.rs](https://github.com/rust-lang/rust/blob/master/src/test/ui/concat-rpass.rs) <sup>unknown</sup>: macros 1.194 - [issues/issue-31597.rs](https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-31597.rs) <sup>[issue](https://github.com/rust-lang/rust/issues/31597)</sup>: associated-types 1.195 - [issues/issue-78372.rs](https://github.com/rust-lang/rust/blob/master/src/test/ui/issues/issue-78372.rs) <sup>[issue](https://github.com/rust-lang/rust/issues/78372)</sup>: resolve 1.426 - [impl-trait-in-bindings-issue-73003.rs](https://github.com/rust-lang/rust/blob/master/src/test/ui/impl-trait-in-bindings-issue-73003.rs) <sup>[issue](https://github.com/rust-lang/rust/issues/73003)</sup>: impl-trait 1.471 - [impl-trait-in-bindings.rs](https://github.com/rust-lang/rust/blob/master/src/test/ui/impl-trait-in-bindings.rs) <sup>unknown</sup>: impl-trait 2.500 r? `@petrochenkov`
There's lot of stuff like this in the current code:
Where we need to have the
(_, _, _)
in there even though we just want to match a variant, and don't care about the arguments. If I understand correctly, we're already disallowing shadowing such variants in patterns, so it is probably a good idea to also allow matching against them with just their name. I.e.The text was updated successfully, but these errors were encountered: