在 Lua 函数中指定数学环境

下面这个是有效的。

function userdata(x)
      local _ENV = math
      return (x)
  end
  print(userdata(math.sin(2)))

但下面这个是无效的。

function userdata(x)
      local _ENV = math
      return (x)
  end
  print(userdata(sin(2)))

如何避免在每个地方都输 .math?

点赞
用户1847592
用户1847592
使用 `setmetatable` 函数将 `_G` 表的元表设置为 `{__index = math}`,即在 `_G` 表中查找某个元素时,如果找不到就会去 `math` 表中查找。

定义了一个函数 `userdata(x)`,该函数的功能是返回函数参数 `x`。

输出 `sin(2)` 的结果,因为在 `_G` 表中查找这个函数找不到,所以会去 `math` 表中查找并执行该函数,最终返回结果。相当于执行 `userdata(math.sin(2))`。

输出 `max(3, pi)` 的结果,因为在 `_G` 表中查找这个函数找不到,而在 `_G` 的元表中已经指定了去 `math` 表中查找,所以会执行 `math.max(3, math.pi)` 并返回结果。相当于执行 `userdata(math.max(3, math.pi))`。
2020-01-16 05:25:15