[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()

 

 

 

 

 

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

 

Seurat 单细胞转录组测序数据分析教程(三)——python(scanpy) 文章参考至,做了一个更详细的解读。本教程探讨了 scanpy 的可视化可能性,分为三个部分:嵌入的散点图(例如 UMAP、t-SNE)使用已知标记基因鉴定簇差异表达基因的可视化在本教程中,我们将使用来自 10x 的数据集,其中包含来自PBMC的 68k 个细胞。Scanpy 在其分布中包括该数据集的简化样本,该数据集仅包含 700 个细胞和 765 个高度可变的基因。该数据集已经过预处理和 UMAP 计算。在本教程中,我们还将使用以下文献标记:B细胞:CD79A、MS4A1。 阅读详情

相关推荐

量化金融笔记1-股票量化基础

股票量化基础 文章目录什么是股票股票的定义及其诞生所解决的问题股票的主体和流通股票的常规分类股票价格收益率什么是股票价格的收益率股票价格收益率计算在python中的实现两种收益率算法的特点及应用场合股票交易规则场内交易与场外交易A股、B股、H股国内多层次的资本市场股票交易指令和撮合机制股票交易时间股票交易成本股票复权股票数据介绍与提取行业分类和指数行情数据因子数据标的数据基本面数据 什么是股票 股票的定义及其诞生所解决的问题 股票的定义:股票是一种有价证券,是股份有限公司公开发行的用以证明投资者的股东身份

折桂狂人的博客 2395

lua-switch功能实现

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

michaelafeng的博客 7017

从工艺文件到寄生分析:手把手教你用华大九天RCExplorer做版图预检(附ITF文件解析)

本文详细介绍了华大九天RCExplorer工具在模拟IC和版图设计中的应用,从工艺文件解析到寄生参数提取的全流程。通过ITF文件的深度解析和实战案例,帮助工程师掌握金属层、介质层及通孔参数的关键影响,提升设计效率与准确性。文章还提供了与StarRC工作流集成的实用技巧,是国产EDA工具应用的权威指南。

weixin_42522552的博客 407

lua switch

lua实现switch 和 部分嵌套switch

qq_36248022的博客 1610

医学图像处理(一)使用U-Net进行MRI的肝脏分割

医学图像处理(一)使用U-Net进行MRI的肝脏分割数据集搜集训练集和测试集划分问题一: 测试集不包括GroundTruth问题二:T1和T2的数据能一起训练吗?问题三: T1的图像在文件夹中分成了InPhase和OutPhase,这个有什么区别?分离出肝脏将dicom文件转换为png格式数据增强U-net网络搭建自定义DatasetMain.py实验结果总结 图像分割小白一枚,之前接到一个MRI图像肝脏分割的任务。对于医学图像分割,第一想到的就是Unet. Unet在2015的MICCAI上首次提出,在医

qq_34003876的博客 2万+

vmware vsphere 证书过期告警处理方法

vSphere Clinet 管理页面出现“证书告警” ,检查证书未发现现有证书有过期现象

m0_51902127的博客 3637

Lua中实现Switch功能

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

OneWord233的博客 6740

利用Solidworks2020将挖掘机装配体转换为URDF模型

利用Solidworks2020将挖掘机装配体转换为URDF模型一、下载sw_urdf_exporter插件 URDF(Universal Robot Description Format)——通用机器人描述格式,它是ROS里边使用的一种机器人的描述文件,包含的内容有:连杆、关节,运动学和动力学参数、可视化模型、碰撞检测模型等。 一、下载sw_urdf_exporter插件 ROS提供了SolidWorks转URDF的插件(下载链接)—sw2urdfSetup.exe,下载后点击安装,安装完成后就能在sol

weixin_48192326的博客 6101

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

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

墨、砚 2696

第五节_PySide6基本窗口控件_主窗口和标签

本文介绍了PySide6中主窗口和标签控件的使用。主要内容包括: 窗口控件分类: QWidget是基础窗口部件,可作为独立窗口或子部件 QMainWindow提供标准应用程序框架,包含菜单栏、工具栏等 QDialog用于对话框,支持模态交互 主窗口创建: 演示了如何创建QMainWindow子类 实现了窗口居中、设置图标、状态栏等功能 提供了窗口几何信息的获取方法 QLabel标签控件: 继承自QFrame类 用于显示文本或图像 文章通过代码示例详细说明了主窗口的创建和使用方法,包括位置控制、图标设置等常见

su桥木的博客 1021

手把手教你学simulink(26.7)--控制算法场景示例:基于模型预测控制(MPC)的智能温室环境控制系统

首先,我们需要将温室环境的动力学模型转换为状态空间形式。假设我们有四个状态变量:温度 TT、湿度 HH、光照强度 II 和二氧化碳浓度 CCO2CCO2​,以及四个控制输入:加热器功率 u1u1​、加湿器加湿量 u2u2​、通风扇风速 u3u3​ 和补光灯光照强度 u4u4​。状态空间模型可以表示为:x(t)=[T(t),H(t),I(t),CCO2(t)]Tx(t)=[T(t),H(t),I(t),CCO2​(t)]T 是状态向量。

MHD0815的博客 400

lua实现switch和快速排序

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

灰机灰机小随笔 402

PCL 读取和保存点云

PCL (Point Cloud Library) 是一个用于处理 3D 点云数据的开源库。在处理点云数据时,常见的任务包括点云的读写和可视化。PCL 提供了强大的 IO 模块来读取和写入各种格式的点云文件,并且提供了可视化模块来对点云进行渲染和显示。点云的读写与显示是很多 3D 数据处理任务的基础步骤,通过这些步骤,可以对点云进行预处理、分析和操作。

纵马踏花向自由 1737

Lua实现switch-case

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

Mo_Mo123的博客 4386

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

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

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

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

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

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

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

[寒江孤叶丶的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、付费专栏及课程。

余额充值