[Lua]实现switch的一种方案

Lua 起航 —— 一些常用基础语法 Lua 起航——常用基础语法 阅读详情

Lua实现switch的一种方案

欢迎前往个人博客 驽马点滴 和视频空间 哔哩哔哩-《挨踢日志》

 

if ... elseif ... end 形式

 

local ET_CASE_ONE = 1
local ET_CASE_TWO = 2

local function do_case_one( ... )
	print("do_case_one")
end

local function do_case_two( ... )
	print("do_case_two")
end

local function do_default() 
	print("do_default")
end

function switch(case)
	if case == ET_CASE_ONE then 
		do_case_one()
	elseif case == ET_CASE_TWO then
		do_case_two()
	else
		do_default()
	end
end

 

 

但是这种形式判断的效率是比较低下的, 对于每一个case, 最坏的情况是要判断所有的可能,然后进到 do_default, 因此有这样的改进:

 

使用table表, 将每种可能的情况作为key

 

local CONST_ET_CALSE_HANDLE_FUNC_LIST = {
	[ET_CASE_ONE] = do_case_one,
	[ET_CASE_TWO] = do_case_two,
}

function switch(case)
	if CONST_ET_CALSE_HANDLE_FUNC_LIST[case] then 
		return CONST_ET_CALSE_HANDLE_FUNC_LIST[case]()
	else
		return do_default()
	end
end

 

 

 

 

 

但是这样会很不舒服, 因为操作函数一部分写在了操作函数表中,而default部分却要写在switch函数中,这样导致业务逻辑维护的不集中,超级不爽的,是吧!

因此,我们希望,在表中找不到对应的case时,能够返回default处理函数

更加合理的解决方案

 

local CONST_ET_CALSE_HANDLE_FUNC_LIST = {
	[ET_CASE_ONE] = do_case_one,
	[ET_CASE_TWO] = do_case_two,
	__default = do_default,
}

SWITCH_METATABLE = {
	__index = function(t, k) 
		return rawget(t, "__default")
	end,
}

setmetatable(CONST_ET_CALSE_HANDLE_FUNC_LIST, SWITCH_METATABLE)

function switch(case)
	return CONST_ET_CALSE_HANDLE_FUNC_LIST[case]()
end


这个要求有这样的前提: 表的__default必须持有一个function类型的值.

 

 

整理

 

local SWITCH_METATABLE = {
	__index = function(t, k) 
		return rawget(t, "__default")
	end,
}

function SwitchGenerator(tbl)
	tbl = tbl or {}
	setmetatable(tbl, SWITCH_METATABLE)
	return function(case)
		return tbl[case]()
	end, tbl
end

function test()
	local ET_CASE_ONE = 1
	local ET_CASE_TWO = 2

	local function do_case_one( ... )
		print("do_case_one")
	end

	local function do_case_two( ... )
		print("do_case_two")
	end

	local function do_default() 
		print("do_default")
	end

	local switch, tbl = SwitchGenerator({
		[ET_CASE_ONE] = do_case_one,
		[ET_CASE_TWO] = do_case_two,
		__default = do_default,
	})

	local function realTest()
		for i=1,3 do
			switch(i)
		end
	end

	realTest()

	tbl[3] = function() print("new add case") end

	realTest()
end

test()

 

 

 

 

 

欢迎前往个人博客 驽马点滴 和视频空间 哔哩哔哩-《挨踢日志》

 

Android dex, odex, oat, vdex, art文件介绍 下图可以简化将Java源转换为OAT的过程: .dex Dalvik虚拟机字节码文件 .vdex 其中包含APK的未压缩DEX代码,以及一些旨在加快验证速度的元数据 .odex .oat // JIT,Just-in-time,即时编译,边运行边编译; // AOT,Ahead Of Time,提前编译,指运行前编译。 其中包含APK中已经过AOT编译的方法代码。 原始DEX文件(例如classes.dex)被转换为另一个包含本机代码的文件。这个新文件通常具有.odex。.oat扩展名,并由ELF格式 阅读详情

相关推荐

Python爬虫实战:如何高效抓取拼多多商品信息、销量与价格数据,破解反爬虫挑战

**摘要:**本文介绍利用Python爬虫技术抓取拼多多商品数据(价格、销量等)的方法与应用价值。通过分析拼多多商品页面的HTML结构,使用Requests和Selenium获取数据,并应对反爬虫机制(IP代理、请求头伪装等)。数据可存储于MongoDB或CSV用于市场监控、竞品分析等场景。文章涵盖技术选型、实战代码示例及反爬策略,为电商数据分析提供实用指导。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1671

lua-switch功能实现

