big
именно!
Денис
@andrushaTheSlayer ответы на эти и многие другие вопросы можно (и нужно) найти в растобуке — https://doc.rust-lang.org/book/second-edition/
big
если интересует именно детали, что где можно писать, то могу добавить reference, например
https://doc.rust-lang.org/reference/expressions/loop-expr.html#iterator-loops
Денис
перечитал внимательно вопросы и ответы
Денис
по поводу второго — всё гораздо проще (про почему & перед именем переменной)
Денис
имхо, этот пример всё объясняет :) :
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
Денис
Денис
ненененене, никаких приведений типов))))
Денис
тут тебе не плюсы с их слабой типизацией
ozkriff🇺🇦
@mexus почему? это как раз и есть автоматическое приведние типов, только очень сильно ограниченное по понятным причинам
Денис
есть некая разница между "автоматическим приведением типов" и "приводить ссылку на тип к ссылке на другой (единственный) тип"
Денис
ну, имхо
Денис
а то так недолго дойти и до "в расте слабая типизация, ну конечно сильно ограниченная" ))
Nikita
Ну так From<Any> и Into<Any> и вот тебе слабая типизация, бгг
Денис
нет, потому что такие махинации надо явно указывать )
Денис
безусловно)
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; и радуешься))
Nikita
Vladislav
Т.к. часто надо считать исторические данные старыми алгоритмами
big
опять блокчейн чтоль
Vladislav
И еще склеивать результаты
Vladislav
Я пока думаю про вынос метаданных в json и кодогенерацию
Nikita
если в compile-time, то предлагаю наркоманию: делаешь какой-нибудь Compute<A: Algo>
Cat
> наркоманию Compute<A: Algo>
Strategy pattern?
Nikita
нечто вроде
Nikita
но не уверен что это хорошо
Nikita
я скорее так, флейм запустить, вдруг чего разумного посоветуют :)
Nikita
ну я потому и уточнил сразу
Berkus
надо делать какую-то компьют лямбду, совать ее в мапу с версями и выбирать в процессе какая из лямбд нужна
Berkus
ну то есть Compute(payload.data, versions[payload.version].compute_fn)
Vladislav
По задумке пользователь должен подсовывать конфиг, в котором указывается порядок и версии алгоритмов, система проверяет валидность цепочки и считает
Nikita
типа замыкание передавать сразу с даннысм для расчёта
Nikita
вариант тащем
պլհկ
Box<Algo>
Маjко
Vladislav
Прототип на экселе, со значительными упрощениям считает часы
Маjко
Я бы сделал трейт общий для звена цепочки
А реализации звеньев и версии компилировал в shared libraries.
И в рантайме по когфигу подключал нужные
Loo
Loo
ПАЛЕГЧЕ
Маjко
Мб уже есть динамик лоад растолиб с моделью памяти
Маjко
Vladislav
Ма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
Oleg
https://en.m.wikipedia.org/wiki/Simply_typed_lambda_calculus
Oleg
Можно ещё упростить до симмктричной декартовой категории без замыкания, если просто графы строить
Oleg
Но в любом случае, нужно воротить тайпчекеры/интерпретаторы
Vladislav
Я думаю про кодогенератор, который будет собирать стратежную обертку вокруг этого месива структур и функций. Чтобы можно было скомпилять версию, где есть все версии в рантайме и простенькую, линейную
Маjко
Я где-то видел крейт который в рантайме может запустить компиль раста и передать управление скомпиленному коду