Idiomatic way to process const/immutable arrays as ranges
Regan Heath
regan at netmail.co.nz
Mon Feb 11 09:33:36 PST 2013
On Mon, 11 Feb 2013 17:13:21 -0000, Dicebot <m.strashun at gmail.com> wrote:
> On Monday, 11 February 2013 at 16:54:04 UTC, Jonathan M Davis wrote:
>> The const(T)[] cannot alter the original array at all, so I concur with
>> Steven
>> in that the complaints about not wanting to use tail-const make no
>> sense.
>> Maybe this article will help clear things up:
>
> And I exactly want to prohibit altering original array. What I want is
> to copy slice (without deep copying of data) and alter this fresh copy.
> I can't see how it contradicts immutability guarantees or D array design.
This *does* prohibit altering the original array ("test" passed by main
below) without deep copying the data, and allows you to alter the fresh
copy ("arr" inside the function).
Example:
import std.stdio;
void foo(const(string)[] arr)
{
// arr[0] = "aa"; // Error: arr[0] isn't mutable
arr.length = 10;
writefln("foo arr.length = %d", arr.length);
}
void main()
{
const(string[]) test = ["a", "b"];
// test[0] = "aa"; // Error: test[0] isn't mutable
// test.length = 10; // Error: variable ****.test cannot modify const
foo(test);
writefln("test.length = %d", test.length);
}
What you have to realise is that when you pass an array/slice in D, you
get a copy of that array/slice in the function. Just like when you pass
an 'int' or any other "value" type.
Think of the array/slice as this struct:
struct array
{
int length;
void *ptr;
}
Passing that to a function would copy the entire struct into the function
parameter, altering that parameter would not alter the original.
array/slices are the same.
The data referred to by 'ptr' is not copied, and neither are the elements
of an array/slice.
If you did want to alter the original, you'd pass the array/slice by
'ref'erence.
R
--
Using Opera's revolutionary email client: http://www.opera.com/mail/
More information about the Digitalmars-d-learn
mailing list