D2: пустая строка в условном выражении - PullRequest
3 голосов
/ 23 мая 2011

В следующем коде почему 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
}

Редактировать: Хорошо, он может вернуть ноль, но я все еще немного озадачен, потому что все эти печати верны

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 возвращает ноль, а не ""

Ответы [ 4 ]

5 голосов
/ 23 мая 2011

Потому что removeChars вернет null, если ни один символ не соответствует.

(Это происходит потому, что .dup пустой строки всегда будет null.)

2 голосов
/ 23 мая 2011

Всегда используйте для и ! Для (не) для сравнения с нулем.Если вы хотите проверить, является ли строка пустой, проверьте ее свойство 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
2 голосов
/ 23 мая 2011

D массивы, или кусочки, если вы предпочитаете, являются интересными животными.

В D пустой массив равен нулю или, точнее, пустой массив равен пустому массиву, поэтому assert ("" == null) или assert ([] == null). Однако при использовании просто if (str) вы спрашиваете, есть ли здесь строка, а для null нет массива. Это эквивалентно пустому массиву, но он не существует.

Правильный способ проверить, имеет ли что-либо значение null: assert (str - null). Я не уверен, что лучше всего преобразовывать строку в логическое, но на самом деле не может быть идеального решения, потому что строка не является логическим значением.

0 голосов
/ 23 мая 2011
if(!str.length) { 
//dosomething ... 
}
...