lua中是没有Switch语法的,所以很多时候要条件判断的时候只有一条又一条的if 和elseif 去写。当条件比较多且条件里面的内容比较多的时候,会显得比较乱,而且不利于我们后期去维护。但是lua的table类型其实相当强大,我们可以利用表结构和匿名函数,我们就可以实现Switch功能。 下面,归纳了3种常用的写法(其实原理一样): 第一种: local tab = { [1] = function() print("aaa") end,

michaelafeng的博客 7017

Windows 11安装 SQLServer 2008 R2 失败问题处理

Windows 11安装SQL Server 2008 R2失败解决方案 由于Windows 11移除了对PowerShell 2.0的支持,导致SQL Server 2008 R2安装失败。经过多次尝试,最终通过**方案六(修改注册表模拟PowerShell 2.0环境)**成功安装。其他可行方案包括: 使用SP3集成版安装包 通过命令行跳过检查(/SUPPRESSPOWERShellCHECK参数) 创建特殊配置文件 替代方案建议: 使用Docker容器运行 在虚拟机中安装 升级到新版SQL Serve

oDengWei的博客 7161

lua switch

lua实现switch 和 部分嵌套switch

qq_36248022的博客 1610

Linux环境下OpenSSH升级到 OpenSSH_9.8p1(内置保姆级教程并包含openssl升级过程)

2024年7月1日接到安全部门同事邮件通知,目前生产环境及测试环境服务器Openssh存在远程代码执行漏洞(CVE-2024-6387),漏洞等级高,且攻击者可以成功利用该漏洞获得远程root shell最高权限从而执行任意代码及命令,主要受影响版本为8.5p1

菜鸟运维升级之路 2万+

使用JAVA 的 POI 库 将DOC文件转为DOCX文件

java使用POI库,将doc文件转为docx文件

qq_45808266的博客 5705

Lua中实现Switch功能

熟悉Lua的大家应该都知道,Lua中是没有Switch语法的,所以很多时候要条件判断的时候只有一条又一条的if 和elseif 去写,但是很多时候看上去很不直观,但是Lua的table类型其实相当强大。利用表结构和匿名函数,我们就可以实现Switch功能。 以下是在项目中的一段应用代码: function UIActivityTemp.SetPageUIInfoWithIndex(index...

OneWord233的博客 6740

PVT(Process Voltage Temperature)

芯片PVT

网始如芯个人博客 3万+

Lua程序设计学习笔记(一) Lua基本语法(1)

Lua基本语法(一) 1.  开始 (1)基本常识 lua中的标识符可以由任意字母、数字、下划线构成的字符串,但不能以数字开头。 全局变量不需要申明,直接赋值即可创建,删除变量直接赋nil。未申明的变量不会报错,直接返回nil。 行注释以“--”开头;块注释以“--[[”开始,“]]”结束,重启块注释加“-”即可。(住:块注释需独占一行) (2)Lua解析器   在代码文件中第一行输入:#!...

墨、砚 2696

AI搜索优化(GEO)实战指南:抢占智能对话流量入口

AI SEO,是针对生成式AI平台(如DeepSeek、豆包、Kimi等)的优化策略,旨在通过适配AI算法对内容的理解和引用逻辑,提升品牌在AI生成答案中的可见性与权威性,从而在对话式搜索场景中抢占流量入口。:强化内容经验性(Experience)、专业性(Expertise)、权威性(Authoritativeness)、可信度(Trustworthiness)内容需避免夸大描述,提供可验证的细节(如数据、用户评价)。

Baixue5209的博客 6776

matlab中高频变压器怎么找,干货|手把手教你绕制高频变压器

原标题:干货|手把手教你绕制高频变压器绕制一个变压器所需材料:磁芯、骨架、各种铜线、麦拉胶带。变压器参数:磁芯:EE22原边:134T(1-3脚),辅助:32T(5-4脚),输出:15T(10-9脚)原边电感:1380±10%uH漏感:≤44uH引脚分布图: 特别注意:绕制方法为网上下载,其中变压器绕制方法是对的,但其中存在着很多问题(比如,正规变压器的绕组的头和尾是要添加铁氟龙套管的,每一层之间...

weixin_30895121的博客 2125

lua实现switch和快速排序

lua实现switch和快速排序快速排序switch 快速排序 local list = {.....} local comparefuc = function (....) end local function quick_sort(left, right) if left >= right then return ...

灰机灰机小随笔 402

Ubuntu关闭更新提醒的三层控制方法:从GUI到APT配置

Linux系统更新机制本质上是包管理器(APT)驱动的自动化运维流程,其核心原理在于分离‘元数据刷新’、‘安全补丁安装’和‘用户通知’三个职能。这种分层设计既保障了基础安全性,又为系统管理员提供了策略定制空间。技术价值体现在提升生产环境稳定性、规避未经验证的内核/驱动升级风险,并支持ROS、Blender渲染、工业控制等对时序敏感的应用场景。本文聚焦Ubuntu系统入门教程中高频需求——科学关闭软件更新提醒,覆盖Ubuntu 20.04及LTS版本的GUI设置、systemd服务禁用与APT配置修改三大实操

weixin_29698641的博客 394

Lua实现switch-case

switch是啥?别多想,不是年会发的那玩意儿 ! Lua君说:虽然我没有case,但是我有switch啊,而且你还可以随意改名字,比如你爱慕已久的CuiHua~ 实际上switch同学像是一个表,丢给它一个a,它就把case:a对应的地址给你,丢给它一个b,它就把case:b对应的地址给你,丢给它一个c,人家说,不好意思啊哥,我这儿没有c,就走default了哈~ 既然是这样,我们就造个这样的表...

Mo_Mo123的博客 4386

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Lua - 实现switch case

简单来说,除去使用if-else实现外,自然就是使用table表来实现了,具体看代码: function switch(a) -- body local switchNum = { [1] = function() -- for case 1 print("Case 1.") end, [2] = f...

汐客SeaKr的博客 2649

精雕软件(JDpaint) 5.5 绿色版

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

lua实现switch

先上代码: 1 function switch(val) 2   local function innerfunc(t) 3     for k,v in pairs(t) do 4       if k == val then 5         if type(v) == "function" then 6           return v() 7 ...

weixin_30788619的博客 1170

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

[寒江孤叶丶的Cocos2d-x之旅_40]在LUA中模拟switch

原创文章,欢迎转载,转载请注明:文章来自[寒江孤叶丶的Cocos2d-x之旅系列]博客地址:http://blog.youkuaiyun.com/qq446569365这个东西其实没有什么难度,但是一个朋友跟我说他在面试时候居然遇到了“请用lua模拟Switch” 这道题……于是乎想起把自己之前写的拿出来分享一下……代码很简单:_G.Switch = _G.Switch or {} _G.Switch.SWI

寒江孤叶丶的游戏生涯 1585

lua实现switch功能

lua语言没有switch函数,但是可以通过if..else实现switch功能 function doSwitch(typ) if("v" == typ) then return "VISIT"; elseif("p" == typ) then return "PAGE"; elseif("c" =...

xichengxml的博客 1959

C# Switch 的使用与 Lua Switch的实现

简单的switch

qq_30238537的博客 982

lua--switch的语法实现

function test1() print("test1") print(test1) end function test2(val) print(val) end local switch = { test1 = test1, t2 = test2, } local t1 = switch["test1"] t1() print(t1) print("------") ...

ivalue的博客 7679

lua 模拟实现switch

可以考虑实现如下模式形式, 也许还有跟变态的方式,在不考虑效率下可以想想,闪人睡觉 switch(s,{     ca1=function()     end     ca2=function()     end }) switch(s,     case(s,function()     end),     case(s,function()     end),  ...

小草的胡言乱语 523

lua中实现switch以及sublime下自动补全switch语法

刚开始使用lua的人肯定会不满lua居然没有switch这个语法。 但是熟悉lua的强大特性之后,你会发现其实switch是完全没有必要提供的^.^,因为lua有强大的table和function 例子: local key = 1 local switch = { [1] = function() print("swi

灵动君心 2878

Lua中通过table实现switch

因为lua中没有switch,但是可以通过功能强大的table间接去实现类似的功能: 首先先定义个table: switch={}; 然后定义需要的case,就是table内的元素: switch[1] = function()...end switch[2] = function()...end switch[3] = function()...end switch[n] = function()...end 调用的时候就直接: switch[case](); 但是我们会发现可能存在switch[ca

qq_22038235的博客 875

LUA实现状态机

 如果完全以FP的方式使用LUA,那么似乎不必要使用状态机,相比于FP状态机就不是很优美的东东了:)。不过既然图灵他老人家创造了图灵机,LUA作为一门编程语言,自然也是图灵完备的那么出于对伟大先驱的尊敬,用状态机来解决问题自然也是义不容辞的了。      我们在用C/C++来实现状态机的时候,免不了要用某种代码生成的技术来产生状态迁移表(当然完全的SWITCH CASE也是可以的),用LU

caslwzgks的专栏 3977

【lua】switch case

switch case 的 语法糖 local fs = (function(name,args) local sw = { ["#default"]=function() return " " end, ["functionName"]=function(args)return callback(name,args) en

u014787719的博客 1029
上一篇: [算法练习]贪心算法之活动安排
下一篇: JNI学习之java 调用C/C++本地库
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值