Moonscript使用\来调用方法,所以有人可以向我解释为什么下面的代码不起作用:
> file = io\open("mix.exs", "rb")
[string "tmp"]:1: calling 'open' on bad self (string expected, got table)
但是当你调用它来读取文件时呢?
> file\read!
"Code.ensure_loaded?(Hex) and Hex.start
答案 0 :(得分:3)
io.open
函数希望得到一个字符串作为第一个参数,但io\open
(如lua本身中的io:open
)实际上是将io
表作为第一个参数传递。这是一个方法调用。
io\open("file", "mode")
/ io:open("file", "mode")
是io.open(io, "file", "mode")
的语法糖。
这就是file\read!
没有显式参数的原因,因为file
作为read("file", "format")
函数的第一个参数传递。
答案 1 :(得分:0)
Moonscript使用
\
调用方法
调用 member 方法。 a\b c, ...
中的内容翻译为a.b(a,c,...)
。
这在这里不起作用,因为io.open
是静态函数(io.open(what,how)
),而不是成员(io.open(self,what,how)
)。
您也无法在Lua中呼叫io:open
。 io
函数允许被称为成员的唯一地方是当您要读取/写入stdio时。
但是当您调用它来读取文件时,它可以吗?
因为它现在是文件的 member 方法。您实际上仍然在使用io.read
,但是文件对象具有io
作为元索引,因此,允许您通过file.read
访问此函数,并且自file\read!
起等同于file.read(file)
。
因此,答案基本上可以归结为“因为io:open
在Lua中不起作用”。