On Sunday, 3 December 2023 at 18:56:32 UTC, Johannes Miesenhardt wrote:
On Sunday, 3 December 2023 at 14:51:37 UTC, Siarhei Siamashka wrote:
[...]

Thanks, this is super helpful. I have one other question, in the solution you posted and also the one I posted in the discord today. I was required to use byLineCopy. I first used byLine but I for some reason that I can't really explain only got the last line from that. I switched to byLineCopy because I saw it in other peoples solution and that magically fixed all problems I had. What exactly happened here?

It's very important to know how slices and garbage collector work together in D language. In particular, the results produced by the following code may look surprising to beginners:

```D
import std;

void f1(ref int[] x) {
  x[0] += 1;
  x    ~= [9, 9, 9, 9, 9, 9];
  x[0] -= 1;
}

void f2(int[] x) {
  x[0] += 1;
  x    ~= [9, 9, 9, 9, 9, 9];
  x[0] -= 1;
}

void main() {
  int[] a = [1, 2, 3, 4];
  writefln!"original:       %s"(a); // [1, 2, 3, 4]
  f1(a);
writefln!"after f1: %s"(a); // [1, 2, 3, 4, 9, 9, 9, 9, 9, 9]
  f2(a);
writefln!"after f2: %s"(a); // [2, 2, 3, 4, 9, 9, 9, 9, 9, 9]
  f2(a);
writefln!"after f2 again: %s"(a); // [3, 2, 3, 4, 9, 9, 9, 9, 9, 9]
  a.reserve(100);
writefln!"reserved extra capacity to allow doing resize in-place";
  f2(a);
writefln!"after f2 again: %s"(a); // [3, 2, 3, 4, 9, 9, 9, 9, 9, 9]
}

```

Coming from the other programming languages, people are usually familiar with the concept of passing function arguments either by value or by reference. And the behavior of the `f2` function may seem odd in the example above. It never changes the size of the original array, but may modify its data in unexpected ways contrary to naive expectations. There's a detailed article on this topic, where all the necessary answers can be found: https://dlang.org/articles/d-array-article.html

Many functions in D language have their pairs/siblings. The potentially wasteful `.byLineCopy` has its potentially destructive sibling `.byLine`. There are also `.split`/`.splitter` or `.retro`/`.reverse` pairs with their own subtle, but important differences. The beginners may prefer to start with the less efficient, but easier to use variants with no undesirable side effects.

Reply via email to