Lua

Luaでも a==1 and a==2 and a==3 をtrueにしてみたい

なんか流行ってますね……。

ん?

いや……

できますよ!

コード

aa = 0
setmetatable(_G, {
  __index = function(t, n)
    if n == 'a' then
      aa = (aa == 3) and 1 or (aa + 1)
      return aa
    end
  end
})

if a == 1 and a == 2 and a == 3 then
  print "True!"
end

※Lua5.1/5.2/5.3で動作確認。

解説

要するに、次のJavaScriptのコード1と同じ原理。

let aa = 0;
// 'global'はグローバルオブジェクト
Object.defineProperty(global, 'a', {
  get: function() {
    aa = (aa == 3) ? 1 : (aa + 1);
    return aa;
  }
});

if (a == 1 && a == 2 && a == 3) {
  console.log("True!");
}

Luaは次のような「JavaScriptと似た性質」を持っています。

  • Luaでは、グローバル変数とは「グローバルテーブルのキー」のことである。
  • テーブルのインデクス操作(キーに対する値を返す)はカスタマイズ可能。

これを利用して、「読み出す度に値が異なるグローバル変数a」を実現しました。

おしまい。


  1. 元ネタのStack Overflowの回答の一つにあるコードを改変したもの。