Vladimir
Которая фантом дату содержит
big
а, это такие обертки над Closure'ами, которые реализуют trait AnyFunc. AnyFunc — это трейт представляющий функцию которую можно вызвать с заранее неизвестным количеством аргументов
Loo
заранее неизвестное количество аргументов
Vladimir
а почему стейтдолжен быть не статик?
Loo
красиво
big
да, условия могут показаться странными, но с ними ничего не по делать )
big
я пишу интерпретатор WebAssembly, там есть такая необходимость
Vladimir
ну поидее из не статик нельзя сделать статик
big
makes sense
Marat
Marat
Ну костылями конечно
Vladimir
копи клон не в счет
Vladimir
в общем тут два варианта, либо гарантировать что кложура будет работать пока стейт есть, либо стейт в этом виде, вынести из параметра кложуры
big
так в этом то и прикол, что я хочу сделать так, чтобы кложура (возможно хватит обычного указателя на функцию) не захватывала никакой стейт
big
т.е. есть конейнер функций которые берут в качестве аргумента &mut State. Т.е. State в теории должен жить только на продолжительность вызова Funcs::call
Vladimir
т.е. сттейт не захватывать, но позже получать конкретный стейт?
big
вово
big
да, во время вызова Funcs::call должен передаваться этот стейт
Vladimir
а зачем так?
Vladimir
тебе нужен стейт существующий отдельно?
Vladimir
может стоит в статическом методе колл сразу создавать кложуру?
big
по сути да.
Я, как уже упомянул выше, занимаюсь wasm интерпретатором. В васме ты можешь загрузить модуль, а потом вызвать на нем какой-то wasm код. Этот wasm код может обратится к функциям которые определены host'ом (он же embedder). По сути способ взаимодействия с реальным миром.
big
собственно можно передать все состояние чтобы им владела сама Vm. Но это слишком серьезное ограничение. Тут стоит упомянуть что я работаю над general purpose library, т.е. этой библой смогут пользоваться кто угодно, и поэтому стоит попытаться сделать так что либа накладывает наименьшее количество ограничений
big
по сути, все это состояние этим хост функциям нужно только во время выполнения. Так есть смысл передавать его только тогда, когда это состояние действительно нужно будет — во время выполнения.
big
вот собственно почему встают такие вопросы )
big
Vladimir
ну просто у тебя разбит процесс создания и выполнения метода
Vladimir
почему сразу не сделать
fn Funcs::call<State>(&mut State, ...)
big
а разве тогда не придется убрать из Funcs генерик <State>?
big
Если придется, то это означает что мы не сможем передать генерик <State> в AnyFunc.
Vladimir
да, наверное в твоем случае правильно было бы
fn Funcs::<State>::call(&mut State, ...)
Vladimir
Ну т.е. если у тебя не будет конструктора отдельного, то вроде как у тебя кложура не должна требовать статик, и вроде как выглядит логично что ты её создаш перед использованием
Vladimir
или я не совсем понял задачу
big
Vladimir
ну то что ты описал отдельно выглядит так какбудто ты пытаешься создать некую кложуру, сохранить её куда-то в статик контейнер, и потом в нужный момент найти её и стейт ей подходящий и вызвать
big
ага
big
все верно
Vladimir
ну т.е. процесс создания и вызова разбит, это действительно нужно?
big
желательно, так как Funcs потом будут добавлены в виртуальную машину. Значит все что захватят Funcs будет захвачено виртуальной машиной
big
этого хотелось бы избежать
Vladimir
а когда ты положешь функцию в вм как ты планируешь сохранить её тайп параметр?
Vladimir
vm.push(fn);
vm.pop()(state);вм поидее обобщенная коллекция
big
вот для этого и нужен Box<AnyFunc<State>> )
big
struct Vm<State> ведь
Vladimir
ого, вм под конкретный стейт
Vladimir
Box<AnyFunc<State>> вот короче источник проблем
big
да-да, звучит мб сначала странно. Но если подумать — 1 вм 1 эмбедер по сути
Vladimir
эта херня расписывается как Box<AnyFunc<State> + 'static>
Vladimir
а тебе надо что-то типа
Box<AnyFunc<State> +'a >
where State:'a
kitsu
А реверс итераторы часом не завезли?
Vladimir
они вроде есть для сущностей которые могут реверсится
Vladimir
кмк
kitsu
Чего-то для вектора не могу найти
Anonymous
https://doc.rust-lang.org/std/iter/trait.DoubleEndedIterator.html
big
Box<AnyFunc<State> +'a > where State:'a это предлагается куда?
big
в выражении такое ненапишешь же, верно?
kitsu
kitsu
В общем нужна функция а ля lower_bound в упорядоченном контейнере, мб есть уже что-то готовое?
Vladimir
а что там найтли
Vladimir
next_back не найтли ж
Vladimir
big
а тогда откуда возьмется 'a на всю структуру?
Vladimir
типа
struct Vm<'a, State> where State:'a + ... {
...
f: Box<AnyFunc<State> +'a>,
}
Marat
Marat
Это если double ended реализован
kitsu
kitsu
негоже самому писать элементарные функции
Vladimir
kitsu
big
https://play.rust-lang.org/?gist=1a65f77c426290e70cc3b59ece962aec&version=undefined @c_vld
big
"having bounds on structs can create more issues than they solve" (C) eddyb
big
из серии "Красиво сказано"
Vladimir
х)
Vladimir
в общем ты решил всё статиками?
big
так, приглядись )
big
все по прежнему, только компилируется )
big
что изменилось — это убрались баунды из struct FuncX