Why does a match expression with an unknown identifier compile and run?
I would expect the Rust compiler to complain about the missing cases in match as well as the unknown identifier:
pub enum MyEnum {
Case1,
Case2,
}
impl MyEnum {
fn my_func(&self) {
match self {
_whatever_string => println!("Why am I printed ?"),
}
}
}
fn main() {
let x = MyEnum::Case1;
x.my_func();
}
Why does it compile and call the println
?
rust
add a comment |
I would expect the Rust compiler to complain about the missing cases in match as well as the unknown identifier:
pub enum MyEnum {
Case1,
Case2,
}
impl MyEnum {
fn my_func(&self) {
match self {
_whatever_string => println!("Why am I printed ?"),
}
}
}
fn main() {
let x = MyEnum::Case1;
x.my_func();
}
Why does it compile and call the println
?
rust
1
Heavily related: stackoverflow.com/q/28225958/1233251
– E_net4
Nov 23 '18 at 23:05
add a comment |
I would expect the Rust compiler to complain about the missing cases in match as well as the unknown identifier:
pub enum MyEnum {
Case1,
Case2,
}
impl MyEnum {
fn my_func(&self) {
match self {
_whatever_string => println!("Why am I printed ?"),
}
}
}
fn main() {
let x = MyEnum::Case1;
x.my_func();
}
Why does it compile and call the println
?
rust
I would expect the Rust compiler to complain about the missing cases in match as well as the unknown identifier:
pub enum MyEnum {
Case1,
Case2,
}
impl MyEnum {
fn my_func(&self) {
match self {
_whatever_string => println!("Why am I printed ?"),
}
}
}
fn main() {
let x = MyEnum::Case1;
x.my_func();
}
Why does it compile and call the println
?
rust
rust
edited Nov 25 '18 at 14:57
Shepmaster
152k14297435
152k14297435
asked Nov 23 '18 at 21:29
bm842bm842
9918
9918
1
Heavily related: stackoverflow.com/q/28225958/1233251
– E_net4
Nov 23 '18 at 23:05
add a comment |
1
Heavily related: stackoverflow.com/q/28225958/1233251
– E_net4
Nov 23 '18 at 23:05
1
1
Heavily related: stackoverflow.com/q/28225958/1233251
– E_net4
Nov 23 '18 at 23:05
Heavily related: stackoverflow.com/q/28225958/1233251
– E_net4
Nov 23 '18 at 23:05
add a comment |
1 Answer
1
active
oldest
votes
Your example is a special case of something explained here:
let x = 5;
let number = match x {
1 => "one",
2 => "two",
3 => "three",
4 => "four",
5 => "five",
_ => "something else",
};
Consider the last case (_
), which matches anything not mentioned before. The compiler does not complain about missing cases (since "everything else" is covered by the last branch).
Your example is essentially the same: A match
with one single arm that covers everything. You could also have written _
instead of _whatever_string
, or another identifier - that could then be used in the corresponding arm.
So, this match
just matches and executes the statements in its single arm. The compiler sees that the single branch covers everything and does not need to complain.
Thanks for your answer. I thought only '_' was accepted as the default arm but it seems not. I can even add more "whatever_identifier" cases without the compiler to complain (except warnings).
– bm842
Nov 24 '18 at 5:52
4
Any implicitly typed, unconstrained identifier can match any value.
– Nicola Musatti
Nov 24 '18 at 8:01
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53453128%2fwhy-does-a-match-expression-with-an-unknown-identifier-compile-and-run%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
Your example is a special case of something explained here:
let x = 5;
let number = match x {
1 => "one",
2 => "two",
3 => "three",
4 => "four",
5 => "five",
_ => "something else",
};
Consider the last case (_
), which matches anything not mentioned before. The compiler does not complain about missing cases (since "everything else" is covered by the last branch).
Your example is essentially the same: A match
with one single arm that covers everything. You could also have written _
instead of _whatever_string
, or another identifier - that could then be used in the corresponding arm.
So, this match
just matches and executes the statements in its single arm. The compiler sees that the single branch covers everything and does not need to complain.
Thanks for your answer. I thought only '_' was accepted as the default arm but it seems not. I can even add more "whatever_identifier" cases without the compiler to complain (except warnings).
– bm842
Nov 24 '18 at 5:52
4
Any implicitly typed, unconstrained identifier can match any value.
– Nicola Musatti
Nov 24 '18 at 8:01
add a comment |
Your example is a special case of something explained here:
let x = 5;
let number = match x {
1 => "one",
2 => "two",
3 => "three",
4 => "four",
5 => "five",
_ => "something else",
};
Consider the last case (_
), which matches anything not mentioned before. The compiler does not complain about missing cases (since "everything else" is covered by the last branch).
Your example is essentially the same: A match
with one single arm that covers everything. You could also have written _
instead of _whatever_string
, or another identifier - that could then be used in the corresponding arm.
So, this match
just matches and executes the statements in its single arm. The compiler sees that the single branch covers everything and does not need to complain.
Thanks for your answer. I thought only '_' was accepted as the default arm but it seems not. I can even add more "whatever_identifier" cases without the compiler to complain (except warnings).
– bm842
Nov 24 '18 at 5:52
4
Any implicitly typed, unconstrained identifier can match any value.
– Nicola Musatti
Nov 24 '18 at 8:01
add a comment |
Your example is a special case of something explained here:
let x = 5;
let number = match x {
1 => "one",
2 => "two",
3 => "three",
4 => "four",
5 => "five",
_ => "something else",
};
Consider the last case (_
), which matches anything not mentioned before. The compiler does not complain about missing cases (since "everything else" is covered by the last branch).
Your example is essentially the same: A match
with one single arm that covers everything. You could also have written _
instead of _whatever_string
, or another identifier - that could then be used in the corresponding arm.
So, this match
just matches and executes the statements in its single arm. The compiler sees that the single branch covers everything and does not need to complain.
Your example is a special case of something explained here:
let x = 5;
let number = match x {
1 => "one",
2 => "two",
3 => "three",
4 => "four",
5 => "five",
_ => "something else",
};
Consider the last case (_
), which matches anything not mentioned before. The compiler does not complain about missing cases (since "everything else" is covered by the last branch).
Your example is essentially the same: A match
with one single arm that covers everything. You could also have written _
instead of _whatever_string
, or another identifier - that could then be used in the corresponding arm.
So, this match
just matches and executes the statements in its single arm. The compiler sees that the single branch covers everything and does not need to complain.
answered Nov 23 '18 at 21:49
phimuemuephimuemue
20.3k66298
20.3k66298
Thanks for your answer. I thought only '_' was accepted as the default arm but it seems not. I can even add more "whatever_identifier" cases without the compiler to complain (except warnings).
– bm842
Nov 24 '18 at 5:52
4
Any implicitly typed, unconstrained identifier can match any value.
– Nicola Musatti
Nov 24 '18 at 8:01
add a comment |
Thanks for your answer. I thought only '_' was accepted as the default arm but it seems not. I can even add more "whatever_identifier" cases without the compiler to complain (except warnings).
– bm842
Nov 24 '18 at 5:52
4
Any implicitly typed, unconstrained identifier can match any value.
– Nicola Musatti
Nov 24 '18 at 8:01
Thanks for your answer. I thought only '_' was accepted as the default arm but it seems not. I can even add more "whatever_identifier" cases without the compiler to complain (except warnings).
– bm842
Nov 24 '18 at 5:52
Thanks for your answer. I thought only '_' was accepted as the default arm but it seems not. I can even add more "whatever_identifier" cases without the compiler to complain (except warnings).
– bm842
Nov 24 '18 at 5:52
4
4
Any implicitly typed, unconstrained identifier can match any value.
– Nicola Musatti
Nov 24 '18 at 8:01
Any implicitly typed, unconstrained identifier can match any value.
– Nicola Musatti
Nov 24 '18 at 8:01
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53453128%2fwhy-does-a-match-expression-with-an-unknown-identifier-compile-and-run%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
1
Heavily related: stackoverflow.com/q/28225958/1233251
– E_net4
Nov 23 '18 at 23:05