These are chat archives for dev-ua/rust

13th
Oct 2015
Stanislav Ivanov
@ivstas
Oct 13 2015 08:28

Всем доброго дня.
Помогите советом.
Играюсь с rust'ом, реализую merge sort.
Для merge двух отсортированных масивов нужно создать новый, куда будет записан результат.
Проблема в том, что я не могу сделать так: let arr = [0; 500], так как я пишу generic-метод: fn merge<T: cmp::PartialOrd>.

Подскажите, что можно в этом случае сделать (без unsafe)

Paul Colomiets
@tailhook
Oct 13 2015 08:34
Думаю тебе нужен просто Vec::with_capacity(500)
Stanislav Ivanov
@ivstas
Oct 13 2015 08:37
@tailhook спасибо.
А есть возможность создать массив, а не вектор?
Вообще, я сортирую слайсы. Я правильно понимаю, что слайс можно получить и от массива, и от вектора?
Michael Pankov
@mkpankov
Oct 13 2015 08:40
@ivstas можно, да
This message was deleted
This message was deleted
кажется я какую-то фигню написал поутру
Stanislav Ivanov
@ivstas
Oct 13 2015 08:43
@mkpankov я использую запись fn merge<T: cmp::PartialOrd>(left: &mut [T], right: &mut[T]) -> &[T]
Michael Pankov
@mkpankov
Oct 13 2015 08:44
@ivstas да, прошу прощения, неправильно понял
Stanislav Ivanov
@ivstas
Oct 13 2015 08:44
Я не уверен, что нужно возвращать chtp
*срез
@mkpankov я правильно понял, что срез - это отображение данных. Т.е. нельзя создать срез, можно создать массив/вектор и от него получить срез?
Michael Pankov
@mkpankov
Oct 13 2015 08:46
@ivstas да
я задумался о том, можно ли конкатенировать срезы
так чтобы память осталась там же, просто отображение поменялось
Stanislav Ivanov
@ivstas
Oct 13 2015 08:46
Их можно клонировать. Но непонятно, как из двух срезов получить один новый
Michael Pankov
@mkpankov
Oct 13 2015 08:47
клонировать-то не надо
Stanislav Ivanov
@ivstas
Oct 13 2015 08:47
@mkpankov мне нужно выделить новую память
Michael Pankov
@mkpankov
Oct 13 2015 08:47
@ivstas да? не-inplace сортировка?
Stanislav Ivanov
@ivstas
Oct 13 2015 08:47
Нет
@mkpankov написание In-place merge sort - очень нетривиальное занятие
Michael Pankov
@mkpankov
Oct 13 2015 08:48
ок, я не шарю просто
Stanislav Ivanov
@ivstas
Oct 13 2015 08:48
По факту - если нельзя создать пустой массив (мы не знаем тип), можно просто склонировать старые значения
И перезаписать их
Вопрос - как из двух срезов сделать один новый массив? :(
Michael Pankov
@mkpankov
Oct 13 2015 08:49
я так понимаю тут 2 проблемы
Michael Pankov
@mkpankov
Oct 13 2015 09:00
одна это с тем что функция обобщённая
а другая с тем что непонятно как память выделить
Stanislav Ivanov
@ivstas
Oct 13 2015 09:02
@mkpankov ок, спасибо, попробую через клонирование сделать
Michael Pankov
@mkpankov
Oct 13 2015 09:03
но это не очень правильный способ как я понимаю
Stanislav Ivanov
@ivstas
Oct 13 2015 09:12
@mkpankov не очень. Но поскольку я пока начинаю изучать rust, это подойдет
Paul Colomiets
@tailhook
Oct 13 2015 11:54
О боже. Создать один слайс из двух нельзя. Можно:
  1. Сделать вектор
  2. Сделать мутабельный слайс (но прийдётся его заполнить какими-то пустыми зачениями), и передать функции сортировщику как мутабельный указатель на слайс
  3. Сделать итератор, тогда его можно будет собрать (.collect()) в любой контейнер (но, кажется не в слайс на стеке)
Но вообще не стоит так сильно заморачиваться по поводу слайсов, слайс с размером который не известен в compile-time'е почти нельзя сделать, и соответственно его очень не удобно пользовать. Кроме того его размеры ограничены стеком (8Мб, для всех слайсов и переменных). Что по сути не сильно много, если ты работаешь с массивами. А если ты работаешь с маленькими массивами, то нет смысла так сильно пытаться оптимизировать алокации памяти.
Michael Pankov
@mkpankov
Oct 13 2015 12:57
@tailhook что это за прикол про ограничение среза размером стека?
срез это ссылка на начало области плюс размер, только и всего
объектов-срезов на стеке ты не разместишь очень много, но обычно же не надо много срезов, нужен большой срез
и один срез из двух сделать конечно можно, но стандартная библиотека инструментов для этого не предоставляет
Creating a slice from a data pointer and length can be done with std::slice::from_raw_parts or std::slice::from_raw_parts_mut instead of std::mem::transmuteing a value of type Slice.
Extracting the data pointer and length from a slice can be performed with the as_ptr (or as_mut_ptr) and len methods.
as_ptr + from_raw_parts
Michael Pankov
@mkpankov
Oct 13 2015 13:04
ну и, в конце концов, срезы с динамическим размером элементарно делаются http://is.gd/sFlb8s
Paul Colomiets
@tailhook
Oct 13 2015 13:07
ну да..
Есть &[u8], а есть [u8]
первый это указатель на slice а второй это слайс на стеке
Michael Pankov
@mkpankov
Oct 13 2015 13:07
[u8] это не срез
это массив
Paul Colomiets
@tailhook
Oct 13 2015 13:07
ну типа того
Michael Pankov
@mkpankov
Oct 13 2015 13:07
это не слайс, это массив
он на стеке
не типа, это принципиально
Paul Colomiets
@tailhook
Oct 13 2015 13:08
В примере был вот такой масив, и его лучше не использовать для данной задачи. Я об этом.
Michael Pankov
@mkpankov
Oct 13 2015 13:08
хм, ок
наглядный Benchmark
Андрей Листочкин (Andrey Listochkin)
@listochkin
Oct 13 2015 15:17
ни о чем конечно, но Рубисты сегодня - наши главные клиенты
Michael Pankov
@mkpankov
Oct 13 2015 15:21
лоооол
это как пример из официальной книжки, где числа суммируют
то-то все приложения фибоначчи считают
*веб-приложения
Paul Colomiets
@tailhook
Oct 13 2015 17:06
Кстати вообще интересно, что про питон в этом контексте меньше видно. Питонисты удовлетворены cython'ом? :)
Андрей Листочкин (Andrey Listochkin)
@listochkin
Oct 13 2015 18:31
Не, они Го любят, а рубисты смотрят на Раст из-за Каца и Клабника
XZentus
@XZentus
Oct 13 2015 20:17
Здравствуйте все
Как объяснить cargo, чтобы при компиляции он искал либы по определенному пути?
Точнее, чтобы передал дополнительный путь компилятору cc
Paul Colomiets
@tailhook
Oct 13 2015 20:40
XZentus
@XZentus
Oct 13 2015 20:48
@tailhook Спасибо
Но, кстати, странно - он не пытается искать либы в /usr/local/lib/(где и лежали нужные), а сразу лезет в /usr/local/lib/rustlib/x86_64-unknown-freebsd/lib/