
Andrey
25.12.2017
16:35:40
Я тут сегодня забавное поведение у луа нашел
В астериске надо объявить таблицу extensions
В нее складывать контексты и экстены, контекст - вложенная в extensions таблица, а экстен уже ключ, на которую вешается функция
Суть в том, что в такую функцию попадает 2 аргумента - context и exten - то что дергает астериск.
Предположим я делаю в файле так:
function abc(context, exten)
end;
extensions = {}
extensions.default = {}
extensions.default.100 = abc;
Все работает на этой логике

Google

Snusmumriken
25.12.2017
16:39:05
Хе, карочи оно работает как колбеки?
module = {}
function module.foo(context, extension)
context.foo(10)
extension.foo = 20
end
context:setCallbacks(module) -- типа теперь он на события будет дёргать функции из этой таблички
Типа такого?
Или глобальную таблицу extensions пытается расковыривать?

Andrey
25.12.2017
16:40:18
НО! стоит мне вынести функции вынести в огтедльный файл и вгрузить его через dofile например так:
template = dofile(templates.lua)
extensions = {}
extensions.default = {}
extensions.default.100 = template.abc;
То в abc попадает только второй аргумент.
А если я в этом файле сделаю abc функцией которая возвращет функцию с тем же телом, то context снова появляется)

Snusmumriken
25.12.2017
16:41:46
Хе, вот это может быть неправильным использованием двоеточия obj:method().
Хм.
Но в целом, это неправильно, на месте должны быть все аргументы.
Проверь, не делаешь ли ты чего-то неправильного. Не объявляешь/перетираешь ли ты в templates что-то глобальное и т.п.

The Dude
25.12.2017
16:44:36

Andrey
25.12.2017
16:44:42
Неа. Я просто вынес все функции в файл, который возвращает таблицу из них

The Dude
25.12.2017
16:44:55
Ибо можно перезатирать значения.
Лучше возвращать таблицу с ключами = ключами из скоупа модуля.

Snusmumriken
25.12.2017
16:45:23

The Dude
25.12.2017
16:45:30

Google

Snusmumriken
25.12.2017
16:45:59
Ну а в примере как раз оно.
Библиотека возвращает локальную таблицу с функциями, и не делает ничо глобального.

The Dude
25.12.2017
16:46:15
https://blog.separateconcerns.com/2014-01-03-lua-module-policy.html
return { say = say, happy_greet = happy_greet, }
Лучше делать так.

Snusmumriken
25.12.2017
16:47:31
Ммм.
Ты имеешь ввиду что между
local function foo(x, y) ... end
return {foo = foo}
и
local M = {}
function M.foo(x, y) ... end
return M
есть разница?

The Dude
25.12.2017
16:47:34
Тогда у тебя появляются истинные локальные переменные и состояние.

Snusmumriken
25.12.2017
16:48:01
В первом варианте, истинными локальными работают функции.
А то что появляется состояние - это довольно часто необходимо.
Особенно когда твоя библиотека - КЛАСС.

The Dude
25.12.2017
16:48:51
The first thing we can notice is that we had to modify say in Hisham's module and not in mine. But now imagine a "malicious" user does this:
local bar = require "bar" local fishy_greet = function(greeting) print(greeting .. " ><>") end bar.happy_greet = fishy_greet bar.say("yay")
With my module, the output would be yay!!!! :-D. With Hisham's, the output would be yay ><>: the user is allowed to monkey patch their module in a way that has an effect on functions they do not explicitly touch.

Snusmumriken
25.12.2017
16:49:51
Ну, просто я не делаю библиотек "с функциями", я делаю библиотеки с классами-фабриками.
Их невозможно сделать иначе.

The Dude
25.12.2017
16:49:54
Кратко говоря.

Snusmumriken
25.12.2017
17:41:09
Кратко говоря, от одного замыкания на модуль - ничего страшного не будет, особенно учитывая кеширование на require.

Alxius
25.12.2017
20:56:50
Vyt мне вот интересно , Если я передам функции только 3 параметра, что она сделает с 4м? не тронет? (что хотелось бы) или запишет nil? function class_enemy:set(type,x2,y2,hp)
self.type = type;
self.x2 = x2;
self.y2 = y2;
self.hp = hp;

Vadim
25.12.2017
20:57:27
nil

Philipp
25.12.2017
20:57:41
Про это написано в PiL в главе про функции

Vadim
25.12.2017
20:57:55
default:
local hp = hp or 100

Alxius
25.12.2017
20:57:57
так и думал спасибо)
да не дефаулт надо. а просто не трогать

Google

Philipp
25.12.2017
20:58:10
Ты еще можешь прочитать про передачу неявного количества аргументов

Alxius
25.12.2017
20:58:23
уже читал и уже даже использовал. но nil меня тогда устраивал

