论 VimScript 开发中一个超级大坑

Mar 10, 2014

这两天玩Vim插件开发,其中一个方法是遍历List返回元素为Dictionary(就是咱们常见的Map/Object)相应的值,这不是关键。问题是:在比较item的中的value(String类型)与函数参数(String类型)是否相等的时,陨石坑出现了!

等等,Java开发人员先别喷,Vimer(以及其他语言)没有equals()这等玩意儿,就是==运算符判断,也不是资深Vimer想象的在==?==#这等大小写问题,这个坑容我细细道来,咱们来个简化版足够……

let str1 = 'aaa'
let str2 = string('aaa')

func! Is_equal(str1, str2)
  return str1 == str2 ? 'Equal' : 'Not equal'
endf

let result Is_equal(str1, str2)
echo result

各位看官,你们从我的愤怒中一定能感受到一定是'Not Equal',「大人!此时必有蹊跷!」。可是问题在哪呢?让我们再写一个:

func! Strlen(str)
  echo len(str)
endf

Strlen('aaa')
Strlen(String('aaa'))

我就不卖关子了,前者是3,后者是5,那……究竟是:

echo 'aaa'
" aaa
echo string("aaa")
" 'aaa'

秒懂?因此,以后在 VimScript 中判断字符串,不管是不是已经是字符串了,一定要用:

return string(str1) == string(str2)