Using inout in delegates

Ali Çehreli acehreli at yahoo.com
Thu Oct 4 07:18:38 PDT 2012


On 10/04/2012 07:09 AM, Jesse Phillips wrote:
> On Thursday, 4 October 2012 at 13:55:39 UTC, Jacob Carlborg wrote:
>> void foo (inout int[] arr)
>> {
>> auto a = { auto b = arr[0]; };
>> }
>>
>> void main ()
>> {
>> auto a = [3, 4, 5];
>> foo(a);
>> }
>>
>> Compiling the above code with DMD 2.060 results in the following error
>> message:
>>
>> Error: variable main.foo.__lambda1.b inout variables can only be
>> declared inside inout functions
>> Failed: /Users/jacob/.dvm/bin/dvm-current-dc -v -o-
>> '/Users/jacob/development/d/main.d' -I'/Users/jacob/development/d'
>> >/Users/jacob/development/d/main.d.deps
>>
>> Is this a bug, a limitation of inout/delegate or am I doing something
>> else wrong?
>
> IIRC, inout must be applied to the return type too, and it only works in
> templates.

inout is like a template on 'mutable', const, and immutable; but it need 
not be applied to templates. Here is a simple example that transfers the 
mutability to the return type:

   http://ddili.org/ders/d.en/function_parameters.html

inout(int)[] trimmed(inout(int)[] slice)
{
     if (slice.length) {
         --slice.length;               // trim from the end

         if (slice.length) {
             slice = slice[1 .. $];    // trim from the beginning
         }
     }

     return slice;
}

All three blocks below compile:

     {
         int[] numbers = [ 5, 6, 7, 8, 9 ];
         // The return type is slice of mutable elements
         int[] middle = trimmed(numbers);
         middle[] *= 10;
         writeln(middle);
     }

     {
         immutable int[] numbers = [ 10, 11, 12 ];
         // The return type is slice of immutable elements
         immutable int[] middle = trimmed(numbers);
         writeln(middle);
     }

     {
         const int[] numbers = [ 13, 14, 15, 16 ];
         // The return type is slice of const elements
         const int[] middle = trimmed(numbers);
         writeln(middle);
     }

inout can also be applied to member functions where the 'this' reference 
takes the mutability of a parameter and all of the member accesses 
becomes mutable, const, or immutable.

Ali


More information about the Digitalmars-d-learn mailing list