作者:糖果

MoonScript库模板代码:

local *

configs = {}

config = (env, fn) ->
  print(env, fn)
  return 1


setmetatable {
    :config
}, {
    __call:(...) => config ...

Lua库模板代码:

local configs, config
configs = { }
config = function(env, fn)
  return 1
end
return setmetatable({
  config = config
}, {
  __call = function(self, ...)
    return config(...)
  end
})

MoonScript如何引用库

config = require "lib"

print(type(config))

for k,v in pairs(config)
    print(k,v)

config('pa', 'pb')
config:config('pa', 'pb')
config.config('pa', 'pb')
config\config('pa', 'pb')

Lua如何引用库

local config = require("lib")
print(type(config))
for k, v in pairs(config) do
  print(k, v)
end
config('pa', 'pb')
local _ = {
  config = config('pa', 'pb')
}
config.config('pa', 'pb')
return config:config('pa', 'pb')

返回结果

table
config  function: 0x11204b0
pa      pb
pa      pb
pa      pb
table: 0x10005c0        pa

注意一下“.”、“:”这两种调用的区别,“:”调用时会将自己作为第一个参数传给被
调用函数第一个形参。

上文提到的例子还是把函数作为元素包在table变量返回,而MoonScript本身是支持类的,所
以直接用class形式声明的库。

MoonScript类库模板代码:

class log
    @output: =>
        print("log")

Lua类库模板代码:

local log
do
  local _class_0
  local _base_0 = {
    output = function(self)
      return print("log")
    end
  }
  _base_0.__index = _base_0
  _class_0 = setmetatable({
    __init = function() end,
    __base = _base_0,
    __name = "log"
  }, {
    __index = _base_0,
    __call = function(cls, ...)
      local _self_0 = setmetatable({}, _base_0)
      cls.__init(_self_0, ...)
      return _self_0
    end
  })
  _base_0.__class = _class_0
  log = _class_0
  return _class_0
end

调用库

log = require "1lib"
print(type(log))
for k,v in pairs(log) 
    print(k,v)
log\output()

调用结果

table
__name  log
__init  function: 0x110a250
output  function: 0x110a0a0
__base  table: 0x10aa5b0
log

有了class关键字后,后发现require返回的变量依然是table,但多了几个变量,__name,
__init初始化函数,__base基类表,自定义函数output。

对于没有继承关系库用table方式封装库直接,需要类依赖的库用class相对方便一些,不过最终
一切类都是table转化形式。

本文请不要用于商业目地,非商业转载请署名原作者与原文链接。
https://www.moonscript.cn/lapis%E6%A1%86%E6%9E%B6/lapis-lib/