为什么MoonScript中的io\open无法使用?

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
点赞
用户258523
用户258523

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") 函数。

2015-02-12 14:23:39
用户668125
用户668125

Moonscript 使用 \ 来调用成员方法。例如 a\b c, ... 相当于 a.b(a, c, ...)

但是这里不能这样做,因为 io.open 是一个静态函数(io.open(what, how)) 而不是成员函数(io.open(self,what,how))。

在 Lua 中,你也不能使用 io:open。唯一可以将 io 函数作为成员调用的地方是读/写 stdio。

但是当你用来读文件的时候,为什么可以使用呢?

因为现在它是文件的成员方法。你实际上仍在使用 io.read,但是文件对象具有 io 作为 metatable 索引,因此允许您通过 file.read 访问相同的函数,并且因为 file\read! 相当于 file.read(file),所以是一样的。

因此,答案本质上归结为“由于 io:open 在 Lua 中不起作用”。

2019-08-15 12:37:47