Understanding switch + foreach
Steven Schveighoffer
schveiguy at yahoo.com
Thu Apr 17 06:15:09 PDT 2014
On Thu, 17 Apr 2014 06:54:39 -0400, Timon Gehr <timon.gehr at gmx.ch> wrote:
> On 04/08/2014 05:14 PM, Steven Schveighoffer wrote:
>> On Mon, 07 Apr 2014 18:30:30 -0400, Matej Nanut <matejnanut at gmail.com>
>> wrote:
>>
>>> Hello,
>>>
>>> I don't understand why so many break statements are needed in this
>>> construct:
>>>
>>> immutable key = 3;
>>> switch (key)
>>> {
>>> foreach (c; TypeTuple!(1, 2, 3, 4, 5))
>>> {
>>> case c: "Found %s!".writefln(c);
>>> break;
>>> }
>>> break; // Default always gets executed without this break.
>>> default:
>>> "Not found %s :(".writefln(key);
>>> break;
>>> }
>>>
>>> One after each case and another one after the foreach.
>>
>> First, let me say this is a cool usage of compile-time foreach, I had
>> never thought of that.
>> ...
>
> I do this quite often.
You get a gold star then ;)
>
>> Second, I think the issue is likely a bug with the break exiting the
>> wrong scope.
>
> No, this is expected behaviour. break and continue work in any foreach
> statement. break always breaks the innermost breakable statement. (In
> particular, it does not pair up with case statements.)
But should a foreach over a tuple a breakable statement? Basically, the
above seems to me it should be equivalent to:
case 1:
writefln("Found %s!", 1);
break;
case 2:
writefln("Found %s!", 2);
break;
...
The foreach should be gone once the foreach is executed at compile-time.
If the break breaks the foreach, why isn't just case 1 produced? That
would be an actual break in the foreach, no?
-Steve
More information about the Digitalmars-d-learn
mailing list