fgntfg
...
Saphire
...
Anonymous
#python
def Kargm(self,**kwargv)
fgntfg
Function mew(...)
fgntfg
In Lua
fgntfg
https://www.lua.org/pil/5.2.html
Anonymous
This is an example of Python and also can put a machete of data ... but in Lua how can I put a function and store data without mapping this data
mva
Saphire
function dots(...)
local argv = {...}
for k,v in pairs(argv) do print (k,v) end
end
mva
я думаю не стоит оказывать медвежью услугу и разжёвывать как для дошколят
Anonymous
Python program to illustrate
# *kargs for variable number of keyword arguments
def myFun(**kwargs):
for key, value in kwargs.items():
print ("%s == %s" %(key, value))
# Driver code
myFun(first ='khairo', mid ='for', last='guiri')
Output:last == khairo mid == for first == guiri
Saphire
Elias
Надо ввести термин "RTFPIL" (PIL = Programming in Lua)
Saphire
Anonymous
But lua how it is done
mva
Саша
я не знаю луа, но у луа наверное тоже есть дикты
Anonymous
I read but did not understand yet how can I set a parameter without mentioning how much data I will put like maho shown in python ... how can i put it in lua that if i do not know the parameters in the function i can define it inside the function
mva
б#@%ь!
Anonymous
ok
Anonymous
Ну, я думаю, я нашел способ, если это сработало
Saphire
...eh
Snusmumriken
Snusmumriken
Use tables, Luke.
function foo(params)
print(params.x + params.y)
end
foo{x = 10, y = 20} --> 30
Snusmumriken
Use tables, Luke.
function foo(params)
print(params.x + params.y)
end
foo{x = 10, y = 20} --> 30
Also select.
function foo(...)
local len = select('#', ...)
print('COUNT OF ARGS ', len)
local first = select(1, ...)
print('FIRST ARG: ', first)
local second = select(2, ...)
print('SECOND ARG: ', second)
local last = select(len, ...)
print('LAST ARG: ', last)
end
foo(10, 20, 30, 40, 50, 60)
--> COUNT OF ARGS 6
--> FIRST ARG: 10
--> SECOND ARG: 20
--> LAST ARG: 60
Snusmumriken
Also packing in table (Saphire)
function foo(...)
local args = {...}
print('COUNT OF ARGS', #args)
print('FIRST ARG', args[1])
print('SECOND ARG', args[2])
print('LAST ARG', args[#args])
end
foo(10, 20, 30, 40, 50, 60)
--> COUNT OF ARGS 6
--> FIRST ARG: 10
--> SECOND ARG: 20
--> LAST ARG: 60
Snusmumriken
Anonymous
Well I suppose I put a function like ... (function syHi ()) and I did not know anything or set a value just because I typed "kh" ("I think it only prints kh but if you put end syHi) ") Do you accept that I put these values
Snusmumriken
Waat?
Anonymous
function SyHi()
print("hi")
end
SyHi(name="khairo",age=31)
Anonymous
😕😕😕😕😕
Anonymous
/
Anonymous
Snusmumriken
There no named arguments.
_No named arguments_, understand?
Use tables.
Snusmumriken
Use tables, Luke.
function foo(params)
print(params.x + params.y)
end
foo{x = 10, y = 20} --> 30
Andrey
в принципе можно же в конце инициализации что то возвращать типа return 100 это значит что модуль был именно в данном шаге инициализирован?
Anonymous
Snusmumriken
Что конкретно тебя пугает? То что кто-то, чьи скрипты ты грузишь, можешь заставить require делать страшные штуки, типа вместо require'json' будет вызываться функция, которая скачает миллиард вирусов и тут же их встроит в систему?
Snusmumriken
Карочи, первое что можно сделать: повесить на _G метатаблицу с прокси и __newindex, которые запрещают переопределять стандартные штуки. Второе — использовать setfenv на "пользовательские штуки", так что если они чего и переопределят, то переопределят это внутри себя, не трогая ничего в _G-пространстве. Третье — хук на require со счётчиком того, что, как и сколько раз грузится : )
Andrey
а как на require повесить хук ?
Snusmumriken
Например переопределить )))
local req = require
function require(...)
print('Call require with args: ', ...)
return req(...)
end
Andrey
О, спасибо!
Snusmumriken
Но кстати это не спасёт от сильно переопределённого require, в котором не вызывается "оригинальная" функция. Например, не будет видно в таком случае:
function require(module)
local sep = package.config:sub(1, 1)
local ppath = package.path:gsub('%?', module):gsub('%.', sep)
for path in (ppath .. ';'):gmatch('(.-);') do
local file = io.open(path, 'rb')
if file then
local content = file:read('*a'); file:close()
local fn = assert(loadstring(content, module))
package.loaded[module] = {fn(module)}
return unpack(package.loaded[module])
end
end
end
Такое require, кстати, вполне рабочее, плюс запрещает использовать dll/so-либы ))
Чтобы узнать, не переопределяют ли сам require — используем прокси + __newindex на _G/ENV, такое есть в моей статье по метатаблицам на хабре.
Snusmumriken
О, спасибо!
Скажи пожалуйста, чего конкретно ты добиваешься.
Я могу предположить, что ты хочешь сделать какую-нибудь RPC-фигню, где какой-нибудь сервер принимает кусочек луёвого кода, loadstring'ает его и возвращает ответ, но ты хочешь чтобы в процессе loadstring'а ничто "стандартное" не было изменено, дабы скрипты не мешали друг другу, изменяя поведение стандартных вещей, и не мутили всякую грязь.
Andrey
не, я просто вгружаю свои модули в чужую среду а оно упорно не хочет инициализировать один из модулей
Snusmumriken
На что ругается?
Andrey
говорит что либа уже инициализирована. точнее могу вечером сказать.
mva
@Snusmumriken как самый главный любитель воркэраундов и хаков, напомни, плз, как бы посимпатичнее обойти ограничение скоупа присваивания внутри for? :)
Snusmumriken
Дай пример того что хочешь
Snusmumriken
Ну типа можно в _G сразу пихать, типа
for i = 1, 10 do
_G[i] = 'bla-bla'
end
Оно тогда будет сразу в глобал скоупе. Если _G не переопределён в каком-то из вышестоящих скоупов. И да, такая методика довольно неприятна.
mva
mva
во втором случае lan выглядит пустым
Snusmumriken
Ну значит не выполняется n:match(lan_if_patt)
mva
выполняется
mva
потому что так же выполняется и первый принт лана
mva
и там он не пустой
Snusmumriken
Кароч, есть два варианта развития событий:
1. Ты внутри всех if-then-else-elseif тыкнешь print('1', wan, lan); print('2', wan, lan) и сам посмотришь, что куда направляется
2. Ты выложишь куда-нибудь код вместе с тестовым примером и я его посмотрю
mva
есть третий вариант :)
mva
хак с _G.lan=n помог :)
Snusmumriken
Это чудовищно ))
mva
(но долбаный костыль >_>)
Snusmumriken
А ещё, я советую уменьшить вложенность, например:
local function foo(wan, lan)
wan, lan = wan:upper(), lan:upper()
if bla-bla then
return 'WAN', 'LAN'
end
if bla-bla2 then
return wan_if, wan_if:gsub('WAN', 'LAN')
end
if bla-bla3 then ... end
end
И снабдить примерами под регулярки:
-- [bla-blaWAN]
if wan_if:match('WAN$') then ...
Snusmumriken
Тебе самому проще будет.
Snusmumriken
У тебя модуль A реквайрит модуль Б, а модуль Б реквайрит модуль А. Или тот же модуль А реквайрит модуль А.
Snusmumriken
Проверь это.
Andrey
скорей всего не у меня - но проверю
mva
хм...
mva
а как бы при io.open("r+"), после чтения таки опустошить файл, чтобы с нуля перезаписать?..
mva
ну, чтобы два раза не open'ить файл
Snusmumriken
Таки два раза опенить.
Snusmumriken
Можно сделать file:seek('set', 0), записать то что нужно а потом до конца файла забить нулями ('\0'), но он от этого не уменьшится. А ещё ты будешь иметь дело с большим количеством нулей при последующем прочтении (в 'rb').
Snusmumriken
А ещё этот 'r+' не умеет в бинарные данные. Это плохо, потому что ты даже не вычислишь количество \0, которыми надо забить файл до конца. Лучше удаляй/переоткрывай в 'wb'. Хотя мб можно вычислить в 'rb+', надо проверить. Но файл тем не менее будет только расти, а не уменьшаться. Отпилить кусок с конца не получится, только нарастить ещё. В это умеет специальная ОС-зависимая api, а ля ftruncate, но это надо импортить.
Andrey
Проверь это.
Спасибо! Локализовал проблему. У производителя железяк оказывается есть галка autoload и библиотека загружается раньше времени. В общем это не луа претензии а к оборудованию и начинке
Snusmumriken
Снус опять вывалил на народ ведро чуши, а его за это поблагодарили! Ура!
Andrey
ну по крайней мере я теперь более менее понимаю в окружениях и require :)
Andrey
Еще вопрос
local foo=bar:bar2:bar3() — возвращает nil или массив
if not foo then
local foo={}
end
правильно ли я понимаю что лучше так:
local foo=bar:bar2:bar3() or {}
?