Блог*
الذهاب إلى القناة على Telegram
Блог со звёздочкой. Много репостов, немножко программирования. Небольшое прикольное комьюнити: @decltype_chat_ptr_t Автор: @insert_reference_here
إظهار المزيد1 927
المشتركون
-124 ساعات
+47 أيام
+430 أيام
أرشيف المشاركات
1 928
Repost from I’m CEO, beach
Команда, у нас и так мужчин в офисе почти нет. А те, кто остались, просятся идти работать из нашего подвала. Зачем? Если узнаю, что делаете там подкоп, чтобы свалить домой пораньше - будет штраф.
Давайте работать.
1 928
А ещё я забыл, что ссылка на массив приводится к ссылке на слайс. Следовательно, раз у меня длина точная, мне не нужна
std::slice::from_raw_parts в const-контексте, а достаточно std::str::from_utf8_unchecked, которая была стабилизирована в const-контексте ещё в Rust 1.55.0, год назад, что я сейчас и проверил только что на godbolt.
Обновил гист. Опять.
Ощущаю себя невероятно тупым.1 928
Более того, зная наперёд количество цифр, мы можем заполнять массив с конца, чтобы строка получилась сразу в правильном порядке, а не оборачивать его в конце!
Ещё раз обновил гист.
1 928
Если растаману отрубить голову, он ещё пять минут будет говорить о преимуществах borrow checker-а
1 928
#prog #rust
То есть, согласно miri,
let s_rt: &[u8] = unsafe {
std::slice::from_raw_parts(
std::convert::identity([0]).as_ptr(),
1,
)
};
— это не ок, потому что тут создаётся висячая ссылка. Логично, значение, возвращаемое identity, дохнет после вызова функции.
Но: также согласно miri, тот же самый код, но в const-контексте,
const S_CONST: &[u8] = unsafe {
std::slice::from_raw_parts(
std::convert::identity([0]).as_ptr(),
1,
)
};
— это ок, тут никаких висящих ссылок нет. Потому что, тут, видимо, значение, возвращаемое константной identity, вызвано на константном значении и потому само является константным и может быть использовано для static promotion? Даже не смотря на отсутствие на identity атрибута #[rustc_promotable], поскольку возвращаемое значение не является непосредственно promotable значением и вычисляется внутри инициализатора константы?
И при этом, согласно всё тому же miri, если убрать identity:
let s_rt: &[u8] = unsafe {
std::slice::from_raw_parts([0].as_ptr(), 1)
};
, то всё ок и никаких висячих ссылок нету? Потому что [0] промоутится? А, нет, потому что это &[u8], но не &'static [u8], тогда miri жалуется.
Короче, я тут так лихо отредактировал, что умудрился написать код, который вроде ок в const-контексте, но при этом вызывает UB в рантайме. Ещё раз поправил гист, теперь вроде висячих ссылок нету.1 928
#prog #rust #моё
"Вижу цель — не вижу препятствий", или о превратностях туннельного зрения.
Даже после точного подсчёта размера буфера
to_ascii возвращает пару из буфера и размера записанной части. Но зачем? Буфер _уже_ в точности того размера, который нужен — LEN! Значит, можно просто возвращать Array и не считать len, тем самым упростив код.
Переписал гист.1 928
События последних дней таки догнали мою психику. Разрыдался.
И, кажется, у меня нервный тик.
