• Lua程序设计(4th) 第一部分 语言基础


    前言(Programming in Lua(4th) 内容基于 Lua 5.3)

        虽然在某些方面 Lua 与其他语言有着共同的特色,但下面这些特征是 Lua 特有的:

            1. 可扩展;2. 简明;3. 高效;4. 可移植

        Lua 使用者分为三大类:

            1. 在应用中嵌入地使用;2. 单独使用 ;3. 和 C 一起使用。

        官方网站:http://www.lua.o

        用户社区:http://lua-users.org 

    第1章 Lua语言入门

        Chunk (程序段)是一组命令或表达式组成的序列。

        在prog.lua中第一行加入#!/usr/bin/lua,则可以直接执行:$ ./prog

        使用- i 参数可以让 Lua 语言解释器在执行完指定的程序段后进入交互模式: lua -i prog.lua

        在交互模式下运行 dofile("prog.lua") ,该函数会立即执行prog.lua

        -e 参数允许我们直接在命令行中输入代码 $ lua -e "print("hello")"

    第3章 数值

        Lua从 5.3 开始支持64位整型和双精度(最大值 2^53)浮点型。编译为精简Lua模式,则支持32位整型和单精度浮点型。在 Lua 5.2 及之前的版本中,所有的数值都以双精度浮点格式表示 。

        type(3)和type(3.0)都是"number",-3 == -3.0结果是true。

        math.type(3) 返回 integer,math.type(3.0)返回float。由此可区分整型和双精度

        如果两个操作数都是整型值,那么结果也是整型值;否则,结果就是浮点型值。

        但是除法运算操作的结果永远是浮点数。Lua 5.3 针对整数除法引入了一个称为floor 除法的新算术运算符“//”,从而保证结果是一个整数 。幂运算(^)结果是浮点数。

        数学库math含有:三角函数、指数函数、取整函数、max、min、floor、ceil、random、pi和huge(大多数平台上代表inf)。

    第4章 字符串

        字符串用于表示文本,Lua 语言中的字符串是不可变值( immutable value)。

        使用单引号声明字符串,双引号不用转义; 使用双引号声明字符串,单引号不用转义。

        多行字符串可用 [==[ 和 ]==] 声明,其中等号数量>=0。注释类似:-- [==[ 和 ]==] 。

        转义序列 z 会使字符串跳过其后的所有空白字符,直到遇到第一个非空白字符。

    第5章 表

        表是Lua 语言中最主要(事实上也是唯一的)和强大的数据结构。

        当被用作表索引时,任何能够被转换为整型的浮点数都会被转换成整型数 。例如,当执行表达式 a[2.0]=10 时,键 2.0 会被转换为 2 。

        通用构造器:

    --通过方括号括起来的表达式显式地指定每一个索引,
    --从而能使用负数索引,也能使用普通构造器不能使用的标识符作为索引
    opnames = {["+"] = "add", ["-"] = "sub", ["*"] = "mul", ["/"] = "div"}
    i = 20; s = "-"
    a = {[i + 0] = s, [i + 1] = s..s, [i + 2] = s..s..s}
    print(opnames[s])   -- > sub
    print(a[22])        -- > --- 
        序列 (sequence) 是由指定的n个正数数值类型的键所组成集合{ 1, ... , n }形成的表(值为 nil 的键实际不在表中)。
        Lua 语言提供了获取序列长度 的操作符 #,对于存在空洞(nil)的列表而言,序列取长度的操作符 # 是不可靠的。
    --使用 pairs 迭代器遍历表中的键值对, 遍历过程中元素的出现顺序可能是随机的,
    --相同的程序在每次运行时也可能产生不同的顺序。
    --对于列表而言,可以使用 ipairs。此时,Lua会确保遍历是按照顺序进行的。
    t = {10, print, x = 12, k = "hi"}
    for k, v in pairs(t) do
        print(k, v)
    end

         安全访问

    local a = {x = {y = {z = 10}}}
    local r = (((a or {}).x or {}).y).z
    print(r) --10
    r = (((a or {}).x or {}).y).x
    print(r) --nil

    第6章 函数

        当我们调用 f(g())时,如果 f 的参数是固定的,那么 Lua 语言会把 g 返回值的个数调整成与 f 的参数个数一致。 这并非巧合,实际上这正是多重赋值的逻辑。
        将函数调用用一对圆括号括起来可以强制其只返回一个结果:print((foo())) --> a
        table.pack 把参数列表转换成 Lua 语言中一个真实的列表(一个表),而 table.unpack 则把Lua语言中的真实的列表转换成一组返回值,进而可以作为另一个函数的参数被使用。

    第7章 输入输出

        应该避免使用 io.write(a..b..c),应该调用io.write(a,b,c),后者可以用更少的资源达到同样的效果,并且可以避免更多的连接动作。
    --可以使用函数 io.open 来打开一个文件,然后使用方法 read 和 write 从流中读取和向流中写入。
    local filename = "test.lua"
    local f = io.open(filename, "r")
    local t = f:read("a")
    print(t)
    f:close()
        库提供了三个预定义的 C 语言流的句柄 : io.stdin、 io.stdout 和 io.stderr。例如,
        可以使用如下的代码将信息直接写到标准错误流中:
    local message = "error message: ...
    "
    io.stderr:write(message)

        函数 io.input 和 io.output 允许混用完整 I/O 模型和简单 I/O 模型

    local temp = io.input() -- 保存当前输入流
    io.input("test.lua")    -- 打开一个新的当前输入流
    -- 对新的输入流进行某些操作
    print(io.input():read("l"))
    print(io.read("l"))     -- 作用同上一行
    io.input():close()      -- 关闭当前流
    io.input(temp)          -- 恢复此前的当前输入流
    io.input():close()      -- 关闭当前流

         获取和设置当前位置

    function fsize (file)
        local current = file:seek()    -- 保存当前位置
        local size = file:seek("end")  -- 获取文件大小
        file:seek("set", current)      -- 恢复当前位置
        return size
    end
    
    local filename = "test.lua"
    local f = io.open(filename, "a")
    f:seek("end")                      -- 定位到文件尾
    f:setvbuf("full")                  -- 设置全缓冲,其他(full/no/line)
    f:write("
    --append content")
    f:flush()                          --刷新流f
    --append content

         其他系统调用:

    print(os.getenv ("HOME")) -- > /home/lua
    os.execute("ls")
    --同函数 os.execute 一样,popen运行一条系统命令
    --但该函数还可以重定向命令的输入/输出
    local f = io.popen ("ls .", "r")
    for entry in f:lines() do
        print(entry)
    end
    os.exit(0)

    第8章 补充知识

        局部变量的作用域终止于声明变量的代码块中的最后一个有效(non-void)语句处,而标签被认为是无效(void)语句。
     1 local a = {1, 2, 3, 4}
     2 local i = 1
     3 while a[i] do
     4     if a[i] == 2 then
     5         i = i + 1
     6         goto continue --跳到了变量var的作用域外
     7     end
     8     print(a[i])
     9     i = i + 1
    10     local var = 8
    11     ::continue::
    12     --print(var) -- <goto continue> at line 6 jumps into the scope of local 'var'
    13     --print(i)   -- <goto continue> at line 6 jumps into the scope of local 'var'
    14 end
    15 
    16 --代码块中的标签对外不可见
    17 --goto continue    -- no visible label 'continue' for <goto> at line 17

      

  • 相关阅读:
    URL中的特殊字符 + % # & = ? /
    mvc 前端显示文本中的html标签处理
    URL中#号(井号)的作用
    自定义配置节 Section
    vshost.exe.config与.exe.config ;Debug目录与Release目录;bin目录与obj目录
    在MVC过滤器中获取触发的Controller、Action、参数 等
    js设置全局变量 ajax中赋值
    批处理 安装、卸载 window service
    [摘]HttpContext, HttpRequest, HttpResponse, HttpRuntime, HttpServerUtility
    摘要:ASP.NET的路由
  • 原文地址:https://www.cnblogs.com/yyqng/p/14351644.html
Copyright © 2020-2023  润新知