Это ошибка в оценке строковых выражений Vim? - PullRequest
3 голосов
/ 23 мая 2011

Я отлаживал проблему с плагином, работающим в Vim73 в Arch Linux, и, похоже, он произошел из-за ошибки в оценке строкового выражения.

В этой установке Vim выражение 'xxx' > '' оценивается как 0 (false), тогда как во всех других Vims, которые я видел, выражение оценивает (как и должно быть) в 1 (true).

Кто-нибудь знает объяснение этому?Arch Linux Vim не был скомпилирован с большим количеством встроенных функций, но действительно ли может быть какая-то функция, которая изменяет оценку строковых выражений?

Есть ли какая-то настройка Vim (кодировка?), Которая могла бы изменить результатиз этого сравнения строк?Это была простая установка Vim (ничего особенного в vimrc), которая дала плохой результат, нигде не видела, что параметр можно было бы изменить, даже если есть некоторые параметры, влияющие на этот результат.

Спасибодля любой информации.

ОБНОВЛЕНИЕ: Оказывается, эта проблема была вызвана ошибкой в ​​функции сравнения строк в последней версии 64-битного Vim, когда установлен флаг Vim 'ignorecase',Непустая строка должна быть больше пустой строки независимо от того, игнорируется ли регистр, но Vim возвращал false.Отчет об ошибке здесь: http://groups.google.com/group/vim_dev/browse_thread/thread/313bc7c46a19cd40

В качестве обходного пути можно было бы: (1) использовать оператор сравнения, который принудительно сравнивает регистр соответствия, например, mystring_var ># '' или (2) использовать !empty(mystring_var).

1 Ответ

1 голос
/ 23 мая 2011

Чтобы узнать ответ на этот вопрос, вы должны взглянуть на документацию.Вот цитата из секции *41.4* Conditionals:

Логические операторы работают как для чисел, так и для строк.При сравнении двух строк используется математическая разница.При этом сравниваются значения байтов, что может быть неправильно для некоторых языков.

При сравнении строки с числом строка сначала преобразуется в число.Это немного сложно, потому что когда строка не похожа на число, используется ноль.Пример:

:if 0 == "one"
:  echo "yes"
:endif

Это будет повторять "да", потому что "один" не похож на число, поэтому он преобразуется в число ноль.

Очевидно,vim не гарантирует результат операции, которую вы пытаетесь выполнить, и вам не следует полагаться на нее.Если вы хотите сравнить длину строк, взгляните на *strlen()*.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...