2011-05-22 22 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