Moonscript使用\来调用方法,所以有人可以向我解释为什么下面的代码不起作用:
> file = ioopen("mix.exs", "rb")
[string "tmp"]:1: calling 'open' on bad self (string expected, got table)
但是当你调用它来读取文件时,它会呢?
> fileread!
"Code.ensure_loaded?(Hex) and Hex.start
io.open
函数期望获取字符串作为第一个参数,但ioopen
(如 lua 本身中的io:open
(实际上是将io
表作为第一个参数传递。也就是说,它是一个方法调用。
ioopen("file", "mode")
/io:open("file", "mode")
是io.open(io, "file", "mode")
的句法糖。
这就是为什么fileread!
在没有显式参数的情况下工作的原因,因为file
作为第一个参数传递给read("file", "format")
函数。
Moonscript 使用
调用方法
如 ab c, ...
转换为 a.b(a,c,...)
。
这在这里不起作用io.open
因为它是一个静态函数(io.open(what,how)
(,而不是成员(io.open(self,what,how)
(。
你也不能在Lua中调用io:open
。 io
函数允许作为成员调用的唯一地方是当您想要读/写 STDIO 时。
但是当你调用它来读取文件时,它会呢?
您实际上仍在使用io.read
,但是File对象已io
为元表索引,因此允许您通过file.read
访问相同的函数,并且由于fileread!
转换为file.read(file)
因此它是一回事。
所以基本上答案归结为"因为io:open
在 Lua 中不起作用"。