1.66.0
От: sergii.p  
Дата: 27.12.22 16:07
Оценка: +2 -1
вышла новая версия. Из интересного:


тонкая настройка enum

можно выставлять идентифицирующее значение для enum со значениями
#[repr(u8)]
enum Foo
{
    A(i8), B(u8), C(bool) = 42, D    
}

теперь Foo::C(false) в памяти будет представлена как [42, 0].

core::hint::black_box

Можно подсказать компилятору не оптимизировать результат выполнения какой-то операции. В основном надо для профилирования

fn push_cap(v: &mut Vec<i32>) {
    for i in 0..4 {
        v.push(i);
        black_box(v.as_ptr());
    }
}

pub fn bench_push() -> Duration { 
    let mut v = Vec::with_capacity(4);
    let now = Instant::now();
    push_cap(&mut v);
    now.elapsed()
}


здесь если не указать black_box, компилятор практически полностью выкинет код push_cap и замер будет нерелевантен.
Такой себе аналог volatile.

cargo remove

появилась возможность выкидывать пакеты (cargo add была добавлена ранее в 1.62)

диапазоны в match

добавлена поддержка диапазонов в match
let v= 42;
let i = match v{
    ..=45 => true,
    45.. => false
}


ранее приходилось несколько извращаться
let v= 42;
let i = match v{
    0..=45 => true,
    _ => false
}


почитать на английском https://blog.rust-lang.org/2022/12/15/Rust-1.66.0.html
Re: 1.66.0
От: T4r4sB Россия  
Дата: 27.12.22 17:48
Оценка:
Здравствуйте, sergii.p, Вы писали:

SP>
тонкая настройка enum

SP>можно выставлять идентифицирующее значение для enum со значениями

SP>
SP>#[repr(u8)]
SP>enum Foo
SP>{
SP>    A(i8), B(u8), C(bool) = 42, D    
SP>}
SP>

SP>теперь Foo::C(false) в памяти будет представлена как [42, 0].

Это зачем? Для совместимости с сишковыми либами что ли?
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[2]: 1.66.0
От: sergii.p  
Дата: 27.12.22 19:41
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Это зачем? Для совместимости с сишковыми либами что ли?


да.
Ещё можно представить ситуацию с различными протоколами. Н-р modbus. Тип сообщения может быть 1, 2, 5, 15. И в зависимости от типа дальше идёт свой специализированный набор данных различного размера. Дальше накидываем mem::transmute и получаем из набора данных готовый enum. Я бы может и побоялся на такую фишку языка ориентироваться, но выглядит лаконично и заманчиво.
Re[3]: 1.66.0
От: T4r4sB Россия  
Дата: 27.12.22 19:44
Оценка:
Здравствуйте, sergii.p, Вы писали:

SP>Дальше накидываем mem::transmute и получаем из набора данных готовый enum.


Готовый енум из кода можно получить более консервативным способом: через свитч (ну или матч, если это Раст). Да, для этого надо строк примерно сколько вариантов в енуме, но вроде ничего криминального.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.