null和[],它们不应该是一样的吗?

时间:2013-01-19 20:22:23

标签: arrays struct null d

我修改了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[]之间没有区别?我很困惑。

1 个答案:

答案 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) { }失败的地方。