Почему загрузка модуля в локальную или глобальную переменную приводит к различным результатам в зависимости от модуля в Lua? - PullRequest
2 голосов
/ 10 марта 2020

Модуль lfs кажется доступным независимо от того, назначен ли он локальной или глобальной переменной:

> lfs = require 'lfs'
> print(type(lfs))
table
> local lfs = require 'lfs'
> print(type(lfs))
table

То же не происходит с md5:

> md5 = require 'md5'
> print(type(md5))
table
> local md5 = require 'md5'
> print(type(md5))
nil

Чем объясняется разница?

1 Ответ

1 голос
/ 10 марта 2020

Это потому, что lfs вызывает lua_setglobal(L, LFS_LIBNAME);, который устанавливает глобальную переменную lfs, поэтому он доступен даже тогда, когда вы делаете local lfs = require "lfs". md5 этого не делает.

Как отмечается в комментариях, если вы запускаете это из интерпретатора Lua, вам необходимо учитывать, что local виден только для той же строки, поэтому при работе > local a = 1 и >print(a) будет отображаться nil. Это не nil для lfs только потому, что он также устанавливает (неявно) глобальную переменную с тем же именем (как описано выше). Если вы запустите local mylfs = require "lfs", а затем print(mylfs), результаты для lfs и md5 будут одинаковыми.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...