Lua演習

and/orを使ったテクニック

Luaのand/orはただ単に真偽値を返すのではなく、なかなかに複雑な挙動を示す。
以下Lua5.0リファレンス2.5.3より引用

論理積演算子 and は、最初の引数が false か nil ならその値を返し、そうでなければ二番目の引数を返す。
論理和演算子 or は最初の引数が false か nil 以外ならその値を返し、そうでなければ二番目の引数を返す。
and と or は共にショートカット評価を行う。つまり、二番目のオペランドは、それが必要なときだけ評価される。

ということである。このand/orの「二番目の引数を返す」動作によって、いくつかの簡便な記述法が可能となる。

  • 初期化
    「もし変数が初期化されていなければ一定の値で初期化する」という命令を記述する場合、
    if arg == nil then arg = default_value end
    という記法に対して、
    arg = arg or default_value
    と書くことが可能となる。又、このイディオムを用いることで読み手は初期値の代入であると理解しやすくなる。
    尚、通常このイディオムは関数の引数が渡されなかった場合のデフォルト値を用意する方法として用いられる。
  • 3項演算子
    Luaは他の言語には多く備えられる三項演算子"?:"を持たないが、and/orのこの挙動を用いることでエミュレート可能である すなわち、以下のようにする。
    foo = flag and value1 or value2
    and演算子の方がorヨリも優先順位が高いため、flagが真であればfooにvalue1が代入され、偽であればvalue2が代入される。
    このイディオムも便利ではあるが、これ以外の形で用いると著しく可読性を損なうので注意が必要である。("(flag1 and flag2 and value1 or value2) or value 3"などは避けるべきである)
  • メソッド呼び出し
    オブジェクト志向の書き方をしている場合、"もしfooがnilでないならbarメソッドを呼び出す"ことが必要になる場合があるが、これについても
    ret = foo and foo:bar()
    等の記述によってif文を省略することが可能である。

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2020-11-08 (日) 23:13:56