Почему 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".