Re: Programming in D by Ali Çehreli

Ali Çehreli via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue Oct 18 00:08:03 PDT 2016


On 10/17/2016 11:48 PM, vino wrote:
> On Monday, 17 October 2016 at 18:20:00 UTC, cym13 wrote:
>> On Monday, 17 October 2016 at 18:10:01 UTC, vino wrote:
>>> Hi All,
>>>
>>>  As per the book named in the subject it states as below,so can some
>>> one guide me what is wrong in the below code nor correct if my
>>> understanding is wrong.
>>>
>>> Page 154
>>> immutable(int[]) specifies that neither the slice nor its elements
>>> can be modified.
>>>
>>> So which means that a element or a slice of any array can be
>>> modified, but the below example code is not working.
>>>
>>> import std.stdio;
>>> void main() {
>>> immutable(int[]) immSlice = [ 1, 2 ];
>>> immSlice ~= 3;
>>> immSlice[0] = 3; // Error's out at this point
>>> immSlice.length = 1;
>>> writeln(immSlice);
>>> }
>>> From,
>>> Vino.B
>>
>> I don't see what you don't understand, you said it yourself: "neither
>> the slice nor its elements can be modified". So you can't modify the
>> elements  of an immutable array. immSlice is an immutable array of
>> which you are trying to modify an element.
>
> Hi,
>
>  Thank you for your reply, can you address why the below code is not
> working
>
> import std.stdio;
>
> void main() {
> int[] Array = [ 1, 2, 3, 4 ];
> immutable(int[]) immSlice = Array[ 0 .. 2 ];
> writeln("1st : ", immSlice);
> immSlice ~= 3;
> writeln("2nd : ", immSlice);
> immSlice[0] = 3;
> writeln("3rd : ", immSlice);
> immSlice.length = 1;
> writeln("4th : ",immSlice);
> }
>

What is meant in that section in the book is

1) We cannot modify elements of an immutable slice

2) We cannot modify an immutable slice (e.g. cannot add elements to it)

That's the reason for the following three compilation errors:

   Error: cannot modify immutable expression immSlice
   Error: cannot modify immutable expression immSlice[0]
   Error: cannot modify immutable expression immSlice

Your new code has another compilation error here:

     int[] Array = [ 1, 2, 3, 4 ];
     immutable(int[]) immSlice = Array[ 0 .. 2 ];   // <-- ERROR

   Error: cannot implicitly convert expression (Array[0..2]) of type 
int[] to immutable(int[])

That's because immSlice wants to guarantee that it has immutable 
elements. For that to be true, it cannot share elements of a mutable 
slice. Otherwise, elements could be modified through Array, which would 
also change immSlice's elements. (Remember that Array and immSlice would 
be sharing elements.)

Ali



More information about the Digitalmars-d-learn mailing list