1
enum Foo {
 bar,
 baz,
}

By just simply looking at this code, I thought it would print bar, baz and then barr, bazz

void main() {
 final f = Foo.bar;
 switch (f) {
 case Foo.bar:
 case Foo.baz:
 print("bar, baz");
 }
 switch (f) {
 case Foo.bar:
 if (false) {
 return;
 }
 case Foo.baz:
 print("barr, bazz");
 }
}

It seems obvious right ? if (false) is never called, so it won't return, it will fall to the next switch case.

But no . It prints bar, baz

What are the two code block not equivalent ? What is the design choice behind this and how does it compare to other languages. Or this is just Yet another Dart bug

Update:

I tested it JS, JS works the way I thought. Not dart

let day;
switch (0) {
 case 0:
 if (false) {
 break;
 }
 
 case 1:
 
 case 2:
 day = "Tuesday"; // prints this
 break;
 case 3:
 day = "Wednesday";
 break;
}
asked Jul 4, 2024 at 16:21

1 Answer 1

3

Dart is smart

Once you have assigned a code to be executed to some case, it's not necessary to break from switch, for example look at the following code:

 int x = 0;
 switch (x) {
 case 0:
 print('0');
 case 1:
 print('1');
 }

The output is just 0 , the case of 1 didn't get executed, the execution has break the switch after matching some case.

When the value matches a case's pattern, the case body executes. Non-empty case clauses jump to the end of the switch after completion. They do not require a break statement. Other valid ways to end a non-empty case clause are a continue, throw, or return statement.

But

Empty cases fall through to the next case, allowing cases to share a body.

So, for your question's second switch statement:

 switch (f) {
 case Foo.bar:
 if (false) { // you have some code to do
 return;
 }
 case Foo.baz:
 print("barr, bazz");
 }

you have assigned some code to be executed in case of Foo.bar, doesn't matter whether it's a dead code or not, it's still a code to be executed in case of match.

Match is found, but you didn't do anything if(false) never get executed, then the switch statement is over.

And for your JS code, JS like other languages C++, JAVA: you must explicitly write a break to break from switch statement.

So, for case 0 it has a code to be executed, but break statement nested inside if(false) never seen, so execution go through the down cases until break is found.

for more info dart branches

answered Jul 4, 2024 at 17:03
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.