前一段时间在看《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学习笔记
自己学习lua记得笔记,做任务用的~很基础的东西,想要的拿走,免费
【Lua学习笔记之表达式】 在Lua编程语言中,表达式是构成程序的基本元素,用于表示计算或逻辑操作。表达式的结果可以是一个值,也可以是一个布尔值,这取决于执行的操作。下面我们将深入探讨Lua中的各种表达式类型...
Lua的类型与值的学习笔记为我们提供了对这些基础知识的全面了解,对于Lua新手来说是一份宝贵的资料。通过这些知识点的学习,开发者可以更加有效地编写Lua程序,并在日常开发中避免一些常见错误。
Lua是一种轻量级的脚本语言,具有易于嵌入到应用程序中、支持面向过程和函数式编程、拥有灵活的变量作用域等特点。本文将介绍Lua中函数的基础用法、变长参数、closure(闭包)、以及select函数的使用,并结合代码...
### Lua基础学习笔记 #### 一、Lua简介与特点 Lua是一种轻量级且高效的脚本语言,广泛应用于游戏开发、网页应用、图形界面等领域。对于已有其他编程语言基础的学习者来说,掌握Lua通常较为迅速。Lua的设计哲学是...
**lua (VC环境) 学习笔记** 在深入学习lua编程语言并将其应用于Microsoft Visual C++(VC环境)时,我们需要了解几个关键知识点。lua是一种轻量级的脚本语言,设计目标是作为嵌入式语言,使得游戏开发、系统管理、...
在“lua基础笔记”中,我们可以探索以下关键知识点: 1. ** Lua语法基础 **:Lua的语法简洁明了,易于学习。变量声明不需要指定类型,其数据类型包括数字(浮点数和整数)、字符串、布尔值、表(类似数组或哈希表)...
【cocos2dx_lua开发笔记】是一篇个人实践总结,主要涵盖了使用cocos2dx_lua进行游戏开发的一些关键点,包括...通过学习和理解这些笔记,开发者能够更好地理解和运用cocos2dx_lua进行游戏场景、UI元素和动画效果的构建。
【Lua (VC环境) 学习笔记】 Lua是一种轻量级的、开源的脚本语言,主要用于嵌入式系统和游戏开发。它以其简洁的语法、高效性和易于集成的特点受到广泛欢迎。在VC(Visual C++)环境中使用Lua,可以为C++应用程序提供...
Lua的table元表自我学习笔记分享。--lua元表总结 --1、__index的运用 (调用table的一个不存在的索引时,会使用到元表的__index元方法,搜索元表是否也有改索引,__index可以是一个函数也可是一个table。)
Lua学习笔记v1.0 通过__《Programming in Lua》__和**《Lua程序设计》**以及网上关于Lua的相关资料,进行学习整理,总结出这一份学习笔记。为后面的初学者提供参考。 本资料针对的是Lua5.1版本,5.2版本以后语法和库...
这个"Lua使用笔记"的压缩包包含了三个文件:hello3.lua、hello.lua和hello2.lua,这些文件很可能是 Lua 的示例代码或练习脚本,通过它们我们可以学习和理解 Lua 的基本语法和特性。 首先,我们来看一下 Lua 的基础...
《Cocos2d-x Lua 开发笔记》 在游戏开发领域,Cocos2d-x 是一个广泛应用的开源游戏引擎,以其高效、跨平台的特点深受开发者喜爱。而 Lua 语言作为 Cocos2d-x 的主要脚本语言,因其简洁、易学的特性,使得游戏逻辑...
Lua是一种轻量级的嵌入式脚本语言,它的语法简洁且易于学习,而C++则以其强大的性能和灵活性著称。将两者结合可以让我们在C++程序中利用Lua的便利性编写脚本,进行逻辑控制或动态行为。 一、Lua与C++的交互 1. Lua ...
【标题】中的“自我学习笔记--LUA;python:网络编程等”表明这是一份包含LUA和Python语言,特别是关于网络编程的学习资料。LUA和Python都是编程语言,广泛应用于游戏开发、脚本编写、自动化任务以及网络服务等领域。 ...
### Lua基础应用知识点详解 #### 一、Lua简介与特性 ...以上内容覆盖了Lua的基本语法和常用操作,是学习Lua的入门必备知识点。对于从事Unity3D开发或者对Lua感兴趣的朋友来说,掌握这些内容将极大地提高编程效率。
本项目为《Spring实战》英文原版书籍的Java实现学习笔记与源码分析,包含186个文件,主要采用Java语言编写,辅以HTML、CSS、Lua等语言。文件类型多样,涵盖163个Java源文件、5个HTML文件、2个Git忽略文件、2个...