как проверить, чтобы длина массива или диапазона была как минимум N в Dlang - PullRequest
1 голос
/ 03 апреля 2019

Для N = 1 я бы использовал std.array : empty, чтобы проверить, что длина по крайней мере N, и избежать необходимости проходить через весь ввод.

Для N> 1 (или всех N), каков идиоматический способ в языке D?

Я пытался использовать std.range : take, который «Lazily принимает только до n элементов диапазона». Он работает для массивов, но не для диапазонов (если, конечно, я не превращаю поддиапазон в массив):

#!/usr/bin/env rdmd

module test_ranges;

void main()
{
    import std.container.dlist : DList;
    assert(lengthAtLeast([1, 2, 3], 2) == true);

    // assert(lengthAtLeast(DList!int(1, 2, 3)[], 2) == true);
    /*
test_ranges.d(64): Error: no property length for type Take!(Range)
test_ranges.d(10): Error: template instance `test_ranges.lengthAtLeast!(Range)` error instantiating
Failed: ["/usr/bin/dmd", "-v", "-o-", "test_ranges.d", "-I."]
    */
}

bool lengthAtLeast(R)(R input, size_t n)
{
    import std.range : take;

    return input.take(n).length == n;

    // this makes it work for arrays and ranges alike, but is not nice, is it?
    // import std.array : array;
    // return input.take(n).array.length == n;
}

1 Ответ

1 голос
/ 03 апреля 2019

walkLength делает то, что вы хотите:

bool lengthAtLeast(R)(R input, size_t n)
{
    import std.range.primitives : walkLength;
    return input.walkLength(n) >= n; // walks upTo n or returns the length if known
}
...