Vadim
25.12.2017
20:58:26
local hp = hp or self.hp

Group Butler [beta]
26.12.2017
13:46:18
Добро пожаловать в чат pro.lua, Kirill! Ознакомься с правилами чата (в описании и прикрепленном сообщении), и присоединяйся к обсуждению.

Kirill
26.12.2017
13:47:20
Привет, ребята, я тут новенький в lua, функция len, которая решетка, какую имеет алгоритмическую сложность? O(n)?
Или O(log n)?

Philipp
26.12.2017
13:52:00
https://stackoverflow.com/questions/18200915/performance-for-table-length-operator

Snusmumriken
26.12.2017
16:41:29
Ну кароч если нужно много раз вычислять - сохраняешь и используешь. Можешь прибавлять/убавлять единичку при добавлении/удалении значений.

Vsevolod
26.12.2017
16:49:16
это не нужно в luajit...

Philipp
26.12.2017
16:49:54
Вопрос был про Луа, не про Луажит

Group Butler [beta]
27.12.2017
11:01:26
Добро пожаловать в чат pro.lua, 79885! Ознакомься с правилами чата (в описании и прикрепленном сообщении), и присоединяйся к обсуждению.
Добро пожаловать в чат pro.lua, Pavel! Ознакомься с правилами чата (в описании и прикрепленном сообщении), и присоединяйся к обсуждению.

Pavel
27.12.2017
11:52:52
Всем привет. кто подскажет что означает ошибка lua - function: 0x8f7010
в онлайн тесте на http://rextester.com/l/lua запускаю такой скрипт тестовый
--lua 5.3
p_body = "</script><div id=\"index\"><h2>text</h2><table width</div>"
for div_index in p_body:gmatch("<div id=\"index\"(.-)</div>") do
print(div_index)
h2_name = p_body:gmatch("<h2?.-)</h2>")
print(h2_name)
end

Vadim
27.12.2017
11:55:06
это не ошибка

Philipp
27.12.2017
11:55:14
Это тип данных
h2_name – функция

Aleksey
27.12.2017
11:55:21
++

Philipp
27.12.2017
11:55:25
А вернее – итератор

Google

Philipp
27.12.2017
11:55:35
gmatch возвращает итератор по вхождениям
RTFM, pls

Aleksey
27.12.2017
11:56:24
причем у тебя выше же for по итератору

Pavel
27.12.2017
11:57:02
понял. т.к. нужен for. извините. я в lua нулевой

Philipp
27.12.2017
11:57:42
p_body:match(...)

Pavel
27.12.2017
11:58:14
да. это у меня мелкий парсер html странички
пытаюсь его немного подправить...
примерно понял идею
for h2_name in p_body:gmatch("<h2?.-)</h2>") do
print(h2_name)
end
круто. пашет

Philipp
27.12.2017
12:02:35
:)

Pavel
27.12.2017
12:03:06
а я правильно понял что в lua нет чтото вроде visualC++ чтобы брекпоинты. отладчик

Vadim
27.12.2017
12:03:10
для кого я мейнтейню luahtmlparser?

Philipp
27.12.2017
12:03:49
Мне проще бывает свой парсер накидать, чем тащить luahtmlparser

Pavel
27.12.2017
12:05:02
парсер мне нужно чтобы из C++ кода разобрать определенную. страницу
в скрипты унес чтобы можно было быстро подменять алгоритм если поменяется сайт

Google

Pavel
27.12.2017
12:05:42
luahtmlparser - я не знал про такой )

Philipp
27.12.2017
12:05:45
Эх, когда-нибудь люди признают Луа языком общего назначения, но не сегодня :(
Кстати, @mva_name
sudo luarocks install htmlparser
Installing https://luarocks.org/htmlparser-0.3.4-1.src.rock
Error: Couldn't extract archive lua-htmlparser: unrecognized filename extension

Vadim
27.12.2017
12:07:38
:(
шатает ваш луарокс там себе что-то, а я потом гадай как чинить

79885
27.12.2017
12:23:20
как отлаживате нативный код байдингов с++ обьектов для луа?

Pavel
27.12.2017
12:29:39
у меня там особо нет отладки. я на С++ качаю html сырой и скидываю в lua - получаю результат в виде json
для вызова lua использую https://github.com/jeremyong/Selene
а https://github.com/msva/lua-htmlparser в один скрипт можно склеить?
что-то вроде amalgamation

Vadim
27.12.2017
12:45:49
разрешаю

Pavel
27.12.2017
12:46:16
) запустил под виндой lua-htmlparser\doc>lua53.exe sample.lua
chapters
lua53.exe: sample.lua:29: attempt to index a number value (local 'e')
stack traceback:
sample.lua:29: in main chunk
[C]: in ?
выдал вот так
счас попробу свой html ему скормить
может действительно лучше всзять готовый парсер
хм. круто все разобрал )