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
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
Elias
Надо ввести термин "RTFPIL" (PIL = Programming in Lua)
Anonymous
But lua how it is done
Саша
я не знаю луа, но у луа наверное тоже есть дикты
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
mva
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
the code, that @SaphireLattice posted a minute before your's "python programm to illustrate" does exactly the same that the thing posted by you. Except, that lua have NO support for passing named variables to functions. Only the contents. If you need the names, you should use the table.
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
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
Дополнительных аргументов нет. Можно принудительно инициализировать, например через package.loaded.modname = nil, и так же проверять.
вот меня это напрягает. а вдруг кто то переопределил require так что оно не проверяет был ли загружен модуль до этого в package.loaded или нет - и выдает true - или require нельзя переопределить ?
Andrey
в принципе можно же в конце инициализации что то возвращать типа return 100 это значит что модуль был именно в данном шаге инициализирован?
Snusmumriken
вот меня это напрягает. а вдруг кто то переопределил require так что оно не проверяет был ли загружен модуль до этого в package.loaded или нет - и выдает true - или require нельзя переопределить ?
Меня интересует вообще третье. Обычно, модули созданные "современным" способом (без module(package.seeall, ...)), возвращают сам модуль а не true. То есть, local module = require'bla_bla'. И почему тебя это вообще волнует? Ну да, луа кеширует модули в package.loaded. А ещё кто-то действительно может переопределить require на "бескешировальный" вариант.
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
Тебе самому проще будет.
Andrey
На что ругается?
loop or previous error loading module
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 {} ?