These are chat archives for dev-ua/rust

27th
Jun 2015
Michael Pankov
@mkpankov
Jun 27 2015 16:17
@madkinder я бы такие вопросы в английском irc просто спрашивал, там народ быстро подсказывает
а вообще у тебя тут получается срез (.iter() ты можешь только у него вызвать, у FixedSizeArray его нет), а у итераторов в целом Item=T где T - тип значения в контейнере
ну и там next возвращает &'a T
Ihor Kaharlichenko
@kaharlichenko
Jun 27 2015 16:27
@mkpankov что-то ты намутил тут
я вчера спросил в irc, сначала долго отнекивались, мол, compiler magic, всё такое. а потом таки дали ссылку на новые части Rust book, где описываются implicit type coercions, и среди них есть приведение от [T; N] к &[T]
вот от него компилер и танцует потом
Michael Pankov
@mkpankov
Jun 27 2015 16:29
&[T] это и есть срез
Ihor Kaharlichenko
@kaharlichenko
Jun 27 2015 16:29
я понимаю
Michael Pankov
@mkpankov
Jun 27 2015 16:30
ну а от него что танцевать
Ihor Kaharlichenko
@kaharlichenko
Jun 27 2015 16:30
просто никто нигде не говорил, что массив можно неявно приводить к срезу
Michael Pankov
@mkpankov
Jun 27 2015 16:30
это да, я откуда-то из неявных источников узнал
Ihor Kaharlichenko
@kaharlichenko
Jun 27 2015 16:30
ещё раз: у самого [T; N] нет метода iter(). Для того, чтобы он "появился" его надо привести к другому типу. явно или неявно.
Michael Pankov
@mkpankov
Jun 27 2015 16:31
да
всё так
Ihor Kaharlichenko
@kaharlichenko
Jun 27 2015 16:31
единственное, что в публичных местах описано - trait Deref, который указывает компилятору, что можно приводить типы ссылок
больше ничего
Michael Pankov
@mkpankov
Jun 27 2015 16:32
а эта глава про Implicit type coercions в Stable или Nightly книге?
Ihor Kaharlichenko
@kaharlichenko
Jun 27 2015 16:32
вот из стейбла глава: https://doc.rust-lang.org/stable/book/deref-coercions.html
Michael Pankov
@mkpankov
Jun 27 2015 16:33
да не я про то где описано что из массива срез получается. это какая-то неофициальная книга я так понимаю (TURPL)
Ihor Kaharlichenko
@kaharlichenko
Jun 27 2015 16:33
а ту ссылку, что я скинул, вообще нигде не афишировали, это я еле выпытал
я хз вообще что это, если честно
Michael Pankov
@mkpankov
Jun 27 2015 16:34
ну это какой-то чувак взялся новую отдельную книгу писать, он вроде не из core team даже
Ihor Kaharlichenko
@kaharlichenko
Jun 27 2015 16:34
дословно сказали так: The work in progress TURPL covers that
Michael Pankov
@mkpankov
Jun 27 2015 16:34
ну да
хорошо если её потом обратно интегрируют
Ihor Kaharlichenko
@kaharlichenko
Jun 27 2015 16:34
та да... насколько я понял, так и будет
а может это будет ещё одна книга
Michael Pankov
@mkpankov
Jun 27 2015 16:35
ну пока отдельная эе
же
Ihor Kaharlichenko
@kaharlichenko
Jun 27 2015 16:35
судя по introduction она и будет отдельной
о, Gankro
я не помню, это какой-то прошаренный чувак, возможно даже в core team
Ihor Kaharlichenko
@kaharlichenko
Jun 27 2015 16:40

Я вот что ещё хотел спросить. Какой тип у x в этом коде?

    let a = [1, 2, 3, 4];
    let b = a.iter().filter(|&x| *x < 1).collect::<Vec<_>>();

Я понимаю, что можно положиться на type inferrence, но мне просто хочется знать, какой именно там тип, что понимать, где ставить &, *, а где нет.

