这段代码为什么可以正确执行?
k = "ABC"
print(k.find(k, "B"))
print(string.find(k, "B"))
p = "QWER"
print(k.find(p, "Q"))
print(string.find(p, "Q"))
结果:
2 2
2 2
1 1
1 1
k.find()函数为什么可以正确处理p,理论上k.find()不是错误的使用方法吗?
这段代码为什么可以正确执行?
k = "ABC"
print(k.find(k, "B"))
print(string.find(k, "B"))
p = "QWER"
print(k.find(p, "Q"))
print(string.find(p, "Q"))
结果:
2 2
2 2
1 1
1 1
k.find()函数为什么可以正确处理p,理论上k.find()不是错误的使用方法吗?
在 Lua 编程语言中,函数的语法是用冒号 : 来访问对象的方法,比如 k:find("B")。这种句法实际上就是一个语法糖,等价于调用 k.find(k, "B")。这是由于在 Lua 中,冒号 : 允许你调用一个函数,并将该函数处理为方法,并将左侧的表(此处是字符串对象)自动传递给函数作为第一个参数。
在你的代码中,k.find(k, "B") 在底层实际上相当于 string.find(k, "B")。k.find 实际上引用的是全局的 string.find 方法,因此 k.find(k, "B") 相当于调用 string.find 并将字符串对象 'k' 作为第一个参数传递。
这就是为什么 k.find(p, "Q") 可以正常运行的原因:这个表达式实质上等价于 string.find(p, "Q")。
然而,尽管这样的操作是允许的,但在实际的编程实践中,你仍然应该使用 : 操作符来调用对象的方法,例如 k:find("B") 或者直接使用 string.find(k, "B"),这样的代码比较清晰,也更容易理解,而且可以避免一些不必要的混淆与错误。