On 4/12/22 21:34, Salih Dincer wrote:

> I tried the following and I didn't understand one thing: Why is there no
> need to use dup when slicing?

I don't think I understand you fully.

> ```d
> struct S(T) {
>   T fileName;
>
>    this(T fileName) {
>      this.fileName = fileName;
>      report();
>    }
>
>    ~this() { report(); }
>
>    void report(string func = __FUNCTION__) {
>      import std.stdio;
>      writefln!"%s\nworking with %s"(func, fileName);
>    }
> }
> alias T1 = const(char)[];
> alias T2 = const char[];
> alias T3 = const(char[]); // T3 == T2
> alias T4 = immutable char[]; // Not compiling!
>
>
> void main() {
>    auto fileName = "foo.txt".dup;

In every test case that 'fileName' is char[].

>    auto s = S!T1(fileName);
>    fileName[0..3] = "bar";

For that reason, that expression will always succeed. And that's the point I tried to make: Without immutable, struct S *must* make a copy in order to guarantee that its member will remain the same.

> }/* Results:

[...]

>    *
>    *T4
>    *
>    Error: slice `fileName[0..3]` is not mutable

Your code was different because I get an error that I expect: The following line fails.

  auto s = S!T4(fileName);

cannot pass argument `fileName` of type `char[]` to parameter `immutable(string) fileName`

Exactly! struct S wants immutable (to guarantee that nobody will mutate it) but 'fileName' in main is not immutable. You can make it pass in the T4 case

a) by making an immutable copy with .idup:

  auto s = S!T4(fileName.idup);

b) by converting 'fileName' to immutable without a copy:

  import std.exception;
  auto s = S!T4(fileName.assumeUnique);
  // But then, the following will fail. Awesome!
  // fileName[0..3] = "bar";

I am amazed everyday how great D is; such a fun engineering tool!

Ali

Reply via email to