为什么io \ open不能用于moonscript?

时间:2015-02-12 13:36:59

标签: lua moonscript

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

2 个答案:

答案 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:openio函数允许被称为成员的唯一地方是当您要读取/写入stdio时。

  

但是当您调用它来读取文件时,它可以吗?

因为它现在是文件的 member 方法。您实际上仍然在使用io.read,但是文件对象具有io作为元索引,因此,允许您通过file.read访问此函数,并且自file\read!起等同于file.read(file)


因此,答案基本上可以归结为“因为io:open在Lua中不起作用”。