在下面的代码中,为什么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而不是“”
答案 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 ...
}