我对定义/调用 Lua 函数时使用的冒号表示法感到非常困惑。
我觉得我已经理解了它,直到我看到了这段代码:
function string.PatternSafe( str )
return ( str:gsub( ".", pattern_escape_replacements ) );
end
function string.Trim( s, char )
if char then char = char:PatternSafe() else char = "%s" end
return string.match( s, "^" .. char .. "*(.-)" .. char .. "*$" ) or s
end
让我困惑的是string.PatternSafe()在任何地方都没有引用'self',但是代码似乎能够正常工作。
我也看到一些脚本在定义函数时使用冒号符号,例如:
function foo:bar( param1 ) ... end
经过几个小时的谷歌搜索,我仍然无法弄清楚在这两种情况下到底发生了什么。 我目前的假设如下:
- 如果使用冒号符号定义一个函数,则会插入一个不可见的“self”参数作为第一个参数。
- 如果使用冒号符号调用函数,则在冒号之前的对象被插入到参数中(因此成为函数的第一个参数)。
- 如果使用点符号调用函数,则即使使用冒号符号进行定义,它也不会将对象插入为第一个参数/参数。
如果我的假设是正确的,那就引出了另一个问题:如何确保函数被正确调用?