lua对模块接口扩展的一种方法
module
lua中模块的实现,对于使用者来说就是一个库,引用此库后,可以调用库中实现的任意函数。
使用库,可以将一类功能相关的接口做封装,并提供开放接口。
参考:
http://blog.codingnow.com/2006/02/lua_51_module.html
module 重载需求
我们实现引用程序,往往要引用若干已经实现的库文件, 这些库大都是开源的,以此来加快应用开发进程
应用库后, 应用编码中, 会引用库的一些API, 例如会是 lfs 库中的 dir 来list目录下的文件和文件夹。
---
但是在应用维护过程中,我们往往希望给库的API添加一些过滤规则, 或者对部分API进行重载,
如此,我们对库的使用和应用的维护,提出如下两点要求:
1、 不修改库的代码, 因为后续可能会有升级库的需要, 如果修改, 后续升级库, 往往会丢掉库的修改, 即使记录库的修改, 待升级库时候, 再将修改同步到新库中, 也是耗时, 容易出错的。
2、 应用代码直接使用库的 API 名称, 因为开发人员往往利用库的document, 可以迅速了解API的含义, 利于利用库进行快速开发,而对库的API添加的过滤规则,对应用代码是透明的。
module 重载方法
库引用后, 为库添加属性(old), 记录原始API函数, 然后对原始API名称新定义 函数, 函数中调用 old属性记录的函数,
这样就可以再 调用old属性记录的函数之前, 做一些过滤规则, 例如对函数入参做 合法性判断,添加安全判断条件。
给出例子:
文件 moduleA.lua 中, 定义了一个 printA 模块, 模块实现了一个 printTest 接口
--------------- moduleA.lua -----------------
local print = print
module ("printA")
function printTest()
print("module in printA print")
end
重载脚本, 引用 moduleA.lua
重载 printTest 接口, 打印测试, 先原始接口打印, 再执行重载接口中打印。
require "moduleA" printA.printTest_old = printA.printTest printA.printTest = function ()
printA.printTest_old()
print("printTest of printA module is reimplement")
end printA.printTest()
打印:
module in printA print
printTest of printA module is reimplement
>Exit code: 0
lua对模块接口扩展的一种方法的更多相关文章
- swap分区扩展的三种方法
redhat linux swap分区扩展的三种方法 2016-12-26 11:41:08 分类: LINUX 原文地址:redhat linux swap分区扩展的三种方法 作者:quanshen ...
- php安装扩展的几种方法
转自:http://doc3.workerman.net/appendices/install-extension.html 安装扩展 注意 与Apache+PHP或者Nginx+PHP的运行模式不同 ...
- 通过Http接口及SolrNet 两种方法基于Solr5.5.1 实现CURD
前言 老规矩,任何技术的入门我通常都会总结增删改查,本文我就通过HttpWebRequest和SolrNet的方式实现Solr最基础的增删改查(CURD).对于自己的完整项目,同时不想过于依赖第三方类 ...
- centos 安装php扩展的两种方法
版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 查看PHP版本: php -v 1 1 查看指定PHP版本: /usr/local/php/bin/php -v 1 1 ...
- Python模块/包/库安装几种方法(转载)
一.方法1: 单文件模块直接把文件拷贝到 $python_dir/Lib 二.方法2: 多文件模块,带setup.py 下载模块包(压缩文件zip或tar.gz),进行解压,CMD->cd进入模 ...
- php安装扩展的两种方法
方法一:使用yum命令安装 1.yum install libevent-devel 2.pecl install channel://pecl.php.net/libevent-0.1.0 3.ec ...
- linux系统下php安装mbstring扩展的二种方法
.执行 复制代码代码如下: yum install php-mbstring 2. 修改php.ini (这一步非常重要, 部分lxadmin版本无法自动修改) 复制代码代码如下: echo ‘ext ...
- Servlet接口五种方法介绍
Servlet接口定义了5种方法: init() service() destroy() getServletConfig() getServletInfo() init() 在Servlet实例化后 ...
- 安卓开发笔记(十八):实现button按钮事件的三种方法
Android开发中有三种主要的方式用于设置View的点击事件,1.创建内部类:2.主类中实现OnClickListener接口:3.使用匿名内部类.这三种方式都用到了OnClickListener接 ...
随机推荐
- 投芯片,现在要n+1模式
给坚持理想的屌丝点个赞.投芯片,现在要n+1模式,n个小项目+一个大项目.团队是基础,屌丝创业要以营利为先导,先要短快,同时要有并行的大项目支撑.小项目赚的钱先解决面包问题,同时为大项目锻炼队伍积累经 ...
- Ubuntu 14.04 为 root 帐号开启 SSH 登录
1. 修改 root 密码 sudo passwd root 2. 以其他账户登录,通过 sudo nano 修改 /etc/ssh/sshd_config : xxx@ubuntu14:~$ su ...
- cPanel设置自定义404错误页
利用这个cpanel的错误页工具,你就可以定制错误页面了.设置自定义404错误页,有两种简单的方法. 一,利用cpanel后台控制面板添加设置404自定义错误页的方法 步骤 1.登录cPa ...
- Java中调用c/c++语言出现Exception in thread "main" java.lang.UnsatisfiedLinkError: Test.testPrint(Ljava/lang/String;)V...错误
错误: Exception in thread "main" java.lang.UnsatisfiedLinkError: Test.testPrint(Ljava/lang/S ...
- java的transient
今天遇到个了一个问题,在使用Swing的drap and drop处理JTree的时候,我的TreeNode中的UserObject中引用了java.awt.Image类. 然后在dnd的时候会报ja ...
- ArcGIS API for Silverlight 调用WebService出现跨域访问报错的解决方法
原文:ArcGIS API for Silverlight 调用WebService出现跨域访问报错的解决方法 群里好几个朋友都提到过这样的问题,说他们在Silverlight中调用了WebServi ...
- Magento Table Rate运费国家代码汇总
Magento Table Rate是三种内置未调用第三方API运费方式中最强大的一个.通过设置国家,区域,邮编,价格来划分不同的运费等级.该方式基本能够满足轻量级的B2C商城的运费模式.这里收集下国 ...
- Chip Factory---hdu5536(异或值最大,01字典树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5536 题意:有一个数组a[], 包含n个数,从n个数中找到三个数使得 (a[i]+a[j])⊕a[k] ...
- 实现 UISegmentControl 与 UIScrollView的上下级联(分别在相应的方法中加入级联代码)
实现 UISegmentControl 与 UIScrollView的上下级联,需要在 [segmentCtr addTarget:self action:@selector(segmentedCon ...
- JQuery 内容过滤选择器
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...