小女巫 发表于 2015-1-14 20:47:22

带来一篇Lua 说话 15 分钟疾速入门

欢迎大家来到仓酷云论坛!--两个横线开端单行的正文

--[[
加上两个[和]表现
多行的正文。
--]]

----------------------------------------------------
--1.变量和流掌握。
----------------------------------------------------

num=42--一切的数字都是double。
--别担忧,double的64位中有52位用于
--保留准确的int值;关于须要52位之内的int值,
--机械的精度不是成绩。

s=walternate--像Python那样的弗成变的字符串。
t="双引号也能够"
u=[[两个方括号
用于
多行的字符串。]]
t=nil--不决义的t;Lua支撑渣滓搜集。

--do/end之类的症结字标示出法式块:
whilenum<50do
num=num+1--没有++or+=运算符。
end

--If语句:
ifnum>40then
print(over40)
elseifs~=walternatethen--~=表现不等于。
--像Python一样,==表现等于;实用于字符串。
io.write(notover40
)--默许输入到stdout。
else
--默许变量都是全局的。
thisIsGlobal=5--平日用驼峰式界说变量名。

--若何界说部分变量:
localline=io.read()--读取stdin的下一行。

--..操作符用于衔接字符串:
print(Winteriscoming,..line)
end

--不决义的变量前往nil。
--这不会失足:
foo=anUnknownVariable--如今foo=nil.

aBoolValue=false

--只要nil和false是fals;0和都是true!
ifnotaBoolValuethenprint(twasfalse)end

--or和and都是可短路的(译者注:假如已足够停止前提断定则不盘算前面的前提表达式)。
--相似于C/js里的a?b:c操作符:
ans=aBoolValueandyesorno-->no

karlSum=0
fori=1,100do--规模包含两头
karlSum=karlSum+i
end

--应用"100,1,-1"表现递加的规模:
fredSum=0
forj=100,1,-1dofredSum=fredSum+jend

--平日,规模表达式为begin,end[,step].

--另外一种轮回表达方法:
repeat
print(thewayofthefuture)
num=num-1
untilnum==0



----------------------------------------------------
--2.函数。
----------------------------------------------------

functionfib(n)
ifn<2thenreturn1end
returnfib(n-2)+fib(n-1)
end

--支撑闭包及匿名函数:
functionadder(x)
--挪用adder时,会创立用于前往的函数,而且能记住变量x的值:
returnfunction(y)returnx+yend
end
a1=adder(9)
a2=adder(36)
print(a1(16))-->25
print(a2(64))-->100

--前往值、函数挪用和赋值都可使用长度不婚配的list。
--不婚配的吸收方会被赋为nil;
--不婚配的发送方会被疏忽。

x,y,z=1,2,3,4
--如今x=1,y=2,z=3,而4会被抛弃。

functionbar(a,b,c)
print(a,b,c)
return4,8,15,16,23,42
end

x,y=bar(zaphod)-->prints"zaphodnilnil"
--如今x=4,y=8,而值15..42被抛弃。

--函数是一等国民,可所以部分或许全局的。
--上面是等价的:
functionf(x)returnx*xend
f=function(x)returnx*xend

--这些也是等价的:
localfunctiong(x)returnmath.sin(x)end
localg;g=function(x)returnmath.sin(x)end
--localg可以支撑g自援用。

--趁便提一下,三角函数是以弧度为单元的。

--用一个字符串参数挪用函数,不须要括号:
printhello--可以任务。



----------------------------------------------------
--3.Table。
----------------------------------------------------

--Table=Lua独一的数据构造;
--它们是联系关系数组。
--相似于PHP的数组或许js的对象,
--它们是哈希查找表(dict),也能够按list去应用。

--按字典/map的方法应用Table:

--Dict的迭代默许应用string类型的key:
t={key1=value1,key2=false}

--String的key可以像js那样用点去援用:
print(t.key1)--打印value1.
t.newKey={}--添加新的key/value对。
t.key2=nil--从table删除key2。

--应用任何非nil的值作为key:
u={[@!#]=qbert,[{}]=1729,=tau}
print(u)--打印"tau"

--关于数字和字符串的key是依照值来婚配的,然则关于table则是依照id来婚配。
a=u[@!#]--如今a=qbert.
b=u[{}]--我们等待的是1729,然则获得的是nil:
--b=nil,由于没有找到。
--之所以没找到,是由于我们用的key与保留数据时用的不是统一个对象。
--所以字符串和数字是可用性更好的key。

--只须要一个table参数的函数挪用不须要括号:
functionh(x)print(x.key1)end
h{key1=Sonmi~451}--打印Sonmi~451.

forkey,valinpairs(u)do--Table的遍历.
print(key,val)
end

--_G是一个特别的table,用于保留一切的全局变量
print(_G==_G)--打印true.

--按list/array的方法应用:

--List的迭代方法隐含会添加int的key:
v={value1,value2,1.21,gigawatts}
fori=1,#vdo--#v是list的size
print(v)--索引从1开端!!太猖狂了!
end
--list并不是真实的类型,v照样一个table,
--只不外它有持续的整数作为key,可以像list那样去应用。




----------------------------------------------------
--3.1元表(metatable)和元办法(metamethod)。
----------------------------------------------------

--table的元表供给了一种机制,可以重界说table的一些操作。
--以后我们会看到元表是若何支撑相似js的prototype行动。

f1={a=1,b=2}--表现一个分数a/b.
f2={a=2,b=3}

--这个是毛病的:
--s=f1+f2

metafraction={}
functionmetafraction.__add(f1,f2)
sum={}
sum.b=f1.b*f2.b
sum.a=f1.a*f2.b+f2.a*f1.b
returnsum
end

setmetatable(f1,metafraction)
setmetatable(f2,metafraction)

s=f1+f2--挪用在f1的元表上的__add(f1,f2)办法

--f1,f2没有能拜访它们元表的key,这与prototype纷歧样,
--所以你必需用getmetatable(f1)去取得元表。元表是一个通俗的table,
--Lua可以经由过程平日的方法去拜访它的key,例如__add。

--不外上面的代码是毛病的,由于s没有元表:
--t=s+s
--上面的类情势的形式可以处理这个成绩:

--元表的__index可以重载点运算符的查找:
defaultFavs={animal=gru,food=donuts}
myFavs={food=pizza}
setmetatable(myFavs,{__index=defaultFavs})
eatenBy=myFavs.animal--可以任务!这要感激元表的支撑

--假如在table中直接查找key掉败,会应用元表的__index持续查找,而且是递归的查找

--__index的值也能够是函数function(tbl,key),如许可以支撑更多的自界说的查找。

--__index、__add等等,被称为元办法。
--这里是table的元办法的全体清单:

--__add(a,b)fora+b
--__sub(a,b)fora-b
--__mul(a,b)fora*b
--__div(a,b)fora/b
--__mod(a,b)fora%b
--__pow(a,b)fora^b
--__unm(a)for-a
--__concat(a,b)fora..b
--__len(a)for#a
--__eq(a,b)fora==b
--__lt(a,b)fora<b
--__le(a,b)fora<=b
--__index(a,b)<fnoratable>fora.b
--__newindex(a,b,c)fora.b=c
--__call(a,...)fora(...)




----------------------------------------------------
--3.2类作风的table和继续。
----------------------------------------------------

--类并非内置的;有分歧的办法经由过程表和元表来完成。

--上面是一个例子,前面是对例子的说明

Dog={}--1.

functionDog:new()--2.
newObj={sound=woof}--3.
self.__index=self--4.
returnsetmetatable(newObj,self)--5.
end

functionDog:makeSound()--6.
print(Isay..self.sound)
end

mrDog=Dog:new()--7.
mrDog:makeSound()--Isaywoof--8.

--1.Dog看上去像一个类;其实它完整是一个table。
--2.函数tablename:fn(...)与函数tablename.fn(self,...)是一样的
--冒号(:)只是添加了self作为第一个参数。
--上面的第7和第8条解释了self变量是若何获得其值的。
--3.newObj是类Dog的一个实例。
--4.self为初始化的类实例。平日self=Dog,不外继续关系可以转变这个。
--假如把newObj的元表和__index都设置为self,
--newObj就能够获得self的函数。
--5.记住:setmetatable前往其第一个参数。
--6.冒号(:)在第2条是任务的,不外这里我们希冀
--self是一个实例,而不是类
--7.与Dog.new(Dog)相似,所以self=Doginnew()。
--8.与mrDog.makeSound(mrDog)一样;self=mrDog。

----------------------------------------------------

--继续的例子:

LoudDog=Dog:new()--1.

functionLoudDog:makeSound()
s=self.sound..--2.
print(s..s..s)
end

seymour=LoudDog:new()--3.
seymour:makeSound()--woofwoofwoof--4.

--1.LoudDog取得Dog的办法和变量列表。
--2.经由过程new(),self有一个sound的keyfromnew(),拜见第3条。
--3.与LoudDog.new(LoudDog)一样,而且被转换成
--Dog.new(LoudDog),由于LoudDog没有new的key,
--不外在它的元表可以看到__index=Dog。
--成果:seymour的元表是LoudDog,而且
--LoudDog.__index=LoudDog。所以有seymour.key
--=seymour.key,LoudDog.key,Dog.key,要看
--针对给定的key哪个table排在后面。
--4.在LoudDog可以找到makeSound的key;这与
--LoudDog.makeSound(seymour)一样。

--假如须要,子类也能够有new(),与基类的相似:
functionLoudDog:new()
newObj={}
--初始化newObj
self.__index=self
returnsetmetatable(newObj,self)
end




----------------------------------------------------
--4.模块
----------------------------------------------------


--[[我把这部门给正文了,如许剧本剩下的部门就能够运转了

--假定文件mod.lua的内容是:
localM={}

localfunctionsayMyName()
print(Hrunkner)
end

functionM.sayHello()
print(Whyhellothere)
sayMyName()
end

returnM

--另外一个文件也能够应用mod.lua的函数:
localmod=require(mod)--运转文件mod.lua.

--require是包括模块的尺度做法。
--require等价于:(针对没有被缓存的情形;加入前面的内容)
localmod=(function()
<contentsofmod.lua>
end)()
--mod.lua就似乎一个函数体,所以mod.lua的部分变量对外是弗成见的。

--上面的代码是任务的,由于在mod.lua中mod=M:
mod.sayHello()--SayshellotoHrunkner.

--这是毛病的;sayMyName只在mod.lua中存在:
mod.sayMyName()--毛病

--require前往的值会被缓存,所以一个文件只会被运转一次,
--即便它被require了屡次。

--假定mod2.lua包括代码"print(Hi!)"。
locala=require(mod2)--打印Hi!
localb=require(mod2)--不再打印;a=b.

--dofile与require相似,只是不做缓存:
dofile(mod2)-->Hi!
dofile(mod2)-->Hi!(再次运转,与require分歧)

--loadfile加载一个lua文件,然则其实不许可它。
f=loadfile(mod2)--Callingf()runsmod2.lua.

--loadstring是loadfile的字符串版本。
g=loadstring(print(343))--前往一个函数。
g()--打印343;在此之前甚么也不打印。

--]]




----------------------------------------------------
--5.参考文献
----------------------------------------------------

--[[


我异常高兴的进修lua,重要是为了应用Löve2D游戏引擎来编游戏。这就是念头。
我在黑色枪弹四开端中lua编程生活的。
接着,我浏览了Lua官方编程手册。就是如今阶段。
在lua-users.org的文章也许异常值得看看。他的主题没有笼罩的是尺度库:
*stringlibrary
*tablelibrary
*mathlibrary
*iolibrary
*oslibrary

别的,这个文件是一个正当Lua;把它保留为learn.lua,而且用“lualearn.lua”运转。
首次在tylerneylon.com写文章,这也能够作为一个githubgist剧本。用Lua高兴的编程把!

--]]


欢迎大家来到仓酷云论坛!

精灵巫婆 发表于 2015-1-16 23:02:40

带来一篇Lua 说话 15 分钟疾速入门

说实话小时候没想过搞IT,也计算机了解也只是一些皮毛,至于什么UNIX,Linux,听过没见过,就更别说用过了。?

莫相离 发表于 2015-1-25 19:22:17

随着Linux技术的更加成熟、完善,其应用领域和市场份额继续快速增大。目前,其主要应用领域是服务器系统和嵌入式系统。然而,它的足迹已遍布各个行业,几乎无处不在。

若相依 发表于 2015-2-3 22:12:48

用户下达的命令解释给系统去执行,并将系统传回的信息再次解释给用户,估shell也称为命令解释器,有关命令的学习可参考论坛相关文章,精通英文也是学习Linux的关键。

灵魂腐蚀 发表于 2015-2-9 08:14:55

如果上面的措施没有解决问题,此时你就需要Linux社区的帮助了。 Linux的使用者一般都是专业人士,他们有着很好的电脑背景且愿意协助他人。

分手快乐 发表于 2015-2-27 06:25:44

Linux的成功就在于用最少的资源最短的时间实现了所有功能,这也是符合人类进化的,相信以后节能问题会日益突出。

活着的死人 发表于 2015-3-9 03:44:43

你需要提供精确有效的信息。Linux这并不是要求你简单的把成吨的出错代码或者数据完全转储摘录到你的提问中。

愤怒的大鸟 发表于 2015-3-16 23:29:02

这也正是有别的OS得以存在的原因,每个系统都有其自身的优点。?

第二个灵魂 发表于 2015-3-23 10:52:15

Linux最大的特点就是其开源性,这一点是十分难得的,这也是它能够存在到现在的原因之一。
页: [1]
查看完整版本: 带来一篇Lua 说话 15 分钟疾速入门