在 lua 中实现函数的重载。注:好吧,lua中原来可以实现重载...
local function create()

	local arg_table = {}
local function dispatcher (...)
local tbl = arg_table
local n = select ("#",...)
local last_match
for i = 1,n do
local t = type(select(i,...))
local n = tbl[t]
last_match = tbl["..."] or last_match
if not n then
return last_match (...)
end
tbl = n
end
return (tbl["__end"] or tbl["..."])(...)
end
local function register(desc,func)
local tbl = arg_table
for _,v in ipairs(desc) do
if v=="..." then
assert(not tbl["..."])
tbl["..."] = func
return
end
 
local n = tbl[v]
if not n then
n = {}
tbl[v]=n
end
tbl = n
end
tbl["__end"] = func
end
return dispatcher, register, arg_table
end
 
local all={}
local function register(env,desc,name)
local func = desc[#desc]
assert(type(func)=="function")
desc[#desc] = nil
 
local func_table
if all[env] then
func_table = all[env]
else
func_table = {}
all[env] = func_table
end
 
if env[name] then
assert(func_table[name])
else
env[name],func_table[name] = create()
end
 
func_table[name](desc,func)
end
 
define = setmetatable({},{
__index = function (t,k)
local function reg (desc)
register(getfenv(2),desc,k)
end
t[k] = reg
return reg
end
})

下面试一下:
define.test {

	"number",
function(n)
print("number",n)
end
}
 
define.test {
"string",
"number",
function(s,n)
print("string number",s,n)
end
}
 
define.test {
"number",
"...",
function(n,...)
print("number ...",n,...)
end
}
 
define.test {
"...",
function(...)
print("default",...)
end
}
 
test(1)
test("hello",2)
test("hello","world")
test(1,"hello")

输出:
  number 1

string number   hello   2
default hello world
number ... 1 hello
备注摘自:云风个人控件-----http://blog.codingnow.com/cloud/LuaFunctionOverload

在 lua 中实现函数的重载的更多相关文章

  1. Lua中的函数

    [前言] Lua中的函数和C++中的函数的含义是一致的,Lua中的函数格式如下: function MyFunc(param) -- Do something end 在调用函数时,也需要将对应的参数 ...

  2. c++继承关系中成员函数的重载、重写、重定义之间的区别

    1.Override.Overload.Redefine Overload 重载只能发生在类内部,不能发生在子类和父类的继承中.具体来说,如果子类中有父类同名.同返回值类型,但是不同参数列表,这两个在 ...

  3. Lua中assert( )函数的使用

    当Lua遇到不期望的情况时就会抛出错误,比如:两个非数字进行相加:调用一个非函数的变量:访问表中不存在的值等.你也可以通过调用error函数显示的抛出错误,error的参数是要抛出的错误信息. ass ...

  4. Lua中调用函数使用点号和冒号的区别

    1.初学者最易混乱Top1——调用函数时用点号还是用冒号? 我们来看看下面的两句代码: mSprite.setPosition(, ); mSprite:setPosition(, ); 对于初次接触 ...

  5. C调用Lua中的函数解析table

    Passing Tables to Lua Functions A use case that happens often is the passing of tables to and from L ...

  6. 两个函数彻底理解Lua中的闭包

    本文通过两个函数彻底搞懂Lua中的闭包,相信看完这两个函数,应该能理解什么是Lua闭包.废话不多说,上 code: --[[************************************** ...

  7. Lua中的常用语句结构以及函数

     1.Lua中的常用语句结构介绍 --if 语句结构,如下实例: gTable = {} ] ] then ]) == gTable[] then ]) else print("unkown ...

  8. Lua中的元表与元方法

    [前言] 元表对应的英文是metatable,元方法是metamethod.我们都知道,在C++中,两个类是无法直接相加的,但是,如果你重载了“+”符号,就可以进行类的加法运算.在Lua中也有这个道理 ...

  9. Lua中的元表与元方法学习总结

    前言 元表对应的英文是metatable,元方法是metamethod.我们都知道,在C++中,两个类是无法直接相加的,但是,如果你重载了"+"符号,就可以进行类的加法运算.在Lu ...

随机推荐

  1. myeclipse 10打开status.xml 卡死

    myeclipse里面的struts.xml的插件格式和要打开的文件格式不一样. 右键struts.xml   >    Open With  >  MyEclipse XML Edito ...

  2. python语言特性及其数据类型

  3. Spring 学习笔记 4. 尚硅谷_佟刚_Spring_属性配置细节

    1,字面值 •字面值:可用字符串表示的值,可以通过 <value> 元素标签或 value 属性进行注入. •基本数据类型及其封装类.String 等类型都可以采取字面值注入的方式 •若字 ...

  4. Spring 配置 Spring JPA 发生错误的解决方法

    今天在项目的applicationContext.xml中配JPA时 <?xml version="1.0" encoding="UTF-8"?> ...

  5. 《python核心编程》笔记——杂项

    python语句默认会给每一行添加一个换行符,只要在最后加一个逗号就能改变这种行为 若函数里没有return就自动返回None对象 PEP(python增强提案简称)http://python.org ...

  6. Font Awesome图标库

    Font Awesome 是一个非常方便的图标库.这些图标都是矢量图形,被保存在 .svg 的文件格式中.这些图标就和字体一样,你可以通过像素单位指定它们的大小,它们将会继承其父HTML元素的字体大小 ...

  7. Core Audio(二)

    用户模式音频组件 在windows vista中,core audio apis充当用户模式音频子系统的基础,core audio apis作为用户模式系统组件的一个thin layer,它用来将用户 ...

  8. Cocoapods的安装,卸载和使用

    [一]Cocoapods的安装 (1)Cocoapods的官方网站为: https://cocoapods.org/ .如果你的电脑已经安装了Ruby开发环境,那么在终端(Terminal)中使用以下 ...

  9. javadoc错误: 编码gbk的不可映射字符

    在使用Eclipse进行javadoc的导出时,提示“编码 GBK 的不可映射字符”,应该就是中文注释Eclipse不认,需要在调用javadoc.exe的时候传递编码集告诉它采用什么编码去生成jav ...

  10. Eclipse配置tomcat后,启动tomcat,访问tomcat报404错误

    当你在Eclipse中新建一个工程,配置好tomcat,然后测试tomcat是否配置成功的时候,报404错误异常. 解决方法: 1,把工程文件删除,重新建立一个新的工程, 2,新建一个工程. 3,Ne ...