я сначала подумал, что там &i32, но так не работает
Michael Pankov
@mkpankov
Jun 27 2015 16:46
как ни странно, это &isize
ой
&&isize
не совсем понимаю, откуда тут двойная ссылка, но тем не менее
Ihor Kaharlichenko
@kaharlichenko
Jun 27 2015 16:46
а как ты выяснил?
Michael Pankov
@mkpankov
Jun 27 2015 16:46
ну убери & в |&x| и в x
блин
& в |&x| и * в x
Ihor Kaharlichenko
@kaharlichenko
Jun 27 2015 16:47
но легче не стало
убирал, там столько матюгов было, при том они по нескольку раз повторялись
Michael Pankov
@mkpankov
Jun 27 2015 16:48
да не речь не об этом
оно не компилируется если убрать
Ihor Kaharlichenko
@kaharlichenko
Jun 27 2015 16:48
хм, видимо не там убирал
Michael Pankov
@mkpankov
Jun 27 2015 16:48
просто ошибка будет && vs.
бл
&&_ vs. _
что значит что двойная ссылка там, где ожидается значение
я только не пойму почему здесь не роляет авто-разыменование
Ihor Kaharlichenko
@kaharlichenko
Jun 27 2015 16:49
угу, по-дурацки, из-за того, что предикат фильтра принимает ссылку
Michael Pankov
@mkpankov
Jun 27 2015 16:50
а, авторазыменование вроде только на вызовах методов делается
Ihor Kaharlichenko
@kaharlichenko
Jun 27 2015 16:50
видимо нет
Michael Pankov
@mkpankov
Jun 27 2015 16:51
т.е. можно Foo.bar(), а можно &&&Foo.bar()
почему нет?
Ihor Kaharlichenko
@kaharlichenko
Jun 27 2015 16:51
смотри, какой финт можно сделать, и тоже работать будет: filter(|x| x > &&2)
вот это вообще в голове не укладывается
Michael Pankov
@mkpankov
Jun 27 2015 16:51
ну и что
это и есть двойная ссылка, никакого финта
Ihor Kaharlichenko
@kaharlichenko
Jun 27 2015 16:51
а то, что по смыслу сравниваются 2 ссылки!
т.е. по сути сравниваются два адреса/указателя
и если без автоматического разыменования, то получается форменный бред
Michael Pankov
@mkpankov
Jun 27 2015 16:52
ну ммм так-то > это тоже метод, хотя конечно надо проверять что это по этой причине
уверен что правильно работает? я нет
Ihor Kaharlichenko
@kaharlichenko
Jun 27 2015 16:53
не уверен, но результат выдаёт тот же
Michael Pankov
@mkpankov
Jun 27 2015 16:53
[3, 4]?
Ihor Kaharlichenko
@kaharlichenko
Jun 27 2015 16:53
угу
Michael Pankov
@mkpankov
Jun 27 2015 16:53
прикольно
Ihor Kaharlichenko
@kaharlichenko
Jun 27 2015 16:56
да не очень. не люблю не понимать, как работает компилятор
какое-то black voodoo просто :)
Michael Pankov
@mkpankov
Jun 27 2015 16:57
несколько адово, согласен
Ihor Kaharlichenko
@kaharlichenko
Jun 27 2015 16:57
пугает то, что это довольно-таки базовые вещи
и когда не понимаешь, как работают основы, как можно что-то сложнее hello world написать?
Michael Pankov
@mkpankov
Jun 27 2015 16:58
да нет
это просто тонкости
не спрашивал ещё в #rust почему > &&2 работает как надо?
Ihor Kaharlichenko
@kaharlichenko
Jun 27 2015 16:59
пока нет
Michael Pankov
@mkpankov
Jun 27 2015 16:59
кстати, навскидку: в Rust Ord не определён на ссылках
Ihor Kaharlichenko
@kaharlichenko
Jun 27 2015 16:59
ирка неудобная очень, а на rust-lang/rust медленно отвечают
во-от!
Michael Pankov
@mkpankov
Jun 27 2015 17:00
нормальная
Ihor Kaharlichenko
@kaharlichenko
Jun 27 2015 17:00
это вообще-то логично
Michael Pankov
@mkpankov
Jun 27 2015 17:00
ему приходится авто-разыменование делать
и он его делает до &isize
вот и всё собственно
Ihor Kaharlichenko
@kaharlichenko
Jun 27 2015 17:00
а потом ещё раз * для ручного разыменования, как я понимаю
Michael Pankov
@mkpankov
Jun 27 2015 17:01
я про x > &&2
ну когда оно есть
> это на самом деле Ord::gt(&T, &T)
и там одного разыменования хватит
Ihor Kaharlichenko
@kaharlichenko
Jun 27 2015 17:02
зависит от того, как описать параметр замыкания
Michael Pankov
@mkpankov
Jun 27 2015 17:07
если |&x| то ты делаешь деструктуризацию при передаче параметра, и x становится &_
Ihor Kaharlichenko
@kaharlichenko
Jun 27 2015 17:08
о, спасибо за наводку, я как-то сразу не сообразил, что это деструктуризация :(
к стати, а аннотации типов вместе с деструктуризацией могут быть?
Michael Pankov
@mkpankov
Jun 27 2015 17:09
думаю да, попробуй |&x: &isize|
хотя смысла в этом вроде не очень много
Ihor Kaharlichenko
@kaharlichenko
Jun 27 2015 17:09
смысл прост - разобраться
Michael Pankov
@mkpankov
Jun 27 2015 17:12
а ну так да
ещё можно вставлять () вместо значений чтобы посмотреть на ошибку несоответствия типа, там будет типа () vs. &Arc<Mutex<MyAwesomeType>> и можно понять какого типа данная фигня
Ihor Kaharlichenko
@kaharlichenko
Jun 27 2015 17:43
спасибо за совет
Michael Pankov
@mkpankov
Jun 27 2015 17:47
TURPL классный кстати, очень советую
Ihor Kaharlichenko
@kaharlichenko
Jun 27 2015 17:48
не всё сразу :)
хотя да, там полезные буквы
Michael Pankov
@mkpankov
Jun 27 2015 17:48
про компромиссы и почему что-то как-то сделано рассказывает
например откуда вообще система владения появилась и зачем нужны Cell и RefCell
меня например долго мучал этот вопрос
Ihor Kaharlichenko
@kaharlichenko
Jun 27 2015 17:48
зачем владение? или Cell/RefCell?
Michael Pankov
@mkpankov
Jun 27 2015 17:49
второе
Ihor Kaharlichenko
@kaharlichenko
Jun 27 2015 17:49
а, ну я ещё не дошёл до этого
Michael Pankov
@mkpankov
Jun 27 2015 17:49
а первое это прикольный иллюстрирующий пример
исторический
как проблема ссылок на tagged union решается в разных языках
(на содержимое tagged union то есть)
Ihor Kaharlichenko
@kaharlichenko
Jun 27 2015 17:50
где-то я это уже читал