【Lua】小ネタ

ラムダ式を作る

名前を付けずに関数を作ればいいと思っていましたが、Wikipedia先生によるとLuaは「すべての関数が本質的に無名関数」らしいです。

よくわからないので構文と例文だけ書いときます。

Luaでの無名関数の構文は以下です。

function(仮引数, ...) 処理A; ...; 処理Z end


例えば以下のように使えます。

-- 例:2乗する関数
(function(x) return x * x end)(5)
> 25

-- 例:テーブルのキーと値を全てprint
(function(tbl) for k, v in pairs(tbl) do print(k..':'..v) end end)({a = '123', b = '456'})
> a:123
> b:456

-- 当然変数への代入も可能
myFunc = function(x) return x * x end

3項演算子っぽいことをする

Luaに3項演算子は無いらしいので、andとor演算子の挙動を利用して3項演算子っぽいことをします。

構文は以下です。

条件式 and 真の時の値 or 偽の時の値


例えば以下のように使えます。

-- 数値型以外の場合は0に補正する三項演算子(もどき)
y = (type(x) == 'number') and x or 0

-- x = 123.456の時
print(y)
> 123.456

-- x = 'abcdef'の時
print(y)
> 0


因みにandとorの挙動は以下です。

論理演算子記述例意味
andx and yxが真の場合:yを返す
xが偽の場合:xを返す
orx or yxが真の場合:xを返す
xが偽の場合:yを返す
真:false, nil以外の値、偽:false, nil

初見は「??」ってなりました…

以下に日本語で整理しておきます。
(頭悪いとか言わないで自覚してるから)

x and y
xが偽の場合はyに関わらず偽なので偽(x)を返す
xが真の場合はyの真偽で決まるのでyを返す

x or y
xが真の場合はyに関わらず真なので真(x)を返す
xが偽の場合はyの真偽で決まるのでyを返す

参考

http://www.nct9.ne.jp/m_hiroi/light/lua03.html

https://ie.u-ryukyu.ac.jp/~e085739/lua.hajime.2.html

無名関数(Wikipedia)

Lua で3項演算子

コメント

タイトルとURLをコピーしました