• 《Lua程序设计》第5章 函数 学习笔记


    Lua为面向对象式的调用也提供了一种特殊的语法——冒号操作符。表达式o.foo(o, x)的另一种写法是o:foo(x),冒号操作符是调用o.foo时将o隐含地作为函数的第一个参数。
    Lua可以调用C语言编写的函数。
    5.1 多重返回值(multiple results)
    Lua允许函数返回多个结果。Lua的几个预定义函数就是返回多个值的。例如,用于在字符串中定位一个模式(pattern)的函数string.find。该函数若在字符串中找到了指定的模式,将返回匹配的骑士字符和结尾字符的索引。在此就需要使用多重赋值语句来接收函数的返回值。

    s, e = string.find("hello Lua users", "Lua")
    print(s, e)    --> 7   9

    unpack函数接受一个数组作为参数,并从下标1开始返回该数组的所有元素:

    print(unpack{10,20,30})    --> 10   20   30
    a,b = unpack{10,20,30}    --> a=10, b=20, 30被丢弃

    unpack的一项重要用途——泛型调用(generic call)。

    5.2 变长参数(variable number of arguments)
    “...”
    Lua中的函数还可以接受不同数量的实参。例:

    function add(...)
        local s = 0
        for i, v in ipairs{...} do
            s = s + v
        end
        return s
    end
    
    print(add(3, 4, 10, 25, 12))    --> 54

    参数列表中的3个点(...)表示该函数可接受不同数量的实参。当这个函数被调用时,它的所有参数都会被收集到一起。这部分收集起来的实参称为这个函数的“变长参数(variable arguments)”。一个函数要访问它的变长参数是,仍需用到3个点(...)。但不同的是,此时这3个点是作为一个表达式来使用的。在上例中,表达式{...}表示一个由所有变长参数构成的数组。而函数add遍历了该数组,并累加了每个元素。
    多值恒定式(multi-value identity)函数:function id(...) return ... end

    5.3 具名实参(named arguments)

    -- 无效的演示代码
    rename(old="temp.lua", new="temp1.lua")

    Lua并不支持这种语法,但可以通过一种细微的改变来获得相同的效果。主要是将所有实参组织到一个table中,并将这个table作为唯一的实参传给函数。另外,还需要用到一种Lua中特殊的函数调用语法,就是当实参只有一个table构造式时,函数调用中的圆括号是可有可无的:

    rename{old="temp.lus", new="temp1.lua"}

    另一方面,将rename改为只接受一个参数,并从这个参数中获取实际的参数:

    function rename(arg)
        return os.rename(arg.ld, arg.new)
    end

    若一个函数拥有大量的参数,而其中大部分参数是可选的话,这种参数传递风格会特别有用。例如在一个GUI库中,一个用于创建新窗口的函数可能会具有许多的参数,而其中大部分是可选的,那么最好使用具名实参:

    w = Window{ x = 0, y = 0, width = 300, height = 200,
                title = "Lua", background="blue",
                border = true
        }

    Window函数可以根据要求检查一些必填参数,或者为某些参数添加默认值。假设“_Window”才是真正用于创建新窗口的函数,它要求所有参数以正确的次序传入,那么Window函数可以这么写:

    function Window(options)
    -- 检查必要的参数
        if type(options.title) ~= "string" then
            error("no title")
        elseif type(options.width) ~= "number" then
            error("no width")
        elseif type(options.height) ~= "number" then
            error("no height")
        end
    
        -- 其他参数都是可选的
        _Window(options.title,
                options.x or 0, -- 默认值
                options.y or 0, -- 默认值
                options.width, options.height,
                options.background or "white",  -- 默认值
                options.border  -- 默认值
                )
    end
  • 相关阅读:
    一、逻辑架构与存储引擎
    三、动态SQL
    九、装饰者模式
    二、Mapper映射文件
    八、适配器模式
    测试开发系列之Python开发mock接口(二)
    测试开发系列之Python开发mock接口(三)
    html基础
    seleniumWebdriver浏览器驱动信息汇总
    用30行代码开发一个上传、下载文件的接口
  • 原文地址:https://www.cnblogs.com/moonlightpoet/p/5682086.html
Copyright © 2020-2023  润新知