These are chat archives for dev-ua/rust

26th
Jun 2015
Ihor Kaharlichenko
@kaharlichenko
Jun 26 2015 15:06
Откуда берутся реализации методов для массивов больших размеров? В документации по массивам реализации трейтов определены только для размеров 0..31, как тогда работает вот это?
let a: [u32; 50] = [0xDEADBEEF; 50];
let _b = a.into_iter();
Michael Pankov
@mkpankov
Jun 26 2015 15:18
@madkinder я думаю, оно приводится к срезу (slice)
Ihor Kaharlichenko
@kaharlichenko
Jun 26 2015 15:18
оно-то приводится, но за счёт чего? в документации ничего про Deref не сказано. Откуда автоматическое приведение?
что интересно, если сделать размер массива по-меньше, то никакого приведения не происходит, используется into_iter из массива
Michael Pankov
@mkpankov
Jun 26 2015 15:23
а как ты проверяешь, что приведение происходит?
Ihor Kaharlichenko
@kaharlichenko
Jun 26 2015 15:33
  1. завернул код выше в main
  2. скомпилил: rustc src/main.rs --crate-name arr --crate-type bin -g -C no-stack-check -C opt-level=0
  3. запустил в lldb
  4. посмотрел вывод disassemble --name arr::main --mixed
чё-то в батч режиме у меня lldb не завёлся
Michael Pankov
@mkpankov
Jun 26 2015 15:34
ого, довольно адово
Ihor Kaharlichenko
@kaharlichenko
Jun 26 2015 15:34
для разных размеров массива a получилось вот это:
   0x555555559cc7 <arr::main+87>: call   0x55555555a050            ; arr::array::&'a [T; 7].IntoIterator::into_iter at array.rs:101
   0x555555559d11 <arr::main+161>: call   0x55555555a090            ; arr::slice::&'a [T].IntoIterator::into_iter at slice.rs:613
Michael Pankov
@mkpankov
Jun 26 2015 15:35
второе это для 50?
т.е. он как бы Unsized становится
Ihor Kaharlichenko
@kaharlichenko
Jun 26 2015 15:35
как видно в одном случае было [u32; 7], в другом [u32; 50]
та фиг его знает :( я сейчас пытаюсь с итераторами разобраться, когда ссылки там используются, когда значения, когда копируются, когда нет. просто по исходникам ничего непонятно
Michael Pankov
@mkpankov
Jun 26 2015 15:36
как непонятно
Ihor Kaharlichenko
@kaharlichenko
Jun 26 2015 15:36
никак :)
Michael Pankov
@mkpankov
Jun 26 2015 15:36
из типа же видно что там - T, &T &mut T и т.д.
Ihor Kaharlichenko
@kaharlichenko
Jun 26 2015 15:36
не-не, погоди :)
начнём сначала: есть let a: [u32; 50] = [0xDEADBEEF; 50];
откуда берётся into_iter()?
просто глядя на доку вообще неясно
Michael Pankov
@mkpankov
Jun 26 2015 15:37
это я тоже пока не понял, но причём тут когда ссылки используются когда значения
это-то должно быть понятно вроде
Ihor Kaharlichenko
@kaharlichenko
Jun 26 2015 15:37
ни разу
например:
let _a = [1i32, 2, 3, 4, 5];
let mut _it = _a.iter();
// expected: Option<i32>
// found:    Option<&i32>
// let _b: Option<i32> = _it.nth(2);
почему так?
как я это могу понять из документации?
по-первых, для массива iter() в документации просто отсутствует, от слова "совсем"
спасибо lldb, оттуда можно понять, что это slice::iter() из src/libcollections/slice.rs:304