转载自: https://blog.csdn.net/qq_15437667/article/details/75042526

 -- 单行注释
--[[
[多行注释]
--]] ----------
- . 变量 & 控制流
----------
num = -- 数字都是双精度
str = 'aspythonstring' -- 像 Python 一样不可变
str = "aspythonuse" -- 可以双引号
str = [[
像 Python 的多行注释可用于
表示多行字符串一样
方便
]] bol = nil -- 未定义;支持垃圾回收 -- 缩进只为易读性,像 Matlab 一样以 end 结尾
while num < do
num = num + -- 没有 ++ 或 += 自增操作符号
end -- IF 条件开关
if num > then
print('> 40')
elseif s ~= 'aspython' then -- ~= 表示 !=
io.write('s is not aspython') -- 风骚的标准输出
else
thisIsGlobal = -- 驼峰式命名
-- 显示声明局部变量(像 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 =
for i = , do -- 像 Matlab 一样的递增语法,包括两端,如同数学中[1, 100]
karlSum = karlSum + i
end -- Step 为 2 递减的方式 '100, 1, -2'
for j = , , - then print(j) end -- 综上,范围可表示为 "begin, end [, step]" -- 另一个循环控制
num =
repeat
print('凡人必有一死')
num = num -
until num == ----------
- . 函数
----------
function fib(n)
if n < then return end
return fib(n - ) + fib(n - )
end -- Javascript 一样的匿名函数与闭包
function adder(x)
-- 返回一个函数
-- 闭包内封存 x 值
return function (y) return x + y end
end
a1 = adder()
a2 = adder()
print(a1()) --> 25
print(a2()) --> 100 -- 遇到不匹配的列表长度时
-- 过长的变量将被赋予 nil
-- 过长的值将被忽略 x, y, z = , , , -- 4 将被忽略
function bar(a, b, c)
print(a, b, c)
return , , , , ,
end
x, y = bar('zaphod') --> "zaphod nil nil"
-- x = 4, y = 8, 其余值被忽略 -- 函数与其他类型一样为一等公民
-- 同样有 local/global 之分
-- 像 Javascript 一样定义
function f(x) return x * x end
f = function (x) return x * x end print 'Hello World!' -- 只有一个`字符串`参数时可省略括号 ----------
- . 表(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', [{}] = , [6.28] = 'tau'}
print(u[6.28]) --> "tau"
a = u['@!#'] -- a = 'qbert'
b = u[{}] -- b = nil;像 Javascript 一样 {} 会创建新的对象
-- 因此不要用蛋疼的 key 值,老老实实用字串或数字 -- 同字符串一样,只有一个表作为函数的参数时可以省略括号
-- 为了一个括号增加阅读难度,得不偿失
function h(x) print(x.key1) end
h{key1 = 'Sonmi~451'} --> "Sonmi~451" for key, val in pairs(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 = , #v do -- 像 Bash 一样,#v 表示列表长度
print(v[i]) -- 像 Matlab 一样,列表索引从 1 开始
end ----------
- 3.1 Metatables & metamethods
----------
-- 元表(metatable)就是表的表,像 Javascript 的原型(prototype)一样
-- 为表重载一些元方法(metamethods) f1 = {a = , b = }
f2 = {a = , b = }
-- s = f1 + f2 为错 mm = {}
function mm.__add(x, y)
sum = {}
sum.a = x.a + y.a
sum.b = x.b + y.b
return sum
end setmetatable(f1, mm)
setmetatable(f2, mm) -- 实际调用 f1 的 metatable 中的 __add(f1, f2)
-- 只为 f1 设置元表也可以
s = f1 + f2 -- s = {a = 3, b = 5} -- s2 = s + s 为错,s 未定义元表 -- __index 元方法重载表中 key 的提取符号 `.`
defaultFavs = {animal = 'gru', food = 'donuts'}
myFavs = {food = 'pizza'}
setmetatable(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) <fn or a table> for a.b
-- __newindex(a, b, c) for a.b = c
-- __call(a, ...) for a(...) ----------
- 3.2 类风格的 Table 与继承
---------- -- 像 Javascript 一样并没有内置 Class
-- 但可以通过 Table `{}` 实现 Dog = {} -- 1.
function Dog:new() -- 2.
newObj = {sound = 'woof'} -- 3.
self.__index = self -- 4.
return setmetatable(newObj, self) -- 5.
end
function Dog:makeSound() -- 6.
print('I say ' .. self.sound)
end mrDog = Dog:new() -- 7.
mrDog:makeSound() --> "I say woof" -- 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. setmetatable(newObj, self) 相当于 setmetatable(newObj, {__index = self})
-- 赋予实例所有类方法
-- 6. 同 2.
-- 7. mrDog = Dog.new(Dog) -- 继承
LoudDog = Dog:new()
function LoudDog:makeSound()
s = self.sound .. ' '
print(s .. s .. s)
end
seymour = LoudDog:new()
seymour:makeSound() --> "woof woof woof" ----------
- . 模块
---------- -- 以下来自文件 mod.lua
local M = {} local function sayMyName()
print('Hrunkner')
end function M.sayHello()
print('Why hello there')
sayMyName()
end
return M
-- 以上
-- 回到主文件
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!" ----------
- . 参考,略
----------

Lua语言15分钟快速入门的更多相关文章

  1. 转: Lua 语言 15 分钟快速入门

    看点: 1. 以很特殊的方式工,把Lua的语法全部输出一段,很容易让人记住..不错 转: http://blog.jobbole.com/70480/

  2. Python语言十分钟快速入门

    Python(蟒蛇)是一种动态解释型的编程语言.Python可以在Windows.UNIX.MAC等多种操作系统上使用,也可以在Java..NET开发平台上使用. AD:[51CTO技术沙龙]移动时代 ...

  3. [没接触过kubevirt?]15分钟快速入门kubevirt

    @ 目录 本文介绍 前言 环境准备 详细版 搭建步骤 安装KubeVirt 安装virtctl客户端工具 创建VirtualMachine 启动VirtualMachineInstance 启动和停止 ...

  4. [易学易懂系列|rustlang语言|零基础|快速入门|(15)|Unit Testing单元测试]

    [易学易懂系列|rustlang语言|零基础|快速入门|(15)] 实用知识 Unit Testing单元测试 我们知道,在现代软件开发的过程中,单元测试对软件的质量极及重要. 今天我们来看看Rust ...

  5. Vue.js 60 分钟快速入门

    Vue.js 60 分钟快速入门 转载 作者:keepfool 链接:http://www.cnblogs.com/keepfool/p/5619070.html Vue.js介绍 Vue.js是当下 ...

  6. 不会几个框架,都不好意思说搞过前端: Vue.js - 60分钟快速入门

    Vue.js——60分钟快速入门   Vue.js是当下很火的一个JavaScript MVVM库,它是以数据驱动和组件化的思想构建的.相比于Angular.js,Vue.js提供了更加简洁.更易于理 ...

  7. [易学易懂系列|rustlang语言|零基础|快速入门|(28)|实战5:实现BTC价格转换工具]

    [易学易懂系列|rustlang语言|零基础|快速入门|(28)|实战5:实现BTC价格转换工具] 项目实战 实战5:实现BTC价格转换工具 今天我们来开发一个简单的BTC实时价格转换工具. 我们首先 ...

  8. [易学易懂系列|rustlang语言|零基础|快速入门|系列文章]

    简单易懂的rustlang入门教程. [易学易懂系列|rustlang语言|零基础|快速入门|(1)|开篇] [易学易懂系列|rustlang语言|零基础|快速入门|(2)|VCCode配置] [易学 ...

  9. 一分钟快速入门openstack

    一.它是什么,能干什么想认识一个事物,必须先弄明白它是什么,能干什么.首先说一下,openstack是一个搭建云平台的一个解决方案,说他不是个软件,但是我觉得说是一个软件,能够让大家认识更清晰些.op ...

随机推荐

  1. Linux系统zabbix_agentd客户端安装与配置

    标注:官网下载zabbix安装包(zabbix安装包里包含了zabbix_agentd客户端安装包,我们只选择zabbix_agentd客户端安装) zbbix官网下载地址:  http://www. ...

  2. smartSVN9.2.2 for mac 安装与破解

    原文链接:https://www.jianshu.com/p/bb87154e0459 近段时间使用svn进行项目管理,开始使用的是cornerstone,但是用过程中出现一个操作Bug,一.在xco ...

  3. Apple产品价钱分析

  4. Python break语句

    Python break语句:当运行到 break 语句时,终止包含 break 的循环语句. 注:无论判断条件是否达到 False 或 序列是否遍历完都会停止执行循环语句和该 break 下的所有语 ...

  5. 在Windows上安装MySQL(转整)

    MySQL安装 在Windows上安装MySQL.首先登录MySQL的官网下载安装包. 选择MySQL installer 这里选择第二个安装包下载即可. 下载完成之后就选择安装那个下载到的文件,基本 ...

  6. WPF 半透明 模糊效果 Aero效果(1)

    先看看效果图 目前网上找到了2种实现方式,一种是 .NET Framework4.5及以后有自带的 WindowChrome 效果,一种是 WindowsAPI  dwmapi.dll  ,但这两种在 ...

  7. PHP date_parse() 函数

    ------------恢复内容开始------------ 实例 返回一个包含指定日期的详细信息的关联数组: <?phpprint_r(date_parse("2013-05-01 ...

  8. PHP md5_file() 函数

    实例 计算文本文件 "test.txt" 的 MD5 散列: <?php高佣联盟 www.cgewang.com$filename = "test.txt" ...

  9. luogu P3829 [SHOI2012]信用卡凸包 凸包 点的旋转

    LINK:信用卡凸包 当 R==0的时候显然是一个点的旋转 之后再求凸包即可. 这里先说点如何旋转 如果是根据原点旋转的话 经过一个繁杂的推导可以得到一个矩阵. [cosw,-sinw] [sinw, ...

  10. datagrip安装与破解

    datagrip下载 从官网下载的dataGrip可以免费使用30天,如果已经破解过或者付费过的小伙伴可以跳过这个章节.对于未安装软件的小伙伴,博主这里收集了dataGrip的破解教程,扫描底部博主的 ...