`
runfeel
  • 浏览: 936092 次
文章分类
社区版块
存档分类
最新评论

lua的学习笔记

 
阅读更多

前一段时间在看《Programming in Lua, 2Nd Edition》,纪录了一些代码:

local function languageTest() 
	-- table test
	local names = {"Peter", "Paul", "Mary"}
	local grades = {Mary=10, Paul=7, Peter=8}
	table.sort(names, function(n1, n2) 
		return grades[n1] > grades[n2]
	end)
	for i=1, #names do
		print(names[i])
	end
	
	-- function test
	local function newCounter(name)
		local i = 0
		return function()
				i = i+1
				return name .. ":" .. i
			end
	end
	
	local c1 = newCounter("c1")
	local c2 = newCounter("c2")
	
	print(c1())
	print(c1())
	print(c2())
	print(c1())
	print(c2())
	
	-- for test
	local function values(t)
		local i = 0;
		return function() i=i+1; return t[i] end
	end
	for elm in values(names) do
		print(elm)
	end
	
--	-- for test2
--	for k in pairs(names) do
--		print(k)
--	end
end

local function tableTest() 
	local Set = {}
	local mt = {}
	
	-- create a new set with teh values of the given list
	Set.new = function(l)
		local set = {}
		setmetatable(set, mt)
		for _, v in ipairs(l) do set[v] = true end
		return set;
	end
	
	Set.union = function(a, b)
		if getmetatable(a) ~= mt or getmetatable(b) ~= mt then
			error("attempt to 'add' a set with a non-set value", 2);
		end
		local res = Set.new {}
		for k in pairs(a) do res[k] = true end
		for k in pairs(b) do res[k] = true end
		return res
	end
	
	Set.intersection = function(a, b)
		local res = Set.new {}
		for k in pairs(a) do 
			res[k] = b[k]
		end
		return res
	end
	
	Set.tostring = function(set)
		local l = {}
		for e in pairs(set) do 
			l[#l+1] = e
		end
		return "{" .. table.concat(l, ", ") .. "}"
	end
	
	Set.print = function(s)
		print(Set.tostring(s))
	end
	
	mt.__add = Set.union
	mt.__mul = Set.intersection
	mt.__tostring = Set.tostring
	mt.__le = function(a, b)
		for k in pairs(a) do 
			if not b[k] then return false end
		end
		return true
	end
	mt.__lt = function(a, b)
		return a<=b and not (b<=a)
	end
	mt.__eq = function(a, b)
		return a<=b and b<=a
	end
	
	
	local s1 = Set.new {10, 20, 30, 50}
	local s2 = Set.new {30, 1}
	local s3 = s1+s2+s2
--	local s3 = s1+s2+s2 + 8
	Set.print(s3)
	Set.print((s1+s2)*s1)
	
	s1 = Set.new{2, 4}
	s2 = Set.new{4, 10, 2}
	print(s1<=s2)
	print(s1<s2)
	print(s1>=s2)
	print(s1>s2)
	print(s1==s2*s1)
	
	s1 = Set.new {10, 4, 5}
	print(s1)
	
--	mt.__metatable = "not your business"
--	print(getmetatable(s1))
--	setmetatable(s1, {})
	
	local Window = {} -- create a namespace
	--create teh prototype with default values.
	Window.prototype = {x=0, y=0, width=100, height=100}
	Window.mt = {} -- create a metatable
	--declare the constructor function
	function Window.new(o)
		setmetatable(o, Window.mt)
		return o
	end
	Window.mt.__index = function(table, key)
		return Window.prototype[key]
	end
--	Window.mt.__index = Window.prototype
	w = Window.new {x=10, y=20}
	print(w.x)
	
	
	-- Tables with default values
	local function setDefault(t, d)
		local mt = {__index = function() return d end}
		setmetatable(t, mt)
	end
	local tab = {x=10, y=20}
	print(tab.x, tab.z)
	setDefault(tab, 0)
	print(tab.x, tab.z)
	
	local mt = {__index = function(t) return t.___ end }
	local function setDefault(t, d)
		t.___ = d
		setmetatable(t, mt)
	end
	
	-- Tracking table accesses
	local t = {} -- original table (created somewhere)
	-- keep a private access to the original table
	local _t = t
	-- create proxy
	t = {}
	-- create metatable
	local mt = {
		__index = function(t, k)
			print("*access to element " .. tostring(k))
			return _t[k]
		end,
		
		__newindex = function(t, k, v)
			print("*update of element " .. tostring(k) .. " to " .. tostring(v))
			_t[k] = v -- update original table
		end
	}
	setmetatable(t, mt)
	t[2] = "hello"
	print(t[2])
	
	-- Read-only tables
	function readOnly(t)
		local proxy = {}
		local mt = {
			__index = t,
			__newindex = function(t, k, v)
				error("attempt to update a read-only table", 2)
			end
		}
		setmetatable(proxy, mt)
		return proxy
	end
	days = readOnly {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}
	print(days[1]) 
--	days[2] = "Noday"
end

local function objectTest()
	local Account = {
		balance = 0,
		new = function(self, o)
			o = o or {} -- create table is user does not provide one
			setmetatable(o, self)
			self.__index = self
			return o
		end,
		withdraw = function(self, v)
			if v>self.balance then error"insufficient funds" end
			self.balance = self.balance - v
		end,
		deposit = function(self, v)
			self.balance = self.balance + v
		end
	}
	
	local a = Account:new {balance = 0}
	a:deposit(100.00)
	print(a.balance)
	local b = Account:new()
	print(b.balance)
	b.balance = 123
	print(b.balance)
	b:withdraw(100)
	print(b.balance)
	print(a.balance)
	
	
	-- inheritance
	local SpecialAccount = Account:new({
		withdraw = function(self, v)
			if v - self.balance >= self:getLimit() then
				error"insufficient funds"
			end
			self.balance = self.balance - v
		end, 
		getLimit = function(self) 
			return self.limit or 0
		end
	})
	
	local s = SpecialAccount:new {limit=1000.00}
	s:deposit(100.00)
	s:withdraw(200.00)
	print("s:", s.balance)
end


local function main()
	languageTest();
	tableTest();
	objectTest();
end
main()


分享到:
评论

相关推荐

    lua学习笔记.txt

    lua学习笔记

    lua学习笔记

    自己学习lua记得笔记,做任务用的~很基础的东西,想要的拿走,免费

    Lua学习笔记之表达式

    【Lua学习笔记之表达式】 在Lua编程语言中,表达式是构成程序的基本元素,用于表示计算或逻辑操作。表达式的结果可以是一个值,也可以是一个布尔值,这取决于执行的操作。下面我们将深入探讨Lua中的各种表达式类型...

    Lua学习笔记之类型与值

    Lua的类型与值的学习笔记为我们提供了对这些基础知识的全面了解,对于Lua新手来说是一份宝贵的资料。通过这些知识点的学习,开发者可以更加有效地编写Lua程序,并在日常开发中避免一些常见错误。

    Lua学习笔记之函数、变长参数、closure(闭包)、select等

    Lua是一种轻量级的脚本语言,具有易于嵌入到应用程序中、支持面向过程和函数式编程、拥有灵活的变量作用域等特点。本文将介绍Lua中函数的基础用法、变长参数、closure(闭包)、以及select函数的使用,并结合代码...

    lua基础学习笔记

    ### Lua基础学习笔记 #### 一、Lua简介与特点 Lua是一种轻量级且高效的脚本语言,广泛应用于游戏开发、网页应用、图形界面等领域。对于已有其他编程语言基础的学习者来说,掌握Lua通常较为迅速。Lua的设计哲学是...

    lua (vc环境)学习笔记(学习代码)

    **lua (VC环境) 学习笔记** 在深入学习lua编程语言并将其应用于Microsoft Visual C++(VC环境)时,我们需要了解几个关键知识点。lua是一种轻量级的脚本语言,设计目标是作为嵌入式语言,使得游戏开发、系统管理、...

    lua基础笔记

    在“lua基础笔记”中,我们可以探索以下关键知识点: 1. ** Lua语法基础 **:Lua的语法简洁明了,易于学习。变量声明不需要指定类型,其数据类型包括数字(浮点数和整数)、字符串、布尔值、表(类似数组或哈希表)...

    cocos2dx_lua开发笔记

    【cocos2dx_lua开发笔记】是一篇个人实践总结,主要涵盖了使用cocos2dx_lua进行游戏开发的一些关键点,包括...通过学习和理解这些笔记,开发者能够更好地理解和运用cocos2dx_lua进行游戏场景、UI元素和动画效果的构建。

    lua (vc环境)学习笔记

    【Lua (VC环境) 学习笔记】 Lua是一种轻量级的、开源的脚本语言,主要用于嵌入式系统和游戏开发。它以其简洁的语法、高效性和易于集成的特点受到广泛欢迎。在VC(Visual C++)环境中使用Lua,可以为C++应用程序提供...

    Lua的table元表自我学习笔记

    Lua的table元表自我学习笔记分享。--lua元表总结 --1、__index的运用 (调用table的一个不存在的索引时,会使用到元表的__index元方法,搜索元表是否也有改索引,__index可以是一个函数也可是一个table。)

    lua_example:lua 面向对象的例子

    Lua学习笔记v1.0 通过__《Programming in Lua》__和**《Lua程序设计》**以及网上关于Lua的相关资料,进行学习整理,总结出这一份学习笔记。为后面的初学者提供参考。 本资料针对的是Lua5.1版本,5.2版本以后语法和库...

    Lua使用笔记

    这个"Lua使用笔记"的压缩包包含了三个文件:hello3.lua、hello.lua和hello2.lua,这些文件很可能是 Lua 的示例代码或练习脚本,通过它们我们可以学习和理解 Lua 的基本语法和特性。 首先,我们来看一下 Lua 的基础...

    cocos2dx-lua 笔记

    《Cocos2d-x Lua 开发笔记》 在游戏开发领域,Cocos2d-x 是一个广泛应用的开源游戏引擎,以其高效、跨平台的特点深受开发者喜爱。而 Lua 语言作为 Cocos2d-x 的主要脚本语言,因其简洁、易学的特性,使得游戏逻辑...

    个人对c++使用lua的一些笔记

    Lua是一种轻量级的嵌入式脚本语言,它的语法简洁且易于学习,而C++则以其强大的性能和灵活性著称。将两者结合可以让我们在C++程序中利用Lua的便利性编写脚本,进行逻辑控制或动态行为。 一、Lua与C++的交互 1. Lua ...

    自我学习笔记--LUA;python:网络编程等

    【标题】中的“自我学习笔记--LUA;python:网络编程等”表明这是一份包含LUA和Python语言,特别是关于网络编程的学习资料。LUA和Python都是编程语言,广泛应用于游戏开发、脚本编写、自动化任务以及网络服务等领域。 ...

    Lua基础应用笔记

    ### Lua基础应用知识点详解 #### 一、Lua简介与特性 ...以上内容覆盖了Lua的基本语法和常用操作,是学习Lua的入门必备知识点。对于从事Unity3D开发或者对Lua感兴趣的朋友来说,掌握这些内容将极大地提高编程效率。

    基于Java与HTML/CSS/Lua的Spring实战书籍学习笔记与源码分析

    本项目为《Spring实战》英文原版书籍的Java实现学习笔记与源码分析,包含186个文件,主要采用Java语言编写,辅以HTML、CSS、Lua等语言。文件类型多样,涵盖163个Java源文件、5个HTML文件、2个Git忽略文件、2个...

Global site tag (gtag.js) - Google Analytics