zoukankan      html  css  js  c++  java
  • 15分钟学会Lua

    lua的很多语法跟matlab很像
    最基本的赋值是一样的
    循环和选择判断后面必须跟一个关键字:do和then
    for i =1,1,100 do
    ...
    end
    ifthenend
    table是lua的唯一一种数据结构,但是可以用它来构造数组、链表、字典等。
    -- Dict literals have string keys by default:
    t = {key1 ='value1', key2 =false}
    -- String keys can use js-like dot notation:
    print(t.key1)-- Prints 'value1'.
    增加新的key
    t.newKey = {}-- Adds a new key/value pair.
    t.key2 =nil-- Removes key2 from the table.

    可以用任何数据作为key。但是一般如果用table作为key的话,它是通过严格判断两个table是否相同,有时候会查不到你想要的key

     
    for key,val in pairs(table) do
    print(key,val)
    end
    
    _G 是一个特殊的table,它里面存储所有的全局变量
    #v表示v这个list的数量
     
    -- 默认以字符串作为 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 值,老老实实用字串或数字
     
    ----------
    -  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(...)
    ----------
    - 类风格的 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"
     
    ----------
    - 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!"
     
  • 相关阅读:
    [2021.8集训Day10/JZOJ.3410]【GDOI2014模拟】Tree
    [2021.8集训Day10/JZOJ.3441]【NOIP2013模拟】小喵喵的新家
    [模板]模拟退火 / 洛谷 P1337 [JSOI2004]平衡点
    P1600 [NOIP2016 提高组] 天天爱跑步
    P4556 [Vani有约会]雨天的尾巴 /【模板】线段树合并
    selenium的三种等待
    python中socket、socketio、flask-socketio、WebSocket的区别与联系
    (十二)python3 迭代器
    (十一)python3 encode()和decode()
    (十)python3 生成器
  • 原文地址:https://www.cnblogs.com/crossing/p/5999512.html
Copyright © 2011-2022 走看看