在python中,为了判断一个字符串是否为非空,我会这样做:
if STRING_VAR: ...
if STRING_VAR:
...
字符串然而,在Vim中,当直接使用字符串时,字符串并不真正给出给予真实值。有没有建议的方法来评估字符串的真实性?通常我会使用以下两种方法之一:
if (STRING_VAR != "") ...
if (STRING_VAR != "")
型或者:
if (len(STRING_VAR) != 0) ...
if (len(STRING_VAR) != 0)
型建议/最干净的方法是什么?
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# ''
:if
:h str2nr()
:if "hello world"
:if empty(var)
:h empty()
:if len(var)
:if strlen(var)
:h len()
:h strlen()
strlen()
len()
:echo strlen(0)
1
foo
:if foo is# ''
l7mqbcuq2#
!empty(STRING_VAR) *我还没有看过Vim是如何比较字符串的,但是记住Vim是用C语言编写的,那么如果它的方式与
!empty(STRING_VAR)
int string_compare(const char *s1, const char *s2){ while (*s1 && (*s1 == *s2)) { ++s1; ++s2; } return *s1 == *s2;}
int string_compare(const char *s1, const char *s2)
{
while (*s1 && (*s1 == *s2)) {
++s1;
++s2;
}
return *s1 == *s2;
字符串那么STRING_VAR != ""肯定优于len(STRING_VAR) != 0算法的时间复杂度为O(n),时间复杂度为O(1)。
STRING_VAR != ""
len(STRING_VAR) != 0
另一方面,如果Vim中的字符串由结构表示,例如
struct string { char str[1000]; int len;};
struct string {
char str[1000];
int len;
};
型那么len(STRING_VAR) != 0将只是简单的整数比较(var.len != 0)。实际上,len(STRING_VAR)就足够了。
var.len != 0
len(STRING_VAR)
empty()
在Vim中,与Python一样,if不需要括号
if
2条答案
按热度按时间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# ''
l7mqbcuq2#
!empty(STRING_VAR)
*我还没有看过Vim是如何比较字符串的,但是记住Vim是用C语言编写的,那么如果它的方式与
字符串
那么
STRING_VAR != ""
肯定优于len(STRING_VAR) != 0
算法的时间复杂度为O(n),时间复杂度为O(1)。
另一方面,如果Vim中的字符串由结构表示,例如
型
那么
len(STRING_VAR) != 0
将只是简单的整数比较(var.len != 0
)。实际上,
len(STRING_VAR)
就足够了。empty()
在Vim中,与Python一样,
if
不需要括号