D2:条件语句中的空字符串

时间:2011-05-22 21:47:00

标签: d

在下面的代码中,为什么2给出输出而不是3? removechars语句返回长度为0的字符串

import std.stdio, std.string;

void main() {
    string str = null;
    if (str) writeln(1); // no

    str = "";
    if (str) writeln(2); // yes

    if (",&%$".removechars(r"^a-z"))  writeln(3); // no
}

编辑:好的,它可能会返回null,但我仍然有点疑惑,因为所有这些打印都是真的

writeln(",&%$".removechars(r"^a-z") == "");
writeln(",&%$".removechars(r"^a-z") == null);
writeln(",&%$".removechars(r"^a-z").length == 0);

编辑2:这也打印为true,但是将它们中的任何一个置于条件中并获得不同的结果

writeln("" == null);

编辑3:好吧,我明白我不能像我那样测试空字符串。导致这个问题的原因是以下情况。我想从单词中删除字符,但不想存储空字符串:

if (auto w = word.removechars(r"^a-z"))
    wordcount[w]++;

当我尝试它时,这是有效的,但这必须是因为removechars返回null而不是“”

4 个答案:

答案 0 :(得分:5)

由于removeChars在没有字符匹配时会返回null

(这是因为空字符串的.dup始终为null。)

答案 1 :(得分:2)

如果您愿意,D阵列或切片是有趣的野兽。

在D中,空数组等于null,或者更恰当地说空数组等于空数组,这就是assert(“”== null)或assert([] == null)的原因。但是,当只使用if(str)时,你会询问这里是否有字符串,而对于null,则没有数组。它相当于一个空数组,但不存在。

检查某些内容是否为null的正确方法:assert(str为null)。我不确定哪个最适合将字符串转换为bool,但实际上没有一个完美的解决方案,因为string不是布尔值。

答案 2 :(得分:2)

始终使用并且(不是)与null进行比较。如果要检查字符串是否为空,请检查其长度属性:

string str;
assert(str is null);    // str is null
assert(!str);           // str is null

str = "";
assert(str !is null);   // no longer null
assert(str);            // no longer null

assert(!str.length);    // but it's zero length

答案 3 :(得分:0)

if(!str.length) { 
//dosomething ... 
}