在学习Lua中看到了这样的代码,很好奇为什么可以正确执行
string = "Lua Tutorial"
-- 查找字符串
print(string.find(string,"Tutorial"))
reversedString = string.reverse(string)
print("新字符串为",reversedString)
在这段代码中创建了全局变量string,和string函数库重名了,为什么还可以正确使用string.find函数呢?
在学习Lua中看到了这样的代码,很好奇为什么可以正确执行
string = "Lua Tutorial"
-- 查找字符串
print(string.find(string,"Tutorial"))
reversedString = string.reverse(string)
print("新字符串为",reversedString)
在这段代码中创建了全局变量string,和string函数库重名了,为什么还可以正确使用string.find函数呢?
关注在 Lua 中,函数和变量都是存在于自己的命名空间中的。当你使用“.”操作符来访问某个库或table内的函数时,Lua 解释器会首先在相应的库或table里寻找你指定的函数或变量,而不是在全局命名空间里(也就是_G表)寻找。
在你的程序中,当你这样写:
print(string.find(string,"Tutorial"))
Lua 解释器会首先在内置的 string 库中寻找一个名为 find 的函数,然后应用这个函数到你提供的参数上。
然后,当你写:
string = "Lua Tutorial"
Lua 解释器就会在全局命名空间里创建一个新的变量,并把 "Lua Tutorial" 赋值给这个变量。
所以,尽管这两个变量名字都是 string,但它们存在于不同的命名空间中,并不会相互干扰。
不过必须注意,这种命名方式很容易导致混淆,不推荐在实际的编程实践中使用。尽量避免使用内置库或函数名称作为你自己的变量名称。如果变量和内置库重名,虽然不会影响访问库内的函数,但是你将无法直接访问此库本身,除非你在改变变量之前存储一个库的引用。