浅谈lua脚本类装饰器装饰器

premake轻量级基于lua脚本的项目生成工具源代码 轻量级项目生成工具,类似于cmake等工具;使用Lua脚本,可以生成VC,各系统MAKE,codeblocks,codelite的开发工具的项目文件 立即下载

最近刚进公司不久,学习了脚本语言Lua,今天重新理解了下装饰器,感觉蛮简单的,就是把一个函数的功能稍微修饰下。

1、先看这个简单程序,求几个数的最大值。

local function my_max( ... )
	return math.max( ... )
end

print(my_max(1,2,3))
2、假设输入的值不是村数字的话,这时候应该报错,那该怎么实现呢

local function my_max( ... )
	local input = { ... }
	for key, value in pairs(input) do
		if type(tonumber(value)) ~= 'number' then
			print('invalid input at position ' .. tostring(key))
			return 0
		end
	end
    return math.max( ... )
end

print(my_max( 1,2,3 ))

print(my_max(1,'x',3))

输出结果:
3
invalid input at position 2
0

3、其实到上面我们就已经满足了需求,一般情况我没会写成如下重构代码:

local function isMyInputValid( ... )
	local input = { ... }
	for key, value in pairs(input) do
		if type(tonumber(value)) ~= 'number' then
			print('valid input at positon ' .. tostring(key))
			return false
		end
	end
	return true
end

local function my_max( ... )
	if not isMyInputValid( ... ) then
		return 0
	end
	return math.max( ... )
end

print(my_max( 1,2,3 ))

print(my_max(1,'x',3))

输出结果:
3
valid input at positon 2
0
4、这已经是我们可以接受范围,下面是一个以装饰器的思维来写的

local function dec(func)
	local function _dec_in(...)
		local input = { ... }
		for key, value in pairs(input) do
			if type(tonumber(value)) ~= 'number' then
				print('invalid input at position ' .. tostring(key))
				return 0
			end
		end
		return func( ... )
	end
	return _dec_in
end

local function my_max( ... )
	return math.max( ... )
end

my_max = dec(my_max)

print(my_max(1,2,3))
print(my_max(1,'x',3))

输出结果:
3
invalid input at position 2
0
my_max = dec(my_max) 可以理解成 my_max = _dec_in,然后再往下调用



【Unity】Pico VR 开发实战:从环境搭建到交互实现 本文是一份详细的Unity Pico VR开发实战指南,涵盖从环境搭建到核心交互实现的全流程。详细讲解了如何集成Pico Unity Integration SDK与XR Interaction Toolkit,配置开发环境,并重点解析了手柄输入处理、射线交互以及VR UI操作三大核心模块的代码实现与优化技巧,帮助开发者快速上手Pico VR应用开发。 阅读详情

相关推荐

TMS320F28377D/F28379D CAN通信避坑指南:从寄存器配置到中断处理的完整流程

本文详细解析了TMS320F28377D/F28379D在CAN通信开发中的关键技术与避坑指南,涵盖时钟配置、寄存器初始化、中断处理等完整流程。针对工业控制和汽车电子应用,提供了实用的优化技巧和错误诊断方法,帮助开发者高效实现稳定可靠的CAN通信。

weixin_30954265的博客 492

装饰模式lua实现

Person = {} Decorator = {} function Person:new(o) o = o or {} setmetatable(o,self) self.__index = self return o; end function Person:Show() print("我是人") end Decorator = Person:new{component =

有用用之,无用弃之 3467

ThinkAdmin后台Getshell

通过文件包含或者图片马的方式Getshell。修改其可允许的文件类型,php不允许,可添加。系统管理->系统参数配置->本地服务器存储。

hot_milk1的博客 1864

在 Lua 中实现 “装饰器“

在 Lua 中实现了类似装饰器的用法. 具体的做法是用元表监听每一次函数定义, 然后在每次函数定义的时候检测有没有调用过装饰器函数, 如果有, 就执行执行相关逻辑.多重装饰器. local decorators = {} local m = setmetatable({}, {__newindex = function(t, k, v) if 'function' == type(v) then for i = #decorators, 1, -1 do v

木头人的博客 875

【TensorRT】TensorRT C# API 项目介绍:基于C#与TensorRT部署深度学习模型(上篇)

开发了TensorRT C# API 2.0版本,该版本在开发时充分考虑了上一版本应用时出现的问题,并进行了改进。同时在本版本中,我们对接口进行了优化,使用起来更加简单,并同时提供了相关的应用案例,方便开发者进行使用。

grape_yan的博客 3038

YOLOv8模型部署与测试:保姆级教程(含Ultralytics配置避坑指南)

本文提供了一份详尽的YOLOv8模型部署与测试指南,涵盖环境配置、模型加载、参数优化、批量处理及API服务封装等关键步骤。重点分享了Ultralytics框架在实际部署中的常见问题与解决方案,帮助开发者高效完成从训练到生产的过渡,确保模型在真实场景中稳定运行。

weixin_29038155的博客 293

装饰器模式

简单的说,装饰器模式可能动态的给一个对象增加额外的功能。就像人类通过各种服饰来打扮自己一样,对象通过装饰器模式打扮自己,从而拥有更多功能。

千磨万击还坚韧,任尔东西南北风 702

labview汽车电子通用测试程序架构,CAN通讯上位机

结合做过的汽车电子测试项目,车身控制器测试,CAN网络模块测试,电机控制器功能测试,汽车仪表盘视觉及功能测试、电气盒功能测试、EOL下线检测、车用空调控制器功能测试等项目,结合实际项目,整理编写的一个汽车电子,通用测试架构,包含项目的讲解等。6、数据保存 、数据处理、 曲线显示 、报警处理等。7、CAN总线故障信息监控及记录保存。2、参数设置(CAN端口及参数)5、CAN通讯+数据解析。

ali2805486883的博客 2754

Lua利用元表实现修饰器

基础概念 元表(metatable) 弱表(weak table) 运算符重载 修饰器 概述有时我们要为一些对象增加元数据(文档,变量类型什么的),但有时对象是从别处来的,没法修改内部,所以要用到修饰器。注:本文的对象指lua中的table,function,userdata等。什么是修饰器?修饰器可以理解成数学中的算子,接受一个函数,返回修饰过的一个函数,例如微分算子ddx\frac{d}{dx}

帆随风而动 2571

QT使用libssh2库通过密匙实现sftp协议上传文件

qt下使用libssh2通过密匙连接sftp服务器端

小米的修行之路 941

SpringBoot 插件化开发详细总结

SpringBoot 插件化开发方案总结

congge 1万+

Lua Input函数,输入数据

list={} –print(list[“arr”]) –输入基本学生信息 function student() print(“请输入学号”) num= io.read() print(“请输入姓名”) name= io.read() print(“请输入性别”) gen= io.read() print(“请输入年龄”) age= io.read() str=“姓名:”…name…“性别:”…gen…“年龄:”…age list[num]=str print(list[num]) end –调用学生函数

樽酒的博客 4012

Vue3 - 详细实现流程图编辑器可视化平台示例代码,打造前端web网页流程图在线编辑绘制操作展示,vue3自定义绘制流程图在页面上画流程图功能(提供各种操作按钮及节点控件,界面美观交互式流程图插件)

vue3,绘制流程图,在线流程图制作,在vue3中实现流程图,vue3做一个制作流程图的功能,vue3流程图组件,vue3流程图,流程图绘制展示,vue3流程图可视化在线编辑源码,基于VUE3的在线绘制流程图工具,vue3+logicflow流程图,绘制动态流程图并自定义节点和线,vue使用logicFlow绘制流程图,生成各种流程图图形可连接点移除,基于Vue的流程图组件,工作流程图,流程编辑器,vue3流程组件,vue-flow绘制流程图,绘制流程图示例demo,vue3 logicflow流程图使用教

🏆 前端领域优质创作者 9967

在lua中实现类似python的decorator

在python中强大的decorator可以发挥很大的作用,而lua中的first-class function想来一定可以实现类似的东西,

1057

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

装饰器模式(动态组合)

装饰器模式(动态组合)

Aaron.无剑 539

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

设计模式(9) 装饰器模式(DECORATOR)

问题聚焦: 有时候,希望某个类增加新功能的时候,往往会生成一个子类。 但是,这种方式有时候略显臃肿,其次,这种方法是静态的,不够灵活。 因此,针对这种给对象动态添加功能的需求,大牛们给出了本节的装饰器模式。

面团的专栏 1634

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Java设计模式——装饰器模式(Decorator)

孙悟空有七十二般变化,他的每一种变化都给他带来一种附加本领。而不管孙悟空怎么变化在二郎神眼里,他永远是那只猢狲。 装饰器模式以对客户透明的方式动态的给一个对象附加上更多的责任。 在孙悟空的例子里,老孙变成的鱼儿相当于老孙的子类。 装饰模式的类图如下: 装饰模式的角色介绍: 抽象构件角色(ComponentDec):给出一个抽象接口,以规范准备接收附加责任的对象 具体构件(Concre

路漫漫,水迢迢 3975

python装饰器详解

“你会Python嘛?” “我会!” ‘那你给我讲下Python装饰器吧!’ “Python装饰器啊?我没用过哎” 简言之,python装饰器就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用python装饰器的好处就是在不用更改原函数的代码前提下给函数增加新的功能。 一般而言,我们要想拓展原来函数代码,最直接的办法就是侵入代码里面修改,例如: ...

xiangxianghehe的博客 17万+

http.lua里的装饰器

摘自:http.lua local co_yield = coroutine.yield local co_create = coroutine.create local co_status = coroutine.status local co_resume = coroutine.resume local select = select -- Reimplemen...

weixin_30337157的博客 169

lua语法总结1

for k=1,#bbox_loces do print("bbox_loces",bbox_loces[k]) end #获取table的长度

u010848594的博客 409

Lua基础(十)输入输出

一 Lua中的I/O体现 '图形-->graph'、'数据库-->database'、'网络-->network'的访问 --> 与'外部交互'的机制 +++++++++++++++'I/O实现方式'+++++++++++++++ 1)由'宿主程序'实现 2)'不包括'在发行版中的'外部库实现' 备注:Lua语言只'提供了ISO C语言标准支持'的功能,即'基本的文件操作' 二 Lua关于I/O常见的函数 三 I/O模型 I/O库为文件操作提供了'两种...

wzj_110的博客 5564

Lua:08---I/O库:input()、output()、write()、read()、lines()、open()、tmpfile()、flush()、setvbuf()、seek()、pope

一、前言 由于Lua语言强调可移植性和嵌入型,所以Lua本身并没有提供太多与外部交互的机制。在真实的Lua程序中,从图形、数据库到网络的访问等大多数I/O操作,要么由宿主机实现,要么通过不包括在发行版中的外部库实现 单就Lua语言而言,只提供了ISO C语言标准支持的功能,即基本的文件操作等 对于文件操作来说,I/O库提供了两种不同的模型: 简单I/O模型 完整I/O模型 一、简单I/O模型 简单I/O模型虚拟了一个当前输入流和一个当前输出流,其I/O操作是通过这些流实现的 I/O库把当

董哥的黑板报 4999

lua 的io操作,非常详细。

 Lua 标准库 - 输入输出处理(input and output facilities)责任编辑:cynthia作者:来自ITPUB论坛   2008-02-18   文本Tag: Lua  【IT168 技术文档】I/O库提供两种不同的方式进行文件处理  1、io表调用方式:使用io表,io.open将返回指定文件的描述,并且所有的操作将围绕这个文件描述 

duanxuyun的专栏 10万+

Lua中的输入输出与文件操作

前言: lua语言追求的是可移植性和嵌入性,它本身并没有提供太多与外部交互的机制。在真实的lua程序中,大多数IO操作要么由宿主程序实现,要么通过外部库实现,单就lua语言而言,它只提供了基本的文件操作等简单功能,在文件操作上,它提供了两种模型。 一、简单I/O模型 I/O中提供了一个简单模型,当前输入流和当前输出流,其I/O操作就是通过流来实现的。I/O库把当前输入流初始化为进程的标准输入...

mozhi 4939

LUA io.input,io.output,io.write,io.read之间的关系

io.write(content)//输出内容,可以是字符串,函数,表达式等,不能使nil,例如 io.write("sin(30)=",math.sin(3.14/6)); 如果不设置io.output,io.write会输出到控制台 做如下设置 page=[[               An HTML Page               LUA          

zhuoyuetec的专栏 5962
上一篇: TCP三次握手和四次握手
下一篇: 链表六大解题套路(快慢双指针大法)
hellohelloC
博客等级 码龄12年 15粉丝 107原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值