2011-05-22 48 views
3

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

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:这也打印真实的,但把其中任何一个条件,你会得到不同的结果

writeln("" == null); 

编辑3:好吧,我明白,我不能测试一个空字符串我做的方式。导致这个问题的是以下情况。我想从一个字删除字符,但不希望存储空字符串:

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

,当我尝试这工作,但一定是因为removechars是返回null,而不是“”

+0

我认为'如果(阵列)'被改写为'如果(array.ptr!= NULL)'和'没有如果( array.length!= 0)'我不确定 – 2011-05-22 22:57:11

回答

5

因为removeChars将返回null时没有字符匹配。

(这是因为一个空字符串的.dup永远是null。)

+0

与我有些相关的问题:'null'数组是否应该与D中的空数组在逻辑上不同? – Mehrdad 2011-05-22 22:05:29

+0

空我的意思是长度为零。 '如果(s)'检查's'是否为'null',那么是的。你可以通过使用'if(s为null)'或'if(s.length == 0)'明确地检查任何一种情况。 – 2011-05-23 00:06:00

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

这个答案对他所问的问题没有任何价值。实际上我甚至不知道这是一个合适的答案。 – 2011-05-23 05:49:26

2

d阵列,或切片,如果你喜欢,很有趣的野兽。

在D中,一个空数组等于null,或者更适合的是一个空数组等于一个空数组,这就是为什么assert(“”== null)或assert([] == null)的原因。但是,如果仅仅使用if(str),你会问这里是否有字符串,而对于null,则不是数组。它相当于一个空数组,但不存在。

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

2

始终使用!是(不是)与null进行比较。如果你想检查一个字符串是否是针对其length属性空管检查:

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 
+0

我认为'null'数组和空数组在D中被等价处理,不是吗? – Mehrdad 2011-05-23 06:57:23

+0

不,他们不相同。 IIRC新闻组有一条长长的话题,关于无内容和无阵列之间的区别是否值得允许,结论是否如此。 – BCS 2011-05-23 15:38:50