Почему io\open не работает в 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

1 ответ

io.open Функция ожидает получить строку в качестве первого аргумента, но io\open (лайк io:open в самом Луа) фактически проходит io таблица в качестве первого аргумента. То есть это вызов метода.

io\open("file", "mode")/io:open("file", "mode") являются синтаксическим сахаром для io.open(io, "file", "mode"),

Вот почему file\read! работает без явного аргумента, потому что file передается в качестве первого аргумента read("file", "format") функция.

Moonscript использует \ вызывать методы

для вызова методов- членов. как вa\b c, ... переводится на a.b(a,c,...).

здесь это не работает, потому что io.open статическая функция (io.open(what,how)), а не член (io.open(self,what,how)).

ты не мог позвонить io:openв Lua тоже. единственное место гдеio функции позволяют вызывать в качестве членов, когда вы хотите читать / писать stdio.

но когда вы вызываете его для чтения файла, он делает?

потому что теперь это метод- член файла. вы на самом деле все еще используетеio.read есть, но у файлового объекта есть io как метатабильный индекс, что позволяет вам получить доступ к той же функции через file.read, и с тех пор file\read! переводится на file.read(file) это то же самое.


так что по сути ответ сводится к "потому что io:open не работает в Lua".

Другие вопросы по тегам