我修改了std.array.array
,以便它始终在编译时工作,它看起来像这样:
ForeachType!Range[] array(Range)(Range r)
if (isIterable!Range && !isNarrowString!Range)
{
auto a = appender!(ForeachType!Range[])();
foreach (e; r)
{
a.put(e);
}
return a.data;
}
用法:
struct Type
{
int[] xs;
this(int[] r) { this.xs = r.array; }
}
enum Type t1 = Type([]);
static if (t1.xs.length) { } // Error: expression null.length is not constant
根据我的理解,当r
为空范围时,array()
会返回null
。在这方面,null
和空数组之间应该存在差异吗?
用return a.data;
替换array()
中的return a.data.length ? a.data : [];
确实可以解决问题,所以我认为存在差异?
事情是,这只发生在构造函数中。以下内容不会产生错误:
enum int[] t1 = iota(0,0).array;
static if (t1.length) { }
所以我认为null
和[]
之间没有区别?我很困惑。
答案 0 :(得分:4)
[]
比较等于null
。 [] == null
和[] is null
都是true
。对于单位化数组或使用null
初始化的数组也是如此。
但是,空数组 总是null
。例如:
int[] a;
assert(a is null);
a = new int[2];
a = a[0..0];
assert(a !is null);
参见 D编程语言,p。 95。
修改强>
鉴于编译时.length
似乎出现故障这一事实,我建议使用std.array.empty
进行检查,这应该比null
比较更可靠。在DMD 2.061上,static if (!t1.xs.empty) { }
适用于static if (t1.xs.length) { }
失败的地方。