On Monday, 7 September 2015 at 10:25:09 UTC, deed wrote:
Right, it's like

int x = 3;
// x + 5;      // Just an expression evaluated to 8,
               // but what do you want to do with it?
               // It won't affect your program and the
               // compiler will give you an error.

int y = x + 5; // But you can assign the expression to
               // a new variable
x = x + 5;     // or you can assign it back
writeln(x);    // or you can pass it to a function.


// For your case:

int[] arr = [1, 2, 3, 2, 1, 4];
arr.sort; // Operating on arr in place -> arr itself is mutated
arr.writeln;       // [1, 1, 2, 2, 3, 4]
arr.uniq; // Not operating on arr, it's like the expression
                   // x + 5 (but no compiler error is given).
arr.uniq.writeln; // [1, 2, 3, 4] (Expression passed to writeln)
arr.writeln;       // [1, 1, 2, 2, 3, 4] (Not affected)

int[] newArr = arr.uniq.array;
// Expression put into a new array assigned to newArr
newArr.writeln;    // [1, 2, 3, 4]
arr.writeln;       // Still the sorted array. [1, 1, 2, 2, 3, 4]
arr = arr.uniq.array; // Now arr is assigned the uniq array
arr.writeln;       // [1, 2, 3, 4]


You need to know whether the function will mutate your array; sort does, while uniq doesn't. If you want to do things requiring mutation, but still want your original data unchanged, you can duplicate the data with .dup before the mutating operations, like this:

int[] data = [1, 2, 2, 1];
int[] uniqData = data.dup.sort.uniq.array;
data.writeln; // [1, 2, 2, 1] Unchanged, a duplicate was sorted.
uniqData.writeln;  // [1, 2]

As an aside, you should use `sort()` instead of the parentheses-less `sort`. The reason for this is that doing `arr.sort` invokes the old builtin array sorting which is terribly slow, whereas `import std.algorithm; arr.sort()` uses the much better sorting algorithm defined in Phobos.

Reply via email to