On Saturday, 1 August 2015 at 09:35:53 UTC, DLearner wrote:
Does the D language set in stone that the first element of an array _has_ to be index zero? Wouldn't starting array elements at one avoid the common 'off-by-one' logic error, it does
seem more natural to begin a count at 1.

I, too, don't think this is a good idea in general, but I can see a few use-cases where 1-based indices may be more natural. It's easy to define a wrapper:

    struct OneBasedArray(T) {
        T[] _payload;

        alias _payload this;

        T opIndex(size_t index) {
            assert(index > 0);
            return _payload[index-1];
        }

void opIndexAssign(U : T)(size_t index, auto ref U value) {
            assert(index > 0);
            _payload[index-1] = value;
        }
    }

    unittest {
        OneBasedArray!int arr;
        arr = [1,2,3];
        arr ~= 4;
        assert(arr.length == 4);
        assert(arr[1] == 1);
        assert(arr[2] == 2);
        assert(arr[3] == 3);
        assert(arr[4] == 4);
    }

Test with:

    rdmd -main -unittest xx.d

This can of course be easily extended to support other bases than one.

Reply via email to