Why does a match expression with an unknown identifier compile and run?












2















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?










share|improve this question




















  • 1





    Heavily related: stackoverflow.com/q/28225958/1233251

    – E_net4
    Nov 23 '18 at 23:05
















2















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?










share|improve this question




















  • 1





    Heavily related: stackoverflow.com/q/28225958/1233251

    – E_net4
    Nov 23 '18 at 23:05














2












2








2








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?










share|improve this question
















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






share|improve this question















share|improve this question













share|improve this question




share|improve this question








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














  • 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












1 Answer
1






active

oldest

votes


















4














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.






share|improve this answer
























  • 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











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
});


}
});














draft saved

draft discarded


















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









4














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.






share|improve this answer
























  • 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
















4














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.






share|improve this answer
























  • 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














4












4








4







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.






share|improve this answer













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.







share|improve this answer












share|improve this answer



share|improve this answer










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



















  • 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


















draft saved

draft discarded




















































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.




draft saved


draft discarded














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





















































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







Popular posts from this blog

Contact image not getting when fetch all contact list from iPhone by CNContact

count number of partitions of a set with n elements into k subsets

A CLEAN and SIMPLE way to add appendices to Table of Contents and bookmarks