Есть ли способ заблокировать итерацию таблицы в Lua 4.0?(или как запретить доступ к содержимому таблицы) - PullRequest
2 голосов
/ 20 апреля 2019

Я хочу заблокировать доступ к содержимому таблицы в Lua 4.01.К сожалению, я не могу перейти на Lua 5.xx.

Я думал о том, чтобы использовать метод тегов (старый механизм мета-метаданных / мета-метод Lua), но все еще возможно пройти таблицу, не вызывая методы-теги, используя цикл for (т. е. е в таблице делай ...).Это как оператор for использует rawget для доступа к содержимому таблицы.

Есть ли способ заблокировать доступ?Я знаю, что это было бы возможно с использованием C API, но это не совсем возможно для конечного пользователя.

Спасибо

1 Ответ

0 голосов
/ 20 апреля 2019

Использование таблицы как недооценки является способом контроля видимости данных.См. Видимость и значения в Справочном руководстве по Lua 4.0.

Ваши данные хранятся в таблице, локальной для функции.Эту таблицу нельзя увидеть вне этой функции.

Пример:

function a()
    local t = {data = 123}

    return function()
        print(t.data)
    end 
end

Тогда:

b = a()
b() -- prints “123”

Плохая практика - использовать буквы для функцииимена, но это помогает понять: b это просто таблица, возвращаемая из вызова a.Но этот b при вызове печатает данные, хранящиеся в локальной таблице a t. Нет другого способа доступа к t, поэтому вы можете контролировать доступ к таблице.Добавьте дополнительные функциональные возможности (сеттеры, геттеры, другие логики) к таблице возврата a для контроля доступа.

Другой пример

Отображение доступа к геттеру и сеттеру:

function a()
    local t = {data = nil}

    local function set(data)
        t.data = data
    end

    local function get()
        return t.data
    end

    return {
        set = set,
        get = get
    }
end

b = a()
b.set("abc")
print(b.get())
b.set(123)
print(b.get())

Печать:

abc
123
...