在 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. The Factory pattern

    public class Factory { public static void main(String[] args) {//Client IFruit fruit=Factorytemp.get ...

  2. [转]pycharm的一些快捷键

    忙了好一阵终于忙完了,最近在重构代码,有许多地方要注释什么的,在多行注释时总是很麻烦,就想着pycharm有没有快捷键,就像visual studio一样.于是上Google搜一下PyCharm De ...

  3. Jade之Plain Text

    Plain Text jade提供了3种得到纯文本的方法. Piped Text 添加纯文本的一个最简单的方法就是在文本最前面加|符号即可. jade: p | It must always be o ...

  4. SqlServer自动化分区

    1.新增文件组 ALTER DATABASE [Test] ADD FILEGROUP FG2010 ALTER DATABASE [Test] ADD FILEGROUP FG2011 ALTER ...

  5. DOM 事件

    1.注册事件 // 事件处理函数 function handleMouseOver(event) { // process ...... } p.addEventListener("mous ...

  6. AngularJS是什么

    先标明来源: https://code.angularjs.org/1.3.15/docs/guide/introduction 也就是官网针对1.3.15版的说明 What Is Angular? ...

  7. Java多线程理解

    首先说一下进程和线程的区别 进程:是计算机运用程序实例,拥有独立的内存空间和数据(猜测内存堆应该是作用的进程上),一个进程包含多个子线程,不同进程相互独立: 线程:cpu执行的基本单位,拥有独立的寄存 ...

  8. 最新Ubuntu10.10 更新源

    Ubuntu10.10这个版本真的很老了,官方N多年前早已不再支持更新软件源了. 目前可用的有中科大镜像更新源. 中科大Ubuntu 10.10源列表: deb http://mirrors.ustc ...

  9. sql server 基础语句

    创建数据库 创建之前判断该数据库是否存在 if exists (select * from sysdatabases where name='databaseName') drop database ...

  10. Python成长笔记 - 基础篇 (六)python模块

    本节大纲: 模块介绍 time &datetime模块 random os sys shutil json & picle shelve xml处理 yaml处理 configpars ...