LINUX.ORG.RU

Lua и область видимости

 ,


0

1

В свете вот этого обсуждения:

Посоветуйте язык на замену QBasic

нашелся фреймверк на Lua, частично удовлетворяющий выставленным критериям. Называется love2d. Вот пример его кода:


-- Drawing text
function love.draw()
love.graphics.print(«Hello World!», 400, 300)
end

-- Drawing an image
function love.load()
whale = love.graphics.newImage(«whale.png»)
end

function love.draw()
love.graphics.draw(whale, 300, 200)
end

-- Playing a sound
function love.load()
sound = love.audio.newSource(«music.ogg»)
love.audio.play(sound)
end


Для начинающих слишком многословно. Хотелось бы вместо

love.graphics.print(«Hello World!», 400, 300)

Писать

print(«Hello World!», 400, 300)

А вместо

love.graphics.draw(whale, 300, 200)

Писать

draw(whale, 300, 200)

И вместо

love.audio.play(sound)

Писать

play(sound)

В сязи с чем вопрос: можно ли в Lua раскрывать области видимости хотя бы в одном модуле/файле, чтобы не писать каждый раз принадлежность метода объектам?

★★★★★


local print = love.graphics.print
local draw = love.graphics.draw

print("Hello World!", 400, 300)
draw(whale, 300, 200)

i-rinat ★★★★★ ()
Ответ на: комментарий от i-rinat

А так, чтобы все методы определенного класса разрешить одной строкой? Ну типа using namespace std в плюсах?

Xintrea ★★★★★ ()
Ответ на: комментарий от Xintrea

А так, чтобы все методы определенного класса разрешить одной строкой?

for k,v in pairs(love) do _G[k] = v end

Но не делай так никогда :)

И в Lua нет классов, нет объектов, нет пространств имён. Из типов есть nil, число, строка, функция, C-функция, userdata и таблица. Всё. Если нужно организовать что-то типа пространства имён, создают таблицу, а в неё засовывают функции. Глобальное пространство имён — тоже таблица, с ней можно работать так же, как и с остальными таблицами.

i-rinat ★★★★★ ()
Ответ на: комментарий от i-rinat

Чего?

local Table1 = {}
Table1.foo = 1

function Table1:bar()
 print( self.foo )
end

baz = Table.bar

baz() // wtf?

тут только два таких экземпляра, ты и какой-то вит — повелитель циклов и китайских языков, которые годами тусуются на околопрограммистских сайтах, и остаются с девственно-чистым мозгом.

anonymous ()
Ответ на: комментарий от anonymous

Чего?

Того. Посмотри в официальные доки по Lua, я список типов взял оттуда. Классов или объектов там нет.

local Table1 = {}

function Table1:bar(param)
   print("Table1:bar")
   print("   self = " .. tostring(self))
   print("   param = " .. tostring(param))
end

function bar(self, param)
   print("bar")
   print("   self = " .. tostring(self))
   print("   param = " .. tostring(param))
end

baz = Table1.bar
baz("1", "2")
bar("1", "2")

Определение функций через двоеточие — синтаксический сахар. Просто не нужно писать self параметром, а так это обычная функция.

i-rinat ★★★★★ ()
Ответ на: комментарий от i-rinat

в таком случае, откуда взялся этот вариант? Ты же тогда должен писать

local print = love.graphics.print
local draw = love.graphics.draw

print(love.graphics, "Hello World!", 400, 300)
draw(love.graphics, whale, 300, 200)
Какой смысл в твоей ахинее?

anonymous ()
Ответ на: комментарий от i-rinat

ты ведь не знаешь реализацию классов в общем случае, откуда тебе знать, как именно там определены методы, и как именно сам класс к ним обращается

anonymous ()
Ответ на: комментарий от anonymous

В Lua нет неявных хитростей с вызовами «методов», как в Python, например. Вместо этого есть синтаксический сахар — вызов через двоеточие.

Ты же тогда должен писать

А ты уверен? Ты явно проецируешь знание какого-то другого языка на Lua.

i-rinat ★★★★★ ()
Ответ на: комментарий от i-rinat

уверен

love = {}
Graphics = {a = 10}
function Graphics:print(b, c)
 print(self.a + b + c)
end

love.graphics = setmetatable({}, {__index = Graphics})

graphicsPrint = love.graphics.print

love.graphics:print(2, 3) -- 15
graphicsPrint(love.graphics, 2, 3) -- 15
graphicsPrint(love.graphics, 2, 3) -- 15
graphicsPrint(2, 3) -- wtf?

А еще уверен, что твое место явно не в этом треде. Лучше иди пообсуждай более лучшие темы. Например

гиганские дырявые диапазоны на чанки с одинаковым числом элементов. Все апдейты состояний завернуты в транзакции, так что...

idoit - очередь задач под ноду там ты без проблем найдешь собрата по разуму

anonymous ()
Ответ на: комментарий от anonymous

уверен

Погляди ещё раз в https://love2d.org/wiki/love.graphics.draw. Ты там двоеточия видишь? Это просто функции.

setmetatable

Я рад, что ты осилил немного метатаблиц. Но твои примеры кода никак не влияют на то, как устроено API библиотеки LÖVE. Сколько бы ты тут не старался.

i-rinat ★★★★★ ()
Ответ на: комментарий от i-rinat

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

anonymous ()
Ответ на: комментарий от anonymous

то есть, ты, прежде чем пользовать библиотеку, написать несколько строк кода, полностью ее штудируешь, и штудируешь все либы которая она использует

В Lua это не нужно делать. По вызову сразу видно, есть там двоеточие или нет. Я же уже писал, что двоеточия — синтаксический сахар. И ты в курсе, ведь примеры-то с двоеточием пишешь. Или ты пишешь под копирку, не задумываясь, как оно работает?

и при этом обобщаешь на весь язык?

В этом нет необходимости, для Lua есть официальное описание. Оно не большое.

Ну что же, я в тебе не ошибся, дорогой.

Воу-воу, специалисты в треде. Ты бы лучше свои знания на ответ ТС'у обратил, а не спорил со мной.

i-rinat ★★★★★ ()

Я обычно пишу в начале модуля local lg = love.graphics и затем использую lg.print и т.д.

PolarFox ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.