Lua言語の条件式判定はややこしい

専門

Pythonだと、条件分岐は

if (expression):
  print("expression is true.")
else:
  print("expression is false.")

という書式でexpression真(True)になる条件は主に

数値文字列真偽値オブジェクト
not 0not “”Truenot None

となる。偏見ではあるがJava言語や他言語でも大体同じイメージ。

しかし、VimやAwesome WMの設定で用いているLua言語はここら辺が少々ややこしい。

条件分岐の制御構文自体は、

if (expression) then
  print("expression is true.")
else
  print("expression is false.")
end

といった書式で見慣れたものだ。ただし、expressionとなる条件は

数値文字列真偽値オブジェクト
すべてすべてtruenot nil

である。数値0であっても空文字であってもtrueが返ってくる。逆を言えば偽(flase)となるのはfalseまたはnilのときだけである。

また、未定義の変数もnilとなるので「存在するか不明なboolean型変数valの真偽判定をしたい」といった場合は、

not (val == nil)

または

val ~= nil

で判定する。(Lua言語での”not equal”は!=でなく~=であることにも注意)

他にも配列のインデクスが1から始まる、ArrayとHashの混同したテーブルといった初見で躓かせる仕様がLua言語には多い気がする。

余談ではあるけれど、NeoVimでLua言語のコメントのシンタックスハイライトが

-- [[
コメント
-- ]]

でも適用されるのは不具合だろうか。--[[で1トークン、]]までの複数行コメントアウトのはずだが空白を含んだ-- [[でも適用されてしまう。--自体は1行コメントアクトなのでコメント部分が実際には無視されない点以外で構文上のエラーが発生しないのがミソ。最初気づかなかった。

nvim-treesitterが悪さをしているのかもしれない。時間に余裕があるときに調べてみようと思う。

コメント

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