### 函數的參數
#### 按值傳遞
lua函數的參數大部分是按值傳遞的。值傳遞就是調用函數時,實參把它的值通過賦值運算傳遞給形參,然后形參的改變和實參就沒有關系了。在這個過程中,實參是通過它在參數表中的位置與形參匹配起來的。
> 示例代碼:
~~~
function swap(a, b) --定義函數swap,函數內部進行交換兩個變量的值
local temp = a
a = b
b = temp
print(a, b)
end
local x = "hello"
local y = 20
print(x, y)
swap(x, y) --調用swap函數
print(x, y) --調用swap函數后,x和y的值并沒有交換
-->output
hello 20
20 hello
hello 20
~~~
在調用函數的時候,若形參個數和實參個數不同時,lua會自動調整實參個數。調整規則:若實參個數大于形參個數,從左向右,多余的實參被忽略;若實參個數小于形參個數,從左向右,沒有被實參初始化的形參會被初始化為nil。
> 示例代碼:
~~~
function fun1(a, b) --兩個形參,多余的實參被忽略掉
print(a, b)
end
function fun2(a, b, c, d) --四個形參,沒有被實參初始化的形參,用nil初始化
print(a, b, c, d)
end
local x = 1
local y = 2
local z = 3
fun1(x, y, z) -- z被函數fun1忽略掉了,參數變成 x, y
fun2(x, y, z) -- 后面自動加上一個nil,參數變成 x, y, z, nil
-->output
1 2
1 2 3 nil
~~~
#### 變長參數
上面函數的參數都是固定的,其實lua還支持變長參數。若形參為 ... ,表示該函數可以接收不同長度的參數。訪問參數的時候也要使用 ... 。
> 示例代碼:
~~~
function func(...) --形參為 ... ,表示函數采用變長參數
local temp = {...} --訪問的時候也要使用 ...
local ans = table.concat(temp, " ") --使用table.concat庫函數,對數組內容使用" "拼接成字符串。
print(ans)
end
func(1, 2) --傳遞了兩個參數
func(1, 2, 3, 4) --傳遞了四個參數
-->output
1 2
1 2 3 4
~~~
#### 具名參數
lua 還支持通過名稱來指定實參,這時候要把所有的實參組織到一個table中,并將這個table作為唯一的實參傳給函數。
> 示例代碼:
~~~
function change(arg) --change函數,改變長方形的長和寬,使其各增長一倍
arg.width = arg.width * 2
arg.height = arg.height * 2
return arg
end
local rectangle = { width = 20, height = 15 }
print("before change:", "width =", rectangle.width, "height =", rectangle.height)
rectangle = change(rectangle)
print("after change:", "width =", rectangle.width, "height =", rectangle.height)
-->output
before change: width = 20 height = 15
after change: width = 40 height = 30
~~~
#### 按址傳遞
當函數參數是table類型時,傳遞進來的是table在內存中的地址,這時在函數內部對table所做的修改,不需要使用return返回,就是有效的。我們把上面改變長方形長和寬的例子修改一下。
> 示例代碼:
~~~
function change(arg) --change函數,改變長方形的長和寬,使其各增長一倍
arg.width = arg.width * 2 --表arg不是表rectangle的拷貝,他們是同一個表
arg.height = arg.height * 2
end --沒有return語句了
local rectangle = { width = 20, height = 15 }
print("before change:", "width =", rectangle.width, "height =", rectangle.height)
change(rectangle)
print("after change:", "width =", rectangle.width, "height =", rectangle.height)
-->output
before change: width = 20 height = 15
after change: width = 40 height = 30
~~~
在常用基本類型中,除了table是按址傳遞類型外,其它的都是按值傳遞參數。
用全局變量來代替函數參數的不好編程習慣應該被抵制,良好的編程習慣應該是減少全局變量的使用。
- 序
- Lua簡介
- Lua環境搭建
- 基礎數據類型
- 表達式
- 控制結構
- if/else
- while
- repeat
- 控制結構for的使用
- break,return
- Lua函數
- 函數的定義
- 函數的參數
- 函數的返回值
- 函數回調
- 模塊
- String庫
- Table庫
- 日期時間函數
- 數學庫函數
- 文件操作
- 元表
- 面向對象編程
- FFI
- LuaRestyRedisLibrary
- select+set_keepalive組合操作引起的數據讀寫錯誤
- redis接口的二次封裝(簡化建連、拆連等細節)
- redis接口的二次封裝(發布訂閱)
- pipeline壓縮請求數量
- script壓縮復雜請求
- LuaCjsonLibrary
- json解析的異常捕獲
- 稀疏數組
- 空table編碼為array還是object
- 跨平臺的庫選擇
- PostgresNginxModule
- 調用方式簡介
- 不支持事務
- 超時
- 健康監測
- SQL注入
- LuaNginxModule
- 執行階段概念
- 正確的記錄日志
- 熱裝載代碼
- 阻塞操作
- 緩存
- sleep
- 定時任務
- 禁止某些終端訪問
- 請求返回后繼續執行
- 調試
- 調用其他C函數動態庫
- 我的lua代碼需要調優么
- 變量的共享范圍
- 動態限速
- shared.dict 非隊列性質
- 如何添加自己的lua api
- 正確使用長鏈接
- 如何引用第三方resty庫
- 使用動態DNS來完成HTTP請求
- 緩存失效風暴
- Lua
- 下標從1開始
- 局部變量
- 判斷數組大小
- 非空判斷
- 正則表達式
- 不用標準庫
- 虛變量
- 函數在調用代碼前定義
- 抵制使用module()函數來定義Lua模塊
- 點號與冒號操作符的區別
- 測試
- 單元測試
- API測試
- 性能測試
- 持續集成
- 灰度發布
- web服務
- API的設計
- 數據合法性檢測
- 協議無痛升級
- 代碼規范
- 連接池
- c10k編程
- TIME_WAIT問題
- 與Docker使用的網絡瓶頸
- 火焰圖
- 什么時候使用
- 顯示的是什么
- 如何安裝火焰圖生成工具
- 如何定位問題