[Lua]实现switch的一种方案

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

时间: 2024-08-25 22:18:48

[Lua]实现switch的一种方案的相关文章

前端解决跨域问题的8种方案(转)

前端解决跨域问题的8种方案(最新最全) 原文:http://www.cnblogs.com/JChen666/p/3399951.html 1.同源策略如下: URL 说明 是否允许通信 http://www.a.com/a.jshttp://www.a.com/b.js 同一域名下 允许 http://www.a.com/lab/a.jshttp://www.a.com/script/b.js 同一域名下不同文件夹 允许 http://www.a.com:8000/a.jshttp://www

Android 验证码倒计时两种方案

使用 第一种方案:自定义控件 1.在布局中使用 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_w

生成html的几种方案

方案1: ///   <summary > ///   传入URL返回网页的html代码 ///   </summary > ///   <param   name="Url" >URL </param > ///   <returns > </returns > public   static     string   getUrltoHtml(string   Url) { errorMsg   =   &qu

集合框架,ArrayList和Vector的区别,让arrayList线程安全的几种方案

boolean add(E e) 将指定的元素添加到此列表的尾部. void add(int index, E element) 将指定的元素插入此列表中的指定位置. boolean addAll(Collection<? extends E> c) 按照指定 collection 的迭代器所返回的元素顺序,将该 collection 中的所有元素添加到此列表的 尾部. boolean addAll(int index, Collection<? extends E> c) 从指定

OpenStack部署到Hadoop的四种方案

随着企业开始同时利用云计算和大数据技术,现在应当考虑如何将这些工具结合使用.在这种情况下,企业将实现最佳的分析处理能力,同时利用私有云的快速弹性 (rapid elasticity) 和单一租赁的特性.如何协同效用和实现部署,是本文希望解决的问题. 一些基础知识 第一是OpenStack .作为目前最流行的开源云版本,它包括控制器.计算 (Nova).存储 (Swift).消息队列 (RabbitMQ) 和网络 (Quantum) 组件.图 1 提供了这些组件的一个图示(不包含 Quantum

后台进程弹Toast的几种方案

在后台进程弹Toast,使用方案有:由UI线程传入一个Activity參数.View參数或者Handler參数,使用Activity.runOnUiThread(Runnable).View.post(Runnable)或者Handler.sendMessage()的方法. 这样做有可能引发内存泄露.避免内存泄露的方案,使用Handler.post()和Handler.obtainMessage().sendToTarget(): 1 2 3 4 5 6 7 8 9 10 11 12 13 14

三种方案实现日志记录功能

三种方案实现日志记录功能 方案一.使用拦截器实现日志记录功能 步骤一.首先需要我们自定义一个注解类 package cn.hmy.Util; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * 自定义操作日志注解接口类

保证分布式系统数据一致性的6种方案

保证分布式系统数据一致性的6种方案 数据的一致性协议有: 1.  两阶段提交协议  2PC 2.  三阶段提交协议  3PC 3.  RWN协议 4.  raft协议 5.  Paxos协议  参考下面网址:      http://chuansong.me/n/286764951149

C#技术分享【PDF转换成图片——13种方案】(2013-07-25重新整理)

原文:C#技术分享[PDF转换成图片--13种方案](2013-07-25重新整理) 重要说明:本博已迁移到 石佳劼的博客,有疑问请到 文章新地址 留言!!! 写在最前面:为了节约大家时间,撸主把最常用的方法写在第一条,如果不满足您的需要,您可以继续往后看. 如果看完全文还是不能解决您的问题,欢迎加撸主的QQ群(274281457)进行讨论. 木有csdn分的童鞋,可以去github clone,地址:https://github.com/stone0090/OfficeTools.Pdf2Im