在 lua 中实现函数的重载
在 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 中实现函数的重载的更多相关文章
- Lua中的函数
[前言] Lua中的函数和C++中的函数的含义是一致的,Lua中的函数格式如下: function MyFunc(param) -- Do something end 在调用函数时,也需要将对应的参数 ...
- c++继承关系中成员函数的重载、重写、重定义之间的区别
1.Override.Overload.Redefine Overload 重载只能发生在类内部,不能发生在子类和父类的继承中.具体来说,如果子类中有父类同名.同返回值类型,但是不同参数列表,这两个在 ...
- Lua中assert( )函数的使用
当Lua遇到不期望的情况时就会抛出错误,比如:两个非数字进行相加:调用一个非函数的变量:访问表中不存在的值等.你也可以通过调用error函数显示的抛出错误,error的参数是要抛出的错误信息. ass ...
- Lua中调用函数使用点号和冒号的区别
1.初学者最易混乱Top1——调用函数时用点号还是用冒号? 我们来看看下面的两句代码: mSprite.setPosition(, ); mSprite:setPosition(, ); 对于初次接触 ...
- C调用Lua中的函数解析table
Passing Tables to Lua Functions A use case that happens often is the passing of tables to and from L ...
- 两个函数彻底理解Lua中的闭包
本文通过两个函数彻底搞懂Lua中的闭包,相信看完这两个函数,应该能理解什么是Lua闭包.废话不多说,上 code: --[[************************************** ...
- Lua中的常用语句结构以及函数
1.Lua中的常用语句结构介绍 --if 语句结构,如下实例: gTable = {} ] ] then ]) == gTable[] then ]) else print("unkown ...
- Lua中的元表与元方法
[前言] 元表对应的英文是metatable,元方法是metamethod.我们都知道,在C++中,两个类是无法直接相加的,但是,如果你重载了“+”符号,就可以进行类的加法运算.在Lua中也有这个道理 ...
- Lua中的元表与元方法学习总结
前言 元表对应的英文是metatable,元方法是metamethod.我们都知道,在C++中,两个类是无法直接相加的,但是,如果你重载了"+"符号,就可以进行类的加法运算.在Lu ...
随机推荐
- C# onverride、abstract、vitrtual、new、sealed
abstract: 抽象方法是隐式的虚方法 在抽象方法声明中,不能使用static或者virtual修饰符 override: override关键字提供派生类对基类方法的新的实现,重写的基类方法必须 ...
- oracle 小题
create table student(sno varchar2(10) primary key,sname varchar2(20),sage number(2),ssex varchar2(5) ...
- Spring 学习笔记 8. 尚硅谷_佟刚_Spring_使用外部属性文件
1,配置数据源 (1)添加驱动 (2)编写spring配置文件 <bean id="dataSource" class="org.springframework.j ...
- oracle官方文档12c对应关系
ADDCI Oracle® Database Data Cartridge Developer's Guide 12c Release 1 (12.1) E15882-05 ADFNS Oracle® ...
- TCL:使用、添加库文件
>直接引用工具自带的库文件 通过指令: .1查看能直接调用的库文件路径 #可以查到工具默认库文件路径,一般包括回显中的路径以及回显中路径的父路径. info library #D:/Script ...
- Create Oracle Enterprise Manager repository data after restore a database from another server
1. Set password for SYS in password file: orapwd file=$ORACLE_HOME/dbs/orapw<ORACLE_SID> 2. Dr ...
- maven环境终于可以了
说说maven可以后小小的体会吧,虽然还没有用maven运行过工程,体会是pom.xml中的dependency属性可以帮助管理项目中的jar包,只要在这里配置下需要的jar包,保存后就会自动从中央仓 ...
- react-router+webpack+gulp路由实例
背景:新项目要开始了,有一种想要在新项目中使用react的冲动,应该也是一个单页面的应用,单页应用就涉及到一个路由的问题.于是最近在网上找了蛮多关于react-router的文章,也遇到了许多的坑,经 ...
- LAMP自定义编译安装
httpd 2.4.4 + mysql-5.5.28 + php-5.4.13编译安装过程: 一.编译安装apache 1.解决依赖关系 httpd-2.4.4需要较新版本的apr和apr-util, ...
- Linux(centeros)下安装jdk
首先需要说明的是有的Linux系统自带jdk,这个jdk是openjdk,可以通过java-version查看 所以安装的步骤是,首先删除系统自带的(如果有)openjdk 1. rpm -qa | ...