lua基础学习(翻译defsniky (@i小雨生))

--单行注释
--[[
[多行注释]
--]]
-1.变量&控制量
----------
num=23 --数字都是双精度
str='aspythonstring'--像Phython一样不可变
str="aspythonuse"--可以双引号
str=[[
   像Phython的多行注释可用于
   表示多行字符串一样
   方便
     ]]
bol=nil--未定义;支持垃圾回收
--缩进只为易读性,像Matlab一样以end结尾
while num<50 do
 num=num+1--没有++或者+=自增操作符号
 end
 -- IF条件开关
 if num>40 then
 print('>40')
 elseif s~='aspython' then --~=表示!=
     io.write('s is not aspython')--风骚的标准输出
     else
     thisIsGloal=5--驼峰式命名
     --显示声明局部变量(像javascript一样)
      local line=io.read()
      --..作为字符串连接符
      print('凛冬将至'..line)
      end
--引用未定义的变量将返回nil,这不是错误
foo=anUnknownVariable--等价于foo=nil
aBoolValue=false
--只有nil与false为假:数字0与空字串‘’为真!
if not aBoolValue then print('false') end
--像Python一样运用'or'和'and'
--得到C语言a?b:c的效果;需要b=false或nil的情况
ans=aBoolValue and 'yes'or'no'
karLSum=0
for i=1,100 do--像Matlab一样的递增语法,包含两端,如[1,100]
    karLSum=karLSum+i
end
--Step为2递减的方式'100,1,-2'
for j=100,1,-2 then print(j)end
--综上,范围可表示为“begin,end[,Step]”
--另一个循环控制
num=23
repeat
print('凡人必有一死')
num=num-1
until num=0
-2.函数
--------------
--递归
function fib(n)
if n<2then return 1 end
return fib(n-2)+fib(n-1)
end
a1=adder(9)
a2=adder(36)
print(a1(16))-->25
print(a2(64))-->100
--遇到不匹配的列表长度时
--过长的变量将被赋予nil
--过长的值将被忽略
x,y,z=1,2,3,4-->4将被忽略
function bar(a,b,c)
print(a,b,c)
return 4,8,15,16,23,42
end
x,y=bar('zaphod')
--x=4,y=8,其余值被忽略
--函数与其他类型一样为一等公民
--同样有Local/global之分
--像javascript一样定义
function f(x) return x*x end
f=function(x) return x*x end
print 'Hello World'--只有一个‘字符'参数时可以省略括号?
--------------
-3.表(Table)
--表示lua中唯一的复合类型
--像PHP中的数组或Javascript中的Object一样
--可用作list/dict/map
--默认以字符串作为Key
t={key1='value1',key2=false}
-像javascript一样以.取值
print(t.key1)-->"value1"
t.key3={}--加入新的键值对增
t.key2=nil --销毁一组键值对?
--理论上任何非nil的变量都可以作为key
u={['@!#']='qbert',[{}]=1729,[6.28]='tau'}
print(u[6.28])-->"tau"
a=u['@!#']--a='qbert'
b=u[{}]--b=nil;像javascript一样{}会创建新的对象
   --因此不要
--同字符串一样,只有一个表作为函数参数时可以省略号?
--为了一个括号增加阅读难度,得不偿失
function h(x) print(x.key1) end
h{key1='Sommi~451'}-->"Sonmi~451"
for key,val in paris(u) do --像Python一样的迭代
print(key,val)
end
--像javascript一样的全局作用域
_G
print(_G['_G']==_G)-->true
--省略key之后即可变身为list
--实际上是以递增自然数为key
v={'value1','value2',1.21,'gigawatts'}
for     i=1,#v do
print(v[i])
end
--------
-3.1 Metatables & Metamethods
----------
--元表(Metatable>就是表的表,像javascript的原型(prototype)一样
--为表重载一些元方法(Metamethods?
f1={a=1,b=2}
f2={a=2,b=3}
--s=f1+f2为错
mm={}
function mm.__add(x,y)
sum={}
sum.a=x.a+y.a
sum.b=x.b+x.b
return sum
end
setmeatable(f1,mm)
setmeatable(f2,mm)
--实际调用f1的metatable中的metatable中的__add(f1,f2)
--只为f1设置元表也可以
s=f1+f2--s={a=3,b=5}
--s2=s+s 为错,s未定义元表
--__index元方法重载表中key的提取符号'.'
--相当于继承的实现,在当前的table找不到值时,就会去找他继承的方法
defaultFavs={animal='gru',food='donuts'}
myFavs={food='pizza'}
setmeatable(myFavs,{__index=defaultFavs})
food=myFavs.food
--Lua中的值都具有原方法,只有Table可以重载
--所有元方法如下

--__add(a,b)    for a+b

--__sub(a,b)    for a-b

--__mul(a,b)    for a*b

--__div(a,b)    for a/b

--__mod(a,b)    for a%b

--__pow(a,b)    for  a^b

--__unm(a)      for -a

--__concat(a,b) for a..b

--__Len(a)      for #a

--__eq(a,b)     for a==b

--__lt(a,b)     for a<b

--__le(a,b)     for a<=b

--__index(a,b)  for a.b

--__newindex(a,b,c) for a.b=C语言a

--__call(a,....) for a(...)

------
-3.2 类风格的Table与继承
------
Dog={}                              --1
function Dog:new()                 --2
newObj={sound='woof'}               --3
self.__index=self                   --4
return setmeatable(newObj,self)     --5
end
function Dog:makeSound()              --6
print('I say'self.sound)
end
mrDog=Dog:new()                        --7
mrDog:makeSound()-->"I say wwoof"

--1.Dog像类但实际上是Table
--2.Dog:new(...):=Dog.new(self,..)
--3.newObj作Dog的实例
--4.self是Lua中默认的参数,在这里self=Dog
--继承的时候可以改变
--self.__index与self的元方法__index不是一回事
--self={__index=self,metatable={__index=...}}
--5.setmeatable(newObj,self)相当于setatable(newObj,{__index=self})
--赋予实例所有类方法
--6.同2.
--mrDog=Dog=Dog.new(Dog)


--4
-------
--以下来自文件mod.lua
local M={}
local function  sayMyName()
   print('Hrunkner')
end
function M.sayHello()
print('Why Hello there')
 sayMyName()--给这个方法再加一个方法(个人理解)
 end
return M
--以上
--回到主文件mod
local mod=require('mod')--运行mod.lua中的代码
--操作同下
local  mod=(function()
--像javascript一样
--[[
mod.lua中的代码
]]--
end
)()
mod.sayHello()-->"Why Hello there"
mod.sayMyName()-->错!sayMyName()是mod.lua中的局部变量
--require 返回的值将被缓存
--即使多次调用require被调用文件也只运行一次
--mod2.lua包含print("mod2")
local a=require("mod2")-->"mod2"
local b=require("mod2")--不输出,实际为b=a
--dofile 是不缓存的版本的require
dofile("mod2")-->"mod2"
dofile("mod2")-->"mod2"
--loadfile 读取文件但不执行
--勘误:f=loadfile('mod2'),需要加后缀名,否则找不到文件
f=loadfile('mod2.lua')
f()-->"mod2"
--Loadstring 读取代码字符串
f=loadstring("print('lua is cool!')")
f()-->"Lua is cool"
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值