Cat
у RIIR есть лого по аналогии с RESF?
(украл с https://github.com/ansuz/RIIR)
Маjко
тогда уж транспайлер Rust -> english.
Шутка про то, что синтаксис раста не для людей
Loo
https://intellij-rust.github.io/2018/05/03/changelog-73.html
Маjко
criterion-rs
Ваще топовая херня. Графики и сравнение с предыдущим прогоном искаропки То что надо 👍
Маjко
Нахерачил охуенных бенчей
Ivan
Здравствуйте, молодые люди. Переезжаю с С++ на Rust. Не понимаю. как сложить значиния двух векторов и записать в третий. Можете подсказать?
Anonymous
главное чтобы тип был один и тотже
Денис
ваще точно так же, как и в плюсах, не?
Ivan
Одного. Но размер у вектора типа usize
Anonymous
concat!() не?
Сергей
хорошо бы конкретизироать проблему
Ivan
ваще точно так же, как и в плюсах, не?
не понятно как записать цикл
Денис
Маjко
функциональщина подъехала)
Ну раз одного — почему бы нет?)
Маjко
... : Vec<_> =
Ну, да. Если из контекста не выведет
Денис
не понятно как записать цикл
вот это-то?... for i in 0..len { }
Ivan
вот это-то?... for i in 0..len { }
Если брать индексы в двух векторах vector1[i], то не компилируется
Макс
функциональщина подъехала)
Ну так это есть rust way. Собственно, и вне раста у меня такая задача бы в первую очередь вызывала желание map и zip сделать, а не с циклами морочиться.
Ivan
.
Ivan
Если брать индексы в двух векторах vector1[i], то не компилируется
Макс
В-общем, не надо при переезде на новый язык пытаться на нёго переносить конструкты из старого и привычного :) большинство операций над векторами в расте (да и большей части других современных языков) делаются без циклов.
Ivan
Я использую библу http://bendykst.github.io/doc/simplemad/index.html для декодировки mp3 файла и мне надо стерео в моно слить. Для этого значаения левого канала надо сложить с значениями правого канала и разделить всё это на 2: fn ffmpeg_pcm(filename: &String) -> Vec<i32> { let mut result: Vec<i32> = vec![]; let mut left_channel: Vec<i32> = vec![]; let mut right_channel: Vec<i32> = vec![]; let path = Path::new(filename); let file = File::open(path).unwrap(); let decoder = Decoder::decode(file).unwrap(); for decoding_result in decoder { match decoding_result { Err(e) => println!("Error: {:?}", e), Ok(frame) => { for i in frame.samples[0].iter() { left_channel.push(i.to_i32()); } for i in frame.samples[1].iter() { right_channel.push(i.to_i32()); } } } } return result; }
Ivan
Они в фреймах криво как то храняться из-за этого весь геморрой
Маjко
@TeslA95 почитай доку по Vec, там и методы для суммы есть и куча итераторов на все случаи
Ivan
fold*
Хорошо
Сергей
человек про циклы спросил, а вы сразу итераторами кидаться, он тепеть будет думать, что в расте циклов нет
LexsZero
циклы is so 1970
Макс
человек про циклы спросил, а вы сразу итераторами кидаться, он тепеть будет думать, что в расте циклов нет
Мне кажется, что rust - это очень opinionated (как это по-русски написать?) по поводу некоторых вещей язык, и пытаться решить подобную задачу с помощью циклов - идти довольно сильно против того, к чему тебя язык подталкивает. Если бы я переходил на новый язык (что я тоже отчасти делаю, да) и задавал бы подобные вопросы, я бы был благодарен за ответы, которые бы помогали мне использовать новый язык правильно и раскрывали бы мои unknown unknowns, а не просто технически отвечали на именно то, что я спрашиваю.
Cat
> opinionated Ты ещё го не видел
Макс
Денис
это не язык opinionated, а люди
Денис
язык не форсит использование итераторов вместо циклов никак
Макс
это не язык opinionated, а люди
Язык делается людьми и для людей. Кроме того, язык связан с экосистемой вокруг него: стандартной библиотекой, cargo, популярными крейтами, форумами и так далее. В отличие от C/C++, у Rust довольно централизированное сообщество, и мне, по крайней мере, кажется, что все перечисленные вещи ориентированы именно на функциноальный подход к коллекциям. Естественно, язык не запрещает работать с циклами, но он сделан так, что в нём это менее удобно, и практически весь исходный код в упомянутой экосистеме, который я видел, был написан именно в функциональном стиле.
Денис
я бы сказал, что тут самое ключевое — "мне...кажется"
Cat
> естественно, язык не запрещает Ты ещё го не видел
Денис
что я найду, если грепну репу раста по \bfor\b?)
Макс
я бы сказал, что тут самое ключевое — "мне...кажется"
Это по умолчанию: в таких вещах нет однозначно правильного ответа и мы обмениваемся мнениями. Но это же можно сказать по поводу практически всех действительно важных вопросов в разработке. Вещи, которые можно математически обосновать и чётко доказать, как правило, это либо вопросы новичков, либо очень теоретические CS вещи.
Денис
хм, надо исключить impl )))
Макс
что я найду, если грепну репу раста по \bfor\b?)
Хороший вопрос. Правда, чтобы сформулировать его до конца правильно, надо сравнить такой греп с грепом использования функциональных конструкций, и придумать методику для сравнения одного с другим: как-то мерять количество строк в каждом цикле, количество сцеплённых функциональных операций с итераторами, и так далее. Но в целом идею такого исследования очень поддерживаю.
Денис
зачем оно нужно?
Макс
зачем оно нужно?
Чтобы любопытство потешить, конечно. Как и любое стоящее научное исследование :)
Денис
научное?))))
Денис
окееей)))
Golodnyi
Подскажите, можно ли в расте набор бинарных данных раскидать по типам мета программированием?
Маjко
Опиши подробнее что хочешь
Golodnyi
https://codet.ru/5af015a8e312a
Golodnyi
Вот плюсовый код
Golodnyi
Там в зависимости от данных, создаются сигнед или ансигнед инты разного размера, куча ифов и все такое
Golodnyi
В том же пхп есть функции,куда даёшь бинарь, задаешь строковый набор парсинга данных и выдает типа массив данных, можно ли в расте динамически объявлять переменные, указывая динамически именно тип
Marat
Правда тебе ещё парсить в типы надо, это хз
Маjко
Там в зависимости от данных, создаются сигнед или ансигнед инты разного размера, куча ифов и все такое
Статически нельзя, если простой ответ Если сложный, можно добиться, реализовав свой трейт для нужных типов, и внутри определив поведение для каждого конкретного
Golodnyi
А можно в расте вызывать методы от класса, где имя метода лежит в переменной? Условно obj.{var_method}()
Денис
var_method(&obj)
Денис
точнее (var_method)(&obj)
Маjко
Если тебе в расте не надо ифами по строкам матчить тип
Маjко
То реализуй трейт для нужных тебе типов
Маjко
И будет юзаться то что надо без ифов
Golodnyi
Тебе надо данные парсить? Или что?
Да, мне надо набор бинарных данных превратить в значения
Golodnyi
То реализуй трейт для нужных тебе типов
Ну трейт это класс расширения класса же? Тоесть мне надо условно 6 трейтов на каждый случай и создавать тот или иной обьект с правильным трейтом, дергая один и тот же метод?
Marat
Да, мне надо набор бинарных данных превратить в значения
Ну возьми nom, pest или oak и парсь как тебе надо.
Marat
В массив только нельзя будет сложить разных типов. Можно сделать enum из разных типов и ложить например
Marat
Если бинарные данные то лучше всего nom конечно
Golodnyi
Мне не принципиален массив, главное валидные типы, я погуглил это все фреймаорки же? Хочется просто понять на сколько хорошо чистый раст ляжет на такую задачу