About foreach loops

Daniel Gibson metalcaedes at gmail.com
Wed Jun 15 08:40:11 PDT 2011


Am 15.06.2011 17:29, schrieb KennyTM~:
> On Jun 15, 11 23:23, Caligo wrote:
>> On Wed, Jun 15, 2011 at 9:44 AM, KennyTM~<kennytm at gmail.com>  wrote:
>>> On Jun 15, 11 22:35, Caligo wrote:
>>>>
>>>> You can create a temporary if you like:
>>>>
>>>>    foreach(i; 0..10){
>>>>      int ii = i + 1;
>>>>      writeln(ii, " ");
>>>>    }
>>>>
>>>> Which outputs:
>>>> 1 2 3 4 5 6 7 8 9 10
>>>>
>>>>
>>>> The problem with trying to "fix" foreach is that it would create
>>>> problems of its own.  The following code would not behave correctly:
>>>>
>>>>    foreach(i; 0..10){
>>>>      if(i&    1)
>>>>        i += 1;
>>>>      writeln(i, " is even.");
>>>>    }
>>>>
>>>> not to mention all the code that's already using foreach.
>>>
>>> If the code rely on the 'implicit ref' behavior of 'i', the code is
>>> doing it
>>> wrong. The spec never mentioned what happened when the variable is
>>> modified
>>> in a ForeachRangeStatement. I believe it is more sane if modifying
>>> 'i' is
>>> disallowed unless 'ref' is used.
>>>
>>
>>
>> This should be a compile time error:
>>
>>    foreach(i; 0..10){
>>      i += 1;
>>      write(i, " ");
>>    }
>>
>> This should be legal.
>>    foreach(ref i; 0..10){
>>      i += 1;
>>      write(i, " ");
>>    }
>>
>> Is that the general consensus here?
> 
> I'm +1 on this.

Actually I thought it'd already be like this (or i being a copy).

So +1 from me as well.


More information about the Digitalmars-d mailing list