big
именно!
Денис
@andrushaTheSlayer ответы на эти и многие другие вопросы можно (и нужно) найти в растобуке — https://doc.rust-lang.org/book/second-edition/
big
если интересует именно детали, что где можно писать, то могу добавить reference, например https://doc.rust-lang.org/reference/expressions/loop-expr.html#iterator-loops
⁣Денис
@andrushaTheSlayer ответы на эти и многие другие вопросы можно (и нужно) найти в растобуке — https://doc.rust-lang.org/book/second-edition/
Хех, я как раз его и читаю (пример выше из главы про дженерики). Просто там вроде не было (или я забыл/пропустил), что в for тоже pattern.
Денис
перечитал внимательно вопросы и ответы
Денис
по поводу второго — всё гораздо проще (про почему & перед именем переменной)
Денис
имхо, этот пример всё объясняет :) : fn main () { let i = 3i32; let &a = &i; let a: i32 = a; // checking the type println!("{}", a); }
Денис
по поводу первого вопроса — "почему можно передать вектор в функцию, которая принимает слайс" — этого сделать нельзя
Денис
если функция принимает fn check(a: &[u8]), а ты её вызовешь как check(vec!(1)), то чуда не произойдёт
Денис
но если ты сделаешь check(&vec!(1)), то всё сработает, потому что Vec имлементит Deref: https://doc.rust-lang.org/std/vec/struct.Vec.html#impl-Deref
Денис
вот аналогичный пример — https://play.rust-lang.org/?gist=771cad6e141edac436a1aa3d06a1a022&version=stable
Денис
закомментируй секцию impl ::std::ops::Deref и посмотри, что получится :)
Денис
как верно заметили, это называется "deref coercion": https://doc.rust-lang.org/std/ops/trait.Deref.html#more-on-deref-coercion
Денис
в частности, вот что происходит: If T implements Deref<Target = U>, and x is a value of type T, then: ... Values of type &T are coerced to values of type &U
⁣Денис
в частности, вот что происходит: If T implements Deref<Target = U>, and x is a value of type T, then: ... Values of type &T are coerced to values of type &U
Круто, похоже на операторы приведения типа в плюсах, но только для ссылок.
Денис
ненененене, никаких приведений типов))))
Денис
тут тебе не плюсы с их слабой типизацией
ozkriff🇺🇦
@mexus почему? это как раз и есть автоматическое приведние типов, только очень сильно ограниченное по понятным причинам
Денис
есть некая разница между "автоматическим приведением типов" и "приводить ссылку на тип к ссылке на другой (единственный) тип"
Денис
ну, имхо
Денис
а то так недолго дойти и до "в расте слабая типизация, ну конечно сильно ограниченная" ))
Nikita
Ну так From<Any> и Into<Any> и вот тебе слабая типизация, бгг
Денис
нет, потому что такие махинации надо явно указывать )
ozkriff🇺🇦
есть некая разница между "автоматическим приведением типов" и "приводить ссылку на тип к ссылке на другой (единственный) тип"
разница есть, конечно - coercions это подмножество "автоматических приведений типов". Это же не чисто плюсовый термин, это довольно абстрактная идея.
Денис
безусловно)
ozkriff🇺🇦
https://doc.rust-lang.org/beta/nomicon/coercions.html - вот номикон, допустим: глава "приведения типов" + используются слова "implicit" - вот тебе и автоматические приведения типов.
ozkriff🇺🇦
вообще, забей, просто к использованию термина придрался
Денис
ненененене, никаких приведений типов))))
ну вот тут я погорячился конечно
Vladislav
Вопрос знатокам. Есть числодробилка, с кучей небольших алгоритмов. Эти мелкие алгоритмы объединятся в большой алгоритм. Есть входящие, промежуточные и выходящие структуры данных. И, как вишенка на торте, все алгоритмы и сущности версионируются. Как это сделать ин раст вей? Чтобы не плодить структуры Input1, Input2 и функции calc_1(), calc_2(), тк все многообразие версий должно работать одновременно
Маjко
Модулями
Маjко
А вообще версионировать лучше гитом
Денис
модули — тема
Vladislav
Все версии нужны в рабочем состоянии
Денис
потом в коде пишешь use mega_library::ver6 as algo; и радуешься))
Vladislav
Т.к. часто надо считать исторические данные старыми алгоритмами
big
опять блокчейн чтоль
Vladislav
И еще склеивать результаты
Vladislav
опять блокчейн чтоль
Хуже) финансы и риск-мнеджмент
Vladislav
Я пока думаю про вынос метаданных в json и кодогенерацию
Nikita
если в compile-time, то предлагаю наркоманию: делаешь какой-нибудь Compute<A: Algo>
Cat
> наркоманию Compute<A: Algo> Strategy pattern?
Nikita
нечто вроде
Nikita
но не уверен что это хорошо
Nikita
я скорее так, флейм запустить, вдруг чего разумного посоветуют :)
Berkus
если в compile-time, то предлагаю наркоманию: делаешь какой-нибудь Compute<A: Algo>
вполне вариант, только мономорфизация это превратит в код в компайл тайме, в рантайме будет не выбрать
Nikita
ну я потому и уточнил сразу
Berkus
надо делать какую-то компьют лямбду, совать ее в мапу с версями и выбирать в процессе какая из лямбд нужна
Berkus
ну то есть Compute(payload.data, versions[payload.version].compute_fn)
Vladislav
По задумке пользователь должен подсовывать конфиг, в котором указывается порядок и версии алгоритмов, система проверяет валидность цепочки и считает
Nikita
типа замыкание передавать сразу с даннысм для расчёта
Nikita
вариант тащем
պլհկ
Box<Algo>
Vladislav
Насколько быстро это должно работать?
Хороший вопрос, учитывая объемы данных. Минуты, в пределах часа
Vladislav
Прототип на экселе, со значительными упрощениям считает часы
Маjко
Я бы сделал трейт общий для звена цепочки А реализации звеньев и версии компилировал в shared libraries. И в рантайме по когфигу подключал нужные
Loo
ПАЛЕГЧЕ
Маjко
Мб уже есть динамик лоад растолиб с моделью памяти
Маjко
ПАЛЕГЧЕ
Ну ладн))
Маjко
Ну просто в расте не то чтобы есть мощный RTTI чтобы по когфигу функции выбирать, пусть даже виртуально
Vladislav
Хотя, когда-то я видел проект на дельфях, где местный гений для каждой формы делал dll) а форм было сотни) и проект запускался по сетке, тогда еще 10мбит
Sheldhur
суп
Sheldhur
тут BitTorrent протоколом никто не баловался случайно?
Денис
RTTI на уровне компилятора оверрейтед: https://llvm.org/docs/HowToSetUpLLVMStyleRTTI.html
Денис
точно так же можно в расте запилить
պլհկ
я вообще проблемы не понял, фьючи вы по конфигу чейнить можете, а алгоритмы нет?
Маjко
Есть пример паттерна как по конфигу чейнить фьючи, не превращая код в лапшу из матчей?
Маjко
Можно конечно конциг парсить в Vec<Algorithm> и потом в цикле инвокать по матчу нужный алгоритм Но черт, все равно будет огромные enum с alg1v1 alg2v1 alg2v2...
Cat
в порядке бреда (нет): напишите алгоритмы на embedded языке, делайте hot swap и радуйтесь
Oleg
Фьюча - это всё равно трейт, делай фабрику Box<Future>
Oleg
https://en.m.wikipedia.org/wiki/Simply_typed_lambda_calculus
Oleg
Можно ещё упростить до симмктричной декартовой категории без замыкания, если просто графы строить
Oleg
Но в любом случае, нужно воротить тайпчекеры/интерпретаторы
Vladislav
Я думаю про кодогенератор, который будет собирать стратежную обертку вокруг этого месива структур и функций. Чтобы можно было скомпилять версию, где есть все версии в рантайме и простенькую, линейную
Маjко
Я где-то видел крейт который в рантайме может запустить компиль раста и передать управление скомпиленному коду