d - 如何在 Dlang 中检查数组或范围长度至少为 N
问题描述
对于 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;
}
解决方案
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
}
推荐阅读
- spring-boot - Spring Boot 读取超时问题(SocketTimeoutException)
- javascript - 循环遍历集合中的所有文档和每个文档中的数组以将数组值与项目匹配
- ios - 来自 swift 应用程序的 HTTP 响应的尾随 Nil
- asp.net - DbContext 依赖注入问题 - System.ObjectDisposedException:无法访问已处置的对象
- dart - 有没有办法从firestore Stream创建一个全局变量
更新自己? - python - 在大熊猫中添加 2262 年之后的时间
- python - 如何从解析的文本中获得查询的答案?
- linux - 是否有“我是谁”和“登录名”的简单替代方法?
- apache-flink - 如何使用 Apache Flink Table API 对整个表进行排序
- json - Neo4j:循环从 Cypher 中的 apoc.load.json 生成的地图