なんか流行ってますね……。
- 元ネタ: Can (a ==1 && a== 2 && a==3) ever evaluate to true?
- まとめ: (a==1&&a==2&&a==3)を常にtrueにするStackOverflowの問題を解いたQiita記事まとめ
ん?
いや……
できますよ!
コード
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」を実現しました。
おしまい。
-
元ネタのStack Overflowの回答の一つにあるコードを改変したもの。 ↩