strings provide opportunities for optimization. For example, std.string.leftJustify() returns

- either a slice of the entire input string when the field is shorter than the string (this is an optimization)

- or a new string when the field is larger than the string

The following program demonstrates this behavior:

import std.string;
import std.array;

void main()
{
    {
        dchar[] input;
        input ~= "hello";

        auto result = leftJustify(input, 3);
        result.front = 'X';
        assert(input.front == 'X');    // <-- input is modified
    }

    {
        dchar[] input;
        input ~= "hello";

        auto result = leftJustify(input, 6);  // note: now 6, not 3
        result.front = 'X';
        assert(input.front == 'h');    // <-- input is NOT modified
    }
}

The issue is whether the caller can be sure about the uniqueness of the returned data. Of course the behavior can be documented and the user can check the length before calling:

    auto result = (s.length > width) ? s.dup : leftJustify(s, width);

Now the user knows that 'result' is always a copy.

[A side question is whether leftJustify() should throw when the field width is shorter than the string. I wouldn't object that behavior. Exceptions are great: they remove difficult questions. :)]

Of course this is not a criticism of leftJustify(). I face such decisions frequently myself. I am curious about what you think about functions that *may* return unique data.

Is that a problem for you? Have you developed guidelines to deal with it?

Thank you,
Ali

Reply via email to