首页 > 其他分享 >Lua 语言 15 分钟快速入门

Lua 语言 15 分钟快速入门

时间:2023-06-11 18:32:48浏览次数:39  
标签:__ function 15 入门 -- self Lua print end

-- 单行注释

--[[

   [多行注释]

--]]

----------

- 1. 变量 & 控制流

----------

num = 23 -- 数字都是双精度

str = 'aspythonstring' -- 像 Python 一样不可变

str = "aspythonuse" -- 可以双引号

str = [[

       像 Python 的多行注释可用于

       表示多行字符串一样

       方便

   ]]

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

   thisIsGlobal = 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 < 2 then return 1 end

   return fib(n - 2) + fib(n - 1)

end

-- Javascript 一样的匿名函数与闭包

function adder(x)

   -- 返回一个函数

   -- 闭包内封存 x 值

   return function (y) return x + y end

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')  --> "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!' -- 只有一个`字符串`参数时可省略括号

----------

- 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 一样 {} 会创建新的对象

         -- 因此不要用蛋疼的 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 = 1, #v do  -- 像 Bash 一样,#v 表示列表长度

   print(v[i])  -- 像 Matlab 一样,列表索引从 1 开始

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 + 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"

----------

- 4. 模块

----------

-- 以下来自文件 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!"

----------

- 5. 参考,略


标签:__,function,15,入门,--,self,Lua,print,end
From: https://blog.51cto.com/u_6186189/6458530

相关文章

  • WPF 入门笔记 - 03 - 样式基础
    ......
  • Luogu P4824 [USACO15FEB] Censoring S
    [USACO15FEB]CensoringS题面翻译FarmerJohn为他的奶牛们订阅了GoodHooveskeeping杂志,因此他们在谷仓等待挤奶期间,可以有足够的文章可供阅读。不幸的是,最新一期的文章包含一篇关于如何烹制完美牛排的不恰当的文章,FJ不愿让他的奶牛们看到这些内容。FJ已经根据杂志的所有文字,......
  • Xcode 15 beta (15A5160n) - Apple 平台 IDE
    Xcode15beta(15A5160n)-Apple平台IDEIDEforiOS/iPadOS/macOS/watchOS/tvOS/visonOS请访问原文链接:https://sysin.org/blog/apple-xcode-14/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgXcode15使您能够为所有Apple平台开发、测试和分发应用程序。......
  • Kong入门学习实践(1)基础概念快览
    最近在学习Kong网关,因此根据老习惯,我会将我的学习过程记录下来,一来体系化整理,二来作为笔记供将来翻看。由于我司会直接使用Kong企业版,学习过程中我会使用Kong开源版。什么是Kong?Kong的原意为金刚,用来形容强健、力量、坚固和稳定,可以想想电影中的金刚,也不难看出Kong的Logo是一只......
  • Laravel利用控制器传递参数心得(初始入门)
    2023-06-11 14:29:25有阅读有道云笔记https://note.youdao.com/s/7LhJ27j8 2023年6月9日07时33分44秒近期学习开始学习Laravel,遇到的问题是,如何通过一个blade模板文件,传递参数,并在第二个网页文件中显示出来?此时需要具备弄明白以下基础知识:①已经在搞懂创建控制器phpa......
  • 第15章 模版方法模式(Template Method)
    摘要:TemplateMethod模式是比较简单的设计模式之一,但它却是代码复用的一项基本的技术,在类库中尤其重要。 主要内容1.概述2.TemplateMethod解说3..NET中的TemplateMethod模式4.适用性及实现要点 概述变化一直以来都是软件设计的永恒话题,在XP编程中提倡拥抱变化,积极应对。如何更好的......
  • odoo 开发入门教程系列-模型和基本字段
    模型和基本字段在上一章的末尾,我们创建一个odoo模块。然而,此时它仍然是一个空壳,不允许我们存储任何数据。在我们的房地产模块中,我们希望将与房地产相关的信息(名称(name)、描述(description)、价格(price)、居住面积(livingarea)…)存储在数据库中。odoo框架提供了数据库交互的工具......
  • odoo 开发入门教程系列-一个新应用
    一个新应用房地产广告模块假设需要开发一个房地产模块,该模块覆盖未包含在标准模块集中特定业务领域。以下为包含一些广告的主列表视图form视图顶层区域概括了房产的重要信息,比如name,PropertyType,Postcode等等。列表记录详情页中,第一个tab包含了房产的描述信息,比如:bedrooms,Livi......
  • CMU15445 (Fall 2020) 数据库系统 Project#2 - B+ Tree 详解(上篇)
    前言考虑到B+树较为复杂,CMU15-445将B+树实验拆成了两部分,这篇博客将介绍Checkpoint#1部分的实现过程,搭配教材《DataBaseSystemConcepts》食用更佳。B+树索引许多查询只涉及文件中的少量记录,例如“找出物理系所有教师”的查询就只涉及教师记录中的一小部分,如果数据库......
  • 9.15 泛型通配符
    demo1“<?>“classMessage<T>{//定义泛型类对象privateTcontent;//泛型属性publicvoidsetContent(Tcontent){this.content=content;}publicTgetContent(){returnthis.content;}}publicclassHelloWorld{......