封装是很多OO程序员的思维定势,似乎只要封装了,世界就完美了。
其实封装并不能解决问题,只能隐藏问题。
我在这里并不打算讨论好的封装和坏的封装。只是想介绍一下Lua的封装惯用法。
先看一个例子:
module('modulename', package.seeall)--创建一个名为 'modulename' 的table
local function index_function(o, k)--作为表的索引函数
local v = rawget(o, '_mt')[k]--_mt=modulename
if v then return v end --如果在'_mt'表中找到,就直接返回,即元表优先于原型
--自此说明没有在元表中找到
local base = rawget(o, '_proto')--如果被所以的表有'_proto'项,就将其视为原型
--自此base就是原型
if base then --若有原型就参考原型
v = base[k] --在原型中查找
if type(v) == "function" then--这里是为了实现原型的函数操作原型,而不是操作o
return function(x,...)--这里返回一个闭包(函数),如果对闭包还有不理解的请自行查阅Google
return v(base,...)--v是一个upvalue,base也是,这里把x(也就是第一个参数,也就是table)丢弃了,因为将用原型中的函数取代之
end
else
return v--如果v不是个函数,就可以直接返回,
end
end
--如果没有设置原型,那就算了,
end
modulename.__index=modulename
local metatable = {__index =index_function, -- __index 函数设置在metatable里才有用
__mode="v",--表明是值是weak引用
__tostring=function(o)--这个是花边功能
return 'modulename:'..tostring(o._proto)
end
}
--对外的接口函数
function wrap(nudity, xxx)--nudity表示裸露的待包装的对象(table)
local xxx= xxx or nudity.xxx ;--这里随便填默认值,卡卡
--注意,元表_mt优先于原型,这个符合包装语义,_mt中的方法会替代_proto中的方法。
return setmetatable({_proto=nudity, _mt =modulename, xxx = xxx}, metatable)--这里的两个xxx不相同的,卡卡
end
这个例子,实现了对任一个对象,附加一个包装的功能。
可以用在把一个异步接口或者一个非阻塞同步接口转换到伪阻塞协程接口时使用。
相关推荐
10、封装的TclFace页面扩展包,可以通过面向对象的tcl脚本生成各种平台的页面功能,此扩展包除了可以用于本地应用程序生成页面之外,还可以运行于AOLServer WEB服务器,作为一种类似于JSF的服务器端脚本。
7、采用灵活的可扩展架构,整个系统可以灵活的扩展各种解释器、界面组件、工具、工程、界面风格等; 8、支持控制台功能(目前仅有tcl控制台、telnet控制台、串口控制台可用,其他脚本控制台正在开发); ...
LuaBind 是一个帮助你绑定C++和Lua的库.她有能力暴露 C++ 函数和类到 Lua . 她也有 能力支持函数式的定义一个Lua类,而且使之继承自C++或者Lua. Lua类可以覆写从 C++ 基类 继承来的虚函数. 她的目标平台是Lua 5.0 ,不...
dodolu a lightweight web framework based on openresty lua ...有助于多人开发统一风格,并提供了简单封装的request, response, global variable,适合构建稍微复杂web应用。 目录结构 . |-- app
10、封装的TclFace页面扩展包,可以通过面向对象的tcl脚本生成各种平台的页面功能,此扩展包除了可以用于本地应用程序生成页面之外,还可以运行于AOLServer WEB服务器,作为一种类似于JSF的服务器端脚本。
封装的TclFace页面扩展包,可以通过面向对象的tcl脚本生成各种平台的页面功能,此扩展包除了可以用于本地应用程序生成页面之外,还可以运行于AOLServer WEB服务器,作为一种类似于JSF的服务器端脚本。
Ada, C#, Eiffel, Erlang, Euphoria, Guile, Haskell, Java, Lisp, Lua, ML, Objective C, Pascal, Perl, PHP, Pike, Pliant, Python, Ruby, Smalltalk, and Tcl. ) SDL在GNU LGPL version 2 下发布,这意味着你...
10、封装的TclFace页面扩展包,可以通过面向对象的tcl脚本生成各种平台的页面功能,此扩展包除了可以用于本地应用程序生成页面之外,还可以运行于AOLServer WEB服务器,作为一种类似于JSF的服务器端脚本。
10、封装的TclFace页面扩展包,可以通过面向对象的tcl脚本生成各种平台的页面功能,此扩展包除了可以用于本地应用程序生成页面之外,还可以运行于AOLServer WEB服务器,作为一种类似于JSF的服务器端脚本。
10、封装的TclFace页面扩展包,可以通过面向对象的tcl脚本生成各种平台的页面功能,此扩展包除了可以用于本地应用程序生成页面之外,还可以运行于AOLServer WEB服务器,作为一种类似于JSF的服务器端脚本。
7、采用灵活的可扩展架构,整个系统可以灵活的扩展各种解释器、界面组件、工具、工程、界面风格等; 8、支持控制台功能(目前仅有tcl控制台、telnet控制台、串口控制台可用,其他脚本控制台正在开发); ...
7、采用灵活的可扩展架构,整个系统可以灵活的扩展各种解释器、界面组件、工具、工程、界面风格等; 8、支持控制台功能(目前仅有tcl控制台、telnet控制台、串口控制台可用,其他脚本控制台正在开发); ...
业余时,作为一个编程语言爱好者,对D、Kotlin、Lua、Clojure、Scala、Julia、Go等语言均有了解,但至今仍为Python独特的风格、简洁的设计而惊叹。 目录 · · · · · · 第1章 程序之道 1 1.1 什么是程序 1 ...