日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

lua loadstring传递参数_lua学习之函数篇

發布時間:2023/12/4 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 lua loadstring传递参数_lua学习之函数篇 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

函數

  • 函數是對語句和表達式進行抽象的主要機制
  • 兩種用法

  • 一是可以完成特定的任務,一句函數調用被視為一條語句
  • 二是以只用來計算并返回特定的結果,視為一句表達式
  • print("Hello, World")a = math.sin(3) + math.cos(10)print(os.date())?
  • 無論哪種用法都需要將所有參數放到一對圓括號中
  • 但如果參數是字面字符串或 table 構造式的話,可以放在括號中,也可以不放
  • 即使在調用函數時沒有參數,也必須有一個 () 空括號,如調用 os.date()
  • print "Hello, World" -- 等價于 print("Hello, World")print {1, 2, 3} -- 等價于 print({1, 2, 3})?function add(a) ? ?local sum = 0 ? ?for i, v in ipairs(a) do ? ? ? sum = sum + v ? ?end ? ?return sumendb = {1, 2, 3}add(b)
  • function 是定義函數的關鍵字
  • add 是函數名
  • a 是函數的形式參數,是函數定義式參數列表中的參數
  • add(b) 調用這個函數所傳入的參數稱為實際參數
  • 調用函數的實際參數的個數可以與函數定義時的形式參數個數不同
  • lua 會自動調整實參的數量,以匹配參數表的要求,這和多s重賦值類似
  • 若實參少于形參,多余的形參被初始化為 nil
  • 若實參多余形參,多余的實參被拋棄
  • lua 程序既可以使用 以 lua 編寫的函數,也可使用 C 語言編寫的函數
  • function f(a, b) ? ?return a or bendf(3) -- a = 3, b = nilf(3, 4) -- a = 3, b = 4f(3, 4, 5) ?-- a = 3, b = 4 ,5 被丟棄了

    定義一個全局的計數器

    function intCount(n) ? ?n = n or 1 ?-- 賦值一個默認值 ? ?count = count + 1end

    面向對象式調用函數

  • o.foo(o, x)
  • o:foo(x) 等價于 o.foo(o, x)
  • 冒號操作符使得我們在調用 o.foo 時隱含地將 o 作為函數的第一個參數
  • 多重返回值

  • lua 允許函數返回多個結果
  • 如標準庫中的一些預定義函數
  • -- 用于在字符串中定位一個模式的函數 string.findprint(string.find("Hello Lua users", "Lua")) -- 開始的位置 7, 結束的位置 9
  • 在 return 后列出需要返回的所有值即可,用 , 逗號分隔
  • -- 查找數組中的最大元素,并返回這個元素的所在位置function maximum(a) ? ?local mi = 1 -- 最大值的索引 ? ?local max = a[mi] -- 最大值 ? ?for i,v ?in ipairs(a) do ? if v > max then ? ? ? ? ? ?mi = i ? ? ? ? ? ?max = v ? ? ? ?end ? ?end ? ?return max, miendmaximum(a) -- 沒有任何反應print(maximum({3, 4, 23, 5, 7}) ?-- 23 3print(maximum({3, 4, 23, 5, 7} .. "a") -- 23a
  • 如果將函數調用作為單獨的語句執行,lua 會丟棄所有的返回值
  • 如果將將函數作為表達式的一部分調用,只保留函數的第一個返回值
  • 只有當函數是一系列表達式中的最后一個元素(或只有一個元素的時候),才會獲取所有的返回值
  • 一系列表達式在 Lua 中的 4 中情況

  • 多重賦值
  • 函數調用時傳入的實參列表
  • table 構造式
  • return 語句
  • 多重賦值

  • 在多重賦值中,如果一個函數調用是最后(或僅有)的一個表達式,lua 會保留盡可能多的返回值,用來匹配賦值的變量
  • 如果一個函數沒有返回值或沒有返回足夠多的返回值,那么 lua 會用 nil 來補充缺失的值
  • 如果一個函數調用不是一系列表達式中的最后一個元素,就只能返回一個值
  • 如果一個函數調用作為另一個函數調用的最后一個(或僅有的)實參的時候,第一個函數的所有返回值都會作為實參傳遞給另一個函數
  • function foo0() endfunction foo1() return "a" endfunction foo2() return "a", "b" end-- 多重賦值的4種情況-- 第一種情況x, y = foo2() -- x = "a" , y = "b"x = foo2() -- x = "a"x, y, z = 10, foo2() -- x = 10, y = "a", z = "b"-- 第二種情況x, y = foo0() -- x = nil, y = nilx, y = foo1() -- x = "a", y = nilx, y, z = foo2() -- x = "a", y = "b", z = nil-- 第三種情況x, y = foo2(), 20 -- x = "a", y = 20x, y = foo0(), 20, 30 -- x = nil, y = 20-- 第四種情況print(foo0()) -- 不會打印任何值print(foo1()) -- aprint(foo2()) -- a, bprint(foo2(), 20) -- a, 1print(foo2() .. "x") -- ax

    table 構造式

  • table 構造式可以完整地接收一個函數調用的所有結果,即不會有任何數量方面的調整
  • 但這種行為,只有當一個函數調用作為最后一個元素時才會發生
  • 其他位置上的函數調用總是只產生一個結果值
  • function foo0() endfunction foo1() return "a" endfunction foo2() return "a", "b" endt = {foo2()} -- t = {"a", "b"}t = {foo2(), "x"} -- t = {"a", "x"}?

    return

  • 將函數調用放入一對圓括號 () 中,使其只返回一個結果
  • return 語句后面的內容不需要 () 圓括號
  • 如果強行加上則會使一個多返回值的函數,強制其只返回一個 return(f())
  • function foo0() endfunction foo1() return "a" endfunction foo2() return "a", "b" endfunction foo(i) ? ?if i == 0 then return foo0() ? ? ? ?elseif i == 1 then return foo1() ? ? ? ?elseif i == 2 then return foo2() endendprint(foo(1)) -- aprint(foo(2)) -- a, bprint(foo(0)) -- 無返回值?-- () 包裹print((foo(1)) -- aprint((foo(2)) -- aprint((foo(0)) -- nil 不太懂為什么

    unpack 函數

  • 接收一個數組作為參數
  • 并從下標 1 開始返回該數組的所有元素
  • 這個預定義函數由 C 語言編寫
  • print(unpack{10, 20, 30}) -- 10 20 30a, b = unpack{10, 20, 30} ?-- a = 10, b = 20
  • 用于泛型調用
  • 泛型調用就是可以以任何實參來調用任何函數
  • -- 調用任意函數 f, 而所有的參數都在數組 a 中-- unpack 將返回 a 中的所有值,這些值作為 f 的實參f(unpack(a)) f = string.finda = {"hello", "ll"}f(unpack(a)) -- 3 4 等效于 string.find("hello", "ll")

    用 lua 遞歸實現 unpack

    function unpack(t, i) ? ?i = i or 1 ? ?if t[i] then ? ? ? ?return t[i], unpack(t, i + 1) ? ?endend

    變長參數

  • lua 中的函數可以接收不同數量的實參
  • 當這個函數被調用時,它的所有參數都會被收集到一起
  • 這部分收集起來的實參稱為這個函數的「變長參數」
  • ... 3個點表示該函數接收不同數量的實參
  • 一個函數要訪問它的變長參數時,需要用 ... 三個點,此時 ... 三個點是作為一個表達式使用的
  • 表達式 ... 三個點的行為類似一個具有多重返回值的函數,它返回的是當前函數的所有變長參數
  • 具有變長參數的函數也可以擁有任意數量的固定參數
  • 但固定參數一定要在變長參數之前
  • 當變長參數中包含 nil ,則需要用 select 訪問變長參數
  • 調用 select 時,必須傳入一個固定參數 selector(選擇開關) 和一系列變長參數
  • 如果 selector 為數字 n ,那么 select 返回它的第 n 個可變實參
  • 否則,select 只能為字符串 "#" ,這樣 select 會返回變長參數的總數,包括 nil
  • -- 返回所有參數的和function add(...) local s = 0 ? ?for i, v in ipairs{...} do -- 表達式{...}表示一個由變長參數構成的數組 ? ? ? s = s + v ? ?end ? ?return sendprint(add(3, 4, 5, 100)) -- 115?-- 調試技巧 ,類似與直接調用函數 foo ,但在調用 foo 前先調用 print 打印其所有的實參function foo1(...) ? ?print("calling foo:", ...) ? ?return foo(...)end??-- 獲取函數的實參列表function foo(a, b, c) endfunction foo(...) ? ? ? ?local a, b, c = ...end-- 格式化文本 string.format ,輸出文本 io.write-- 固定參數一定要在變長參數之前function fwrite(fmt, ...) ? ?return io.write(string.format(fmt, ...))endfwrite() -- fmt = nilfwrite("a") -- fmt = a fwrite("%d%d", 4, 5) -- fmt = "%d%d" , 變長參數 = 4, 5?for i = 1, select('#', ...) do ? ?local arg = select('#', ...) ? end

    具名參數

  • lua 中的參數傳遞機制是具有 「位置性」的
  • 就是說在調用一個函數時,實參是通過它在參數表中的位置與形參匹配起來的
  • 第一個實參的值與第一個形參相匹配,依此類推
  • 定義:通過名稱來指定實參
  • 可將所有的實參組織到一個 table 中,并將這個 table 作為唯一的實參傳給函數
  • lua 中特殊的函數調用語法,當實參只有一個 table 構造式時,函數調用中的圓括號是可有可無的
  • os.rename ?-- 文件改名,希望達到的效果 os.rename(old = "temp.lua", new = "temp1.lua")-- lua 不支持注釋的寫法rename = {old = "temp.lua", new = "temp1.lua"}function rename (arg) ? ?return os.rename(arg.old, arg.new)end?x = Window{x = 0, y = 0, width = 300, height = 200, title = "Lua", background = "blue", border = "true"}?-- 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) ~= "height" 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 -- 默認值為 false(nil) ? )

    總結

    以上是生活随笔為你收集整理的lua loadstring传递参数_lua学习之函数篇的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 国产视频第一页 | 水蜜桃色314在线观看 | 国产伦精品一区二区三区照片 | 免费观看国产精品 | 五月激情在线观看 | 国产精品女教师 | 欧美日韩久久久 | 国产成人免费 | h片在线观看 | 天天干狠狠爱 | 91在线视频免费看 | 亚洲情侣av | 激情第一页 | 中文字幕在线播 | 国产在线高清 | 久热这里有精品 | 亚洲激情网站 | 亚洲图片欧美视频 | 黄色小电影网址 | 男人捅爽女人 | www.嫩草.com | av免费在线观看不卡 | 在线播放少妇奶水过盛 | 无码人妻少妇伦在线电影 | 久久免费片 | 色噜噜狠狠一区二区 | 性xxxx欧美 | 日韩影音| 观看av免费 | 婷婷成人综合 | 国产精品亚洲成在人线 | 午夜黄色大片 | 窝窝午夜精品一区二区 | 色网站在线免费观看 | 亚洲免费看黄 | 美女在线免费视频 | 丁香婷婷在线观看 | 亚洲国产一区二区三区在线观看 | 波多野结衣视频播放 | 黄页免费视频 | 成人午夜久久 | 精品国自产在线观看 | 精品久久久久久亚洲综合网站 | 亚洲乱熟女一区二区 | 一区二区三区视频在线 | 国产日韩精品久久 | 午夜精品在线视频 | 18禁一区二区三区 | 国产精品探花一区二区三区 | 91精品国产一区二区在线观看 | 99久精品视频 | 性生交大片免费看女人按摩 | 日韩专区第一页 | 久久久久99人妻一区二区三区 | 青青草原亚洲视频 | 97人人爽人人爽人人爽 | 日本一二三区在线 | 久色精品 | 人操人视频| 亚洲福利久久 | 噜噜噜噜私人影院 | www久久 | 狠狠撸狠狠干 | 欧洲色网站 | 不卡的av在线 | 国产一级一区 | 午夜影音| 国产一伦一伦一伦 | 日批网址| 亚洲午夜激情视频 | 97精品在线 | 精品视频免费播放 | 在线免费观看污片 | 黄色大片视频网站 | 综合狠狠| 国产私拍| 成人调教视频 | 国产精品久久久久久久久久久久久久久 | 骚虎视频在线观看 | 久久99精品久久久水蜜桃 | 久久精品视频99 | 99久久久国产精品无码免费 | 青青草视频在线观看免费 | 国产精品黄色在线观看 | 91看毛片| 欧美视频在线一区二区三区 | wwwxxxx在线观看| 国产精品伦一区二区三区 | 污网站在线观看免费 | 人人精品久久 | 秋霞欧美一区二区三区视频免费 | 精品国产午夜福利在线观看 | 国产永久免费观看 | 自拍1页 | 韩国毛片一区二区 | 欧美日韩一区在线 | 一本久久综合亚洲鲁鲁五月天 | 久久亚洲免费视频 | 国产精品无码无卡无需播放器 |