在Vim中评估字符串真实性的最常见方法

mfuanj7w  于 2024-01-08  发布在  其他
关注(0)|答案(2)|浏览(219)

在python中,为了判断一个字符串是否为非空,我会这样做:

  1. if STRING_VAR:
  2. ...

字符串
然而,在Vim中,当直接使用字符串时,字符串并不真正给出给予真实值。有没有建议的方法来评估字符串的真实性?通常我会使用以下两种方法之一:

  1. if (STRING_VAR != "")
  2. ...


或者:

  1. if (len(STRING_VAR) != 0)
  2. ...


建议/最干净的方法是什么?

2o7dmzc5

2o7dmzc51#

然而,在Vim中,当直接使用字符串时,字符串并不真正给予给予真正的真值。
如果编程是一种宗教,那么Python主义者将成为狂热者;-)比如说,对于C程序员来说,真实的真理是一个数字,而对于程序集来说,它是完全不可寻址的,字符串根本不存在。那么你怎么能说“真实的真理”呢?
VimScript部分模仿C和AWK。特别是,:if只接受数字值(零为假,非零为真),包括那些“可转换”为数字的值,例如. String。然而,字符串到数字的转换就像:h str2nr()一样。所以:if "hello world"是法律的,但为假。
所以你可能会想要:if empty(var)
但是请注意,:h empty()接受任何Vim类型。通常这是相当不错的,但在一些罕见的情况下,你更喜欢:if len(var):if strlen(var)
:h len():h strlen()的区别在于strlen()接受String,而len()也接受Lists和Dictionaries。
仍然要注意:echo strlen(0)1,因为无论如何数字都会自动转换为String。所以如果你想同时检查1)foo的类型为String,2)foo为空,那么你必须写:if foo is# ''

l7mqbcuq

l7mqbcuq2#

!empty(STRING_VAR) *
我还没有看过Vim是如何比较字符串的,但是记住Vim是用C语言编写的,那么如果它的方式与

  1. int string_compare(const char *s1, const char *s2)
  2. {
  3. while (*s1 && (*s1 == *s2)) {
  4. ++s1;
  5. ++s2;
  6. }
  7. return *s1 == *s2;
  8. }

字符串
那么STRING_VAR != ""肯定优于len(STRING_VAR) != 0
算法的时间复杂度为O(n),时间复杂度为O(1)。

另一方面,如果Vim中的字符串由结构表示,例如

  1. struct string {
  2. char str[1000];
  3. int len;
  4. };


那么len(STRING_VAR) != 0将只是简单的整数比较(var.len != 0)。
实际上,len(STRING_VAR)就足够了。

  • 因为我们可以信任Bram,他以最有效的方式实现了empty()

在Vim中,与Python一样,if不需要括号

展开查看全部

相关问题