[Lua]表驱动索引编程,form.lua
form.interface
local form = {_tag = 'form'}
function form.build(tag, super)
--[[
-- form to produce the target with super functional table and integrating multi-interface implement feature
-- produce a target and hold following feature
target:spec(interface) -- integrating the interface feature
target:spec(name, property) -- property holder
target:on(other) -- binding feature to other target and produce a delegater
--]]end function form.on(target, spec)
--[[
-- produce a delegater binding target feature with itself from spec, that the feature defined in spec
--]]end function form.spec(target)
--[[
--attach a form feature to the target --if target builded from `form.build`
function target:spec(interface)
-- specify target reuse interface code
end
--following feature is flexible
function target:spec(prop, target)
-- specify target property initial value and produce getter/setter
-- example
-- target:spec('prop', property)
-- target:prop() return the property
-- target:prop(property) to set the property
-- target:spec('feature', interface)
-- target:spec('feature') return the interface delegater binding on the target
end -- if target is a interface implementation of a certain specification
local spec = target
function spec:on(target)
-- produce the interface delegater binding on the target from spec
end
--]]end
查看实现代码:form.lua
form.test
local form = require('form')
-- 接口定义
local spec = {_tag = 'sepc'}
function spec:Show(msg)
print(self._tag..':Show(msg) not implemented')
end
function spec:Dependence(target)
print(self._tag..':Dependence(target) not implemented')
end
function spec:noImplementation()
print(self._tag..':noImplementation() not implemented')
end
-- 接口实现
local port = form.build('spec', spec)
print('\nport ###test start---------------------------')
port:Show()
port:Dependence()
port:noImplementation()
function port:Show(msg)
print('port:Show(msg)...')
print(msg)
end
print('\noverwrite port:Show(msg)--------------------')
port:Show('port:Show using spec.Show') function port:Dependence(target)
print('port:Dependence(target)...')
target.Show('DI, Dependence Input; implementation binded on '..target._tag..' from port')
end
print('\nport ###test over---------------------------') -- 派生复用
local target
= form.build('target'--[[, port]]) -- 可从#super 派生复用
:spec(port)-- 可指定接口形式复用 print('\ntarget ###test start---------------------------')
target:noImplementation() -- spec:noImplementation()
target:Show('target:Show using port.Show') -- port:Show(msg) print('\nDepend on [port] implement---------------------')
local tar_ = port:on(target)-- binding on target, implementation from port
tar_.Show('tar_.Show()')
print('\ntarget:Dependence(tar_) using port:Show(msg)---')
target:Dependence(tar_) -- port:Dependence(target) print('\noverwrite target:Show(msg)---------------------')
function target:Show(msg)
print('target:Show(msg)...')
print(msg)
end
print('\ntarget:Dependence(tar_) using port:Show(msg)----')
target:Dependence(tar_) print('\nDepend on [target] implement--------------------')
print('\ntarget:Dependence(tar_) using target:Show(msg)--')
tar_ = form.on(target, port)-- using target implementation spec from port
tar_.Show('tar_.Show()')
target:Dependence(tar_)
print('\ntarget ###test over-----------------------------')
form.lua提供友好的lua协约式编程form,完整满足以下两点
- 派生复用机制
- 面向接口特性
form.test 运行成功。后续将给出Lua协约式编程范例;基于form.lua实现通知订阅方式
[Lua]表驱动索引编程,form.lua的更多相关文章
- [lua]原来这才是表驱动的正确表达方式
曾经写了个很煞笔的脚本模拟switch..case语法形式.[lua]尝试一种Case语法糖 而今实际项目应用中突发,原来这才是正确的表驱动方式表达.如下所贴: function event_do( ...
- <4>Lua表
lua表 1: lua没有数组,但是表可以代替数组的功能(数组部分与非数组部分); 开始的, 1, 2, 3 ...称连续的索引; b.Lua表的连续索引的长度(数组部分); #表的名字; --数组 ...
- Lua表(table)的用法_个人总结
Lua表(table)的用法_个人总结 1.表的创建及表的介绍 --table 是lua的一种数据结构用来帮助我们创建不同的数据类型.如:数组和字典--lua table 使用关联型数组,你可以用任意 ...
- Lua 学习之基础篇四<Lua table(表)>
table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数组.字典等. Lua table 使用关联型数组,你可以用任意类型的值来作数组的索引,但这个值不能是 nil. Lua ta ...
- LUA表克隆方法归纳
lua表克隆 将lua一个表, 克隆出一份为一个独立的另外一个表. 对于一个module, 如果在require之后,获得的表对象, 不能直接修改, 例如lua缓存此表, 但是多次逻辑执行, 都使用的 ...
- Python编程和 Lua编程的比较
Python编程和 Lua编程的比较 2016.4.21 定义函数: python: def functionname( parameters ): "函数_文档字符串" func ...
- 表驱动方法(Table-Driven Methods)
表驱动方法(Table-Driven Methods) - winner_0715 - 博客园 https://www.cnblogs.com/winner-0715/p/9382048.html W ...
- Lua 学习之基础篇八<Lua 元表(Metatabble)&&继承>
讲到元表,先看一段table的合并动作. t1 = {1,2} t2 = {3,4} t3 = t1 + t2 attempt to perform arithmetic on a table val ...
- Lua 学习之基础篇二<Lua 数据类型以及函数库 汇总>
引言 前面讲了运算符,这里主要对Lua的数据处理相关的数据类型和函数库进行总结归纳,后面会再接着单独分开讲解具体使用. 首先因为Lua 是动态类型语言,变量不要类型定义,只需要为变量赋值. 值可以存储 ...
随机推荐
- [GRYZ2014]最大连续子序列的和
求给定序列的最大连续子序列和. 输入:第一行:n(n<100000) 第二行:n个整数[-3000,3000]. 输出:最大连续子序列的和. 样例: 输入: 7 -6 4 ...
- JavaScript高级程序设计40.pdf
DOM0级事件处理程序 就是将一个函数赋值给一个事件处理程序属性,具有简单.跨浏览器优势,首先必须取得一个操作对象的引用,每个元素(包括window和document)都有自己的事件处理程序属性,这些 ...
- ACM1229_还是A+B(求A的第K位的数公式:A%((int)(pow(10,K)))
#include<stdio.h> #include<math.h> int main() { int A,k,B,sum,c,d; while(scanf("%d% ...
- rtsp的东西
http://ubuntuforums.org/showthread.php?t=1544946 http://www.live555.com/liveCaster/liveInput.html ht ...
- What does the “__block” keyword mean?
It tells the compiler that any variable marked by it must be treated in a special way when it is use ...
- HTML5和CSS3不仅仅是两项新的Web技术标准
HTML5和CSS3不仅仅是两项新的Web技术标准 HTML5和CSS3不仅仅是两项新的Web技术标准,更代表了下一代HTML和CSS技术.虽然HTML5的标准规范还没有正式发布,但是未来的发展前景已 ...
- Linux下mysql数据库root无法登录的情况
今天安装lnmp环境后用mysql -u root -p连接密码后出现错误 Access denied for user 'root'@'localhost' (using password: YES ...
- git与svn的区别-小结一下
1)Git是分布式的,SVN不是: 这 是GIT和其它非分布式的版本控制系 统,例如SVN,CVS等,最核心的区别.好处是跟其他同事不会有太多的冲突,自己写的代码放在自己电脑上,一段时间后再提交.合并 ...
- Android中使EditText失去焦点,edittext禁止弹出键盘[转]
转自http://www.cnblogs.com/yejiurui/archive/2013/01/02/2841945.html 在我们的应用中,有时候一进入一个页面, EditText默认就会自动 ...
- mysql in 的两种使用方法
简述MySQL 的in 的两种使用方法: 他们各自是在 in keyword后跟一张表(记录集).以及在in后面加上字符串集. 先讲后面跟着一张表的. 首先阐述三张表的结构: s(sno,sname. ...