Lua - не может получить доступ к значению ключа. Всегда возвращает таблицу

Итак, я столкнулся с несколькими идентичными проблемами с Eclipse, Lua и Love2D.

В этих случаях я создал таблицу, скажем, шрифты. Это в main.lua. В fonts{} я создаю пары ключей следующим образом:

fontsize = 24
gFonts{
    ['smallFont'] = love.graphics.newFont('fontfile.ttf', fontsize)
}

Затем я пытаюсь получить высоту шрифта позже, используя Love2D font.getHeight(self). Я делаю это так:

local fontSize = gFonts['smallFont'].getHeight(self)

Но это не работает. Он говорит мне, что getHeight ожидает Шрифт, но я даю ему Таблицу. Это явно неправда, потому что Eclipse вызывает автозаполнение для getHeight:Font, когда я нажимаю точку после gFonts['smallFont'].

Затем я попытался присвоить smallFont переменной с именем msgFont и получить доступ к getHeight из нее. Нет, не сработало. Я даже стер "я". Нет исправления.

Я также попробовал love.graphics.getHeight(fontcodehere), и это вроде как работает... но захватывает высоту всего окна, а не шрифт.

Мне удалось заставить его работать, но я не понимаю, почему это работает и зачем нужна двойная ссылка на шрифт. Я использовал:

local msgFont = gFonts['small']
local fontSize = msgFont.getHeight(gFonts['small'])

Почему это работает? Я так понимаю msgFont часть или поставить шрифт в getHeight - отдельно... Но зачем их нужно использовать вместе?

Разве это не так?

table['key'] == 'value'

?

Почему он возвращает таблицу, а не объект/реестр шрифта Love2D? И зачем мне звонить

getHeight() а сам передать как таблицу?

Почему я не могу позвонить

getHeight() и передать самому?

Извините, если это глупый вопрос - у меня никогда не было формального образования в области программирования, и у меня такое чувство, что это как-то связано с областью действия, которую я просто не понимаю должным образом. Может быть, self имеет в виду не шрифт, а getHeight? Как это работает?


person John Lardinois    schedule 11.08.2018    source источник
comment
Попробуйте gFonts['smallFont']:getHeight().   -  person lhf    schedule 11.08.2018
comment
Боже мой... Я абсолютный идиот. Я не могу не смеяться. Это всегда самые простые вещи.   -  person John Lardinois    schedule 11.08.2018


Ответы (2)


Lua не предоставляет объектно-ориентированную систему, но предоставляет необязательный синтаксис, который немного упрощает ее использование.

«Метод» — это функция, в которую передается контекст таблицы. Это вопрос намерений. Во всем остальном это обычная функция.

Его можно определить с помощью синтаксиса function expression : identifier ( … ). Если да, то существует неявный первый формальный параметр с именем self.

Его можно вызывать с синтаксисом expression : identifier ( … ). Если это так, значение expression передается в качестве первого фактического аргумента.

getHeight — это функция, которой нужен контекст. Так,

gFonts['small']:getHeight()

что то же самое, что:

local msgFont = gFonts['small']
msgFont.getHeight(msgFont)

который фактически такой же, как ваш:

local msgFont = gFonts['small']
local fontSize = msgFont.getHeight(gFonts['small'])

Кстати, поскольку «маленький» является допустимым идентификатором, вы можете написать:

gFonts.small:getHeight()
person Tom Blodget    schedule 11.08.2018

Правильный вызов gFonts['smallFont']:getHeight().

person lhf    schedule 11.08.2018