The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Режим отображения отдельной подветви беседы [ Отслеживать ]

Оглавление

Выпуск языка программирования Rust 1.57, opennews (??), 02-Дек-21, (0) [смотреть все]

Сообщения [Сортировка по времени | RSS]


289. "Выпуск языка программирования Rust 1.57"  +1 +/
Сообщение от Филимон Любопытный (?), 03-Дек-21, 19:40 
Спасибо за разъяснения. В знак благодарности обещаю не угорать над Рустом две следующие новости. Есть ещё маленький вопрос: я правильно понимаю, что

const _: () = assert!(std::mem::size_of::<u64>() == 8);

это эквивалент

static_assert(sizeof(uint64_t) == 8);


???

Ответить | Правка | Наверх | Cообщить модератору

290. "Выпуск языка программирования Rust 1.57"  +/
Сообщение от Прохожий (??), 03-Дек-21, 19:48 
std::mem легко можно убрать из этого выражения, если вы на громоздкость намекаете, задействуя use. Например:

use std::mem::size_of;

"const _:() =" тоже по сути не сильно нужен. Можно без него обойтись.

в итоге останется:

assert!(size_of::<u64>() == 8);

Сойдёт?

Ответить | Правка | Наверх | Cообщить модератору

293. "Выпуск языка программирования Rust 1.57"  +/
Сообщение от Прохожий (??), 03-Дек-21, 20:03 
Восклицательный знак в assert!() означает, что мы используем макрос. Так проще отличать от других функций.
Ответить | Правка | Наверх | Cообщить модератору

322. "Выпуск языка программирования Rust 1.57"  +/
Сообщение от Онаним (?), 03-Дек-21, 22:09 
Восклицательный знак - это что-то от эмо-культуры. Упасть на пол и стенать рыданиями. Или рыдать стенаниями.
Ответить | Правка | Наверх | Cообщить модератору

331. "Выпуск языка программирования Rust 1.57"  +/
Сообщение от Аноним (-), 03-Дек-21, 22:37 
>> !(a != 0)
> Восклицательный знак - это что-то от эмо-культуры. Упасть на пол и стенать
> рыданиями. Или рыдать стенаниями.

Паскалист, не пались ...

Ответить | Правка | Наверх | Cообщить модератору

332. "Выпуск языка программирования Rust 1.57"  +/
Сообщение от Онаним (?), 03-Дек-21, 22:41 
Ты просто не чувствуешь разницы.
В твоём выражении это просто логика.
А вот assert!() - это именно оно, бить ногами, ассертя хочуху.
Ответить | Правка | Наверх | Cообщить модератору

333. "Выпуск языка программирования Rust 1.57"  +/
Сообщение от Онаним (?), 03-Дек-21, 23:13 
Ну и кстати да, ты даже не ошибся, я вполне себе и в паскаль с дельфи умею.
Хотя это старое умение, почти забытое уже.
Ответить | Правка | К родителю #331 | Наверх | Cообщить модератору

291. "Выпуск языка программирования Rust 1.57"  +/
Сообщение от Прохожий (??), 03-Дек-21, 19:52 
> обещаю не угорать над Рустом две следующие новости

Хочу заметить, что не всегда смех без причины понятен окружающим. Даже пословица есть на эту тему подходящая.

Ответить | Правка | К родителю #289 | Наверх | Cообщить модератору

295. "Выпуск языка программирования Rust 1.57"  +1 +/
Сообщение от Филимон Тактичный (?), 03-Дек-21, 20:08 
Ну, в данном случае, значение слова "угорать" было ближе к "издеваться", но я не хотел вас задеть (ибо Куверти не выдержал и куда-то пропал) и в последний момент заменил.

Я не намекал на громоздкость. Я честно пытаюсь понять зачем вы пишите длинно и непонятно там где уже можно писать понятно и лаконично. Просто для себя. Из любопытства. Так иногда бывает, когда видишь хрень лютую и непонятную настолько, что начинаешь думать, что пропустил что-то фундаментальное. Больше нет вопросов. Спасибо за ответы.

Ответить | Правка | Наверх | Cообщить модератору

298. "Выпуск языка программирования Rust 1.57"  +/
Сообщение от Прохожий (??), 03-Дек-21, 20:16 
Да, пожалуйста, задевайте на здоровье.  Чем бы дитя не тешилось, как говорится. ;)

Я - не фанат Раст. У меня вообще другая профессиональная область интересов. Просто не нравится атмосфера, в которой идёт обсуждение очередной новости об этом языке. Вот и вся причина, почему я некоторым могу со стороны показаться токсичным.

У любого языка есть недостатки. Это я готов признавать и признаю. Но давайте же обсуждать что-либо КОНСТРУКТИВНО. Вот как вы, например. Вам что-то непонятно, вы задали вопрос. Я, как смог, ответил. Но когда приходят люди, и начинают сходу писать "язык для идиотов", "не нужно" и так далее, то разговаривать с такими вежливо не получается.

Заранее благодарен за понимание.

Ответить | Правка | Наверх | Cообщить модератору

292. "Выпуск языка программирования Rust 1.57"  +1 +/
Сообщение от От.Со.Сишник (?), 03-Дек-21, 20:03 
> Есть ещё маленький вопрос: я правильно понимаю, что
> const _: () = assert!(std::mem::size_of::<u64>() == 8);
> это эквивалент
> static_assert(sizeof(uint64_t) == 8);
> ???

"Эквивалент" - это вот тут https://docs.rs/static_assertions/0.1.1/static_assertions/in...
Нюанс в том, что растовый assert/static_assert - реализуется макросами, а не в недрах компилятора.


use std::mem::*;
#[macro_export]
macro_rules! static_assert {
    ($condition:expr) => {
        const _: &() = &[()][1 - ($condition) as usize];
    }
}

static_assert!(size_of::<usize>() == 8);
static_assert!(size_of::<*const u8>() == 8);
static_assert!(align_of::<*const u8>() >= align_of::<u128>());
static_assert!(5>3);

Ответить | Правка | К родителю #289 | Наверх | Cообщить модератору

324. "Выпуск языка программирования Rust 1.57"  +/
Сообщение от Онаним (?), 03-Дек-21, 22:10 
> const _: &() = &[()]

И вот тут я поломался, несите следующего.

Ответить | Правка | Наверх | Cообщить модератору

325. "Выпуск языка программирования Rust 1.57"  +1 +/
Сообщение от Онаним (?), 03-Дек-21, 22:10 
_: &() - это водолазу шланг перевязали
Ответить | Правка | Наверх | Cообщить модератору

328. "Выпуск языка программирования Rust 1.57"  +/
Сообщение от Онаним (?), 03-Дек-21, 22:12 
А &[()] - это водолаз, когда перевязанный шланг сохранялся слишком долго
Ответить | Правка | Наверх | Cообщить модератору

394. "Выпуск языка программирования Rust 1.57"  +1 +/
Сообщение от Sem (??), 05-Дек-21, 20:33 
Поздравляю, вы начали понимать раст )
Ответить | Правка | К родителю #325 | Наверх | Cообщить модератору

346. "Выпуск языка программирования Rust 1.57"  +1 +/
Сообщение от Cucumber (?), 04-Дек-21, 11:20 
const _: &() — объявляем константу без имени, тип которой ссылка на ничего.

[()] — создаем массив из одного ничего.

[1 - expr as usize] — берем оттуда элемент номер 1 - (подставляемое в макрос выражение, которое преобразуется в число).

&… — берем ссылку на этот элемент.

Ответить | Правка | К родителю #324 | Наверх | Cообщить модератору

347. "Выпуск языка программирования Rust 1.57"  +1 +/
Сообщение от Cucumber (?), 04-Дек-21, 11:23 
соответственно, когда результат вычисления поставляемого выражения не true или 1, то мы пытемся взять элемент за границами массива из одного элемента и программа падает.
Ответить | Правка | Наверх | Cообщить модератору

352. "Выпуск языка программирования Rust 1.57"  +1 +/
Сообщение от n00by (ok), 04-Дек-21, 11:48 
> создаем массив из одного ничего.

В Средние века вот за такое и сжигали.

Ответить | Правка | К родителю #346 | Наверх | Cообщить модератору

403. "Выпуск языка программирования Rust 1.57"  +/
Сообщение от freecoderemail (ok), 08-Дек-21, 13:49 
В этом есть смысл, так как "ничто" ничего не занимает в памяти, соответственно и массив из "ничего" ничто не займет.

Ответить | Правка | Наверх | Cообщить модератору

406. "Выпуск языка программирования Rust 1.57"  +/
Сообщение от n00by (ok), 08-Дек-21, 17:01 
Да я про костёр не шутил. Сатана - это тот, кого "нет".
Ответить | Правка | Наверх | Cообщить модератору

296. "Выпуск языка программирования Rust 1.57"  +2 +/
Сообщение от Ordu (ok), 03-Дек-21, 20:09 
> В знак благодарности обещаю не угорать над Рустом две следующие новости.

Не, в знак благодарности ты должен угорать в два раза больше. Я специально открываю новости о расте на опеннете, чтобы почитать как опеннет угорает над тем, чего не понимает.

Ответить | Правка | К родителю #289 | Наверх | Cообщить модератору

297. "Выпуск языка программирования Rust 1.57"  +1 +/
Сообщение от Ordu (ok), 03-Дек-21, 20:14 
> Есть ещё маленький вопрос: я правильно понимаю, что
> const _: () = assert!(std::mem::size_of::<u64>() == 8);
> это эквивалент
> static_assert(sizeof(uint64_t) == 8);

Нет. Результат assert'а в первом случае сохраняется в переменную. В _const_ переменную. То есть assert! должен отработать во время компиляции, а не в рантайме. И обломаться если что должна компиляция, а не рантайм.

Ответить | Правка | К родителю #289 | Наверх | Cообщить модератору

299. "Выпуск языка программирования Rust 1.57"  +/
Сообщение от Филимон Тактичный (?), 03-Дек-21, 20:22 
Т.е. это извращение (простите хак) только для того чтобы assert сработал на стадии компиляции ?!?!? Ох как необдуманно я пообещал Прохожему!


Ответить | Правка | Наверх | Cообщить модератору

301. "Выпуск языка программирования Rust 1.57"  +/
Сообщение от Прохожий (??), 03-Дек-21, 20:28 
Вам всё-таки нужно что? Протестировать программу или сохранить результат теста в константе?

И что здесь необдуманного, не могли бы вы прояснить?

Ответить | Правка | Наверх | Cообщить модератору

306. "Выпуск языка программирования Rust 1.57"  +/
Сообщение от Филимон Непонятливый (?), 03-Дек-21, 20:42 
Я не понял зачем сохранять в константе. Зачем пишется сохранение того, что не будет использовано и не может быть использовано. Ведь смысл вызвать прекращение компиляции, если не соблюдаются необходимые условия.


Ответить | Правка | Наверх | Cообщить модератору

308. "Выпуск языка программирования Rust 1.57"  +/
Сообщение от Прохожий (??), 03-Дек-21, 20:57 
Вам, если действительно интересно, лучше ознакомиться с главой 11 популярной (в узких кругах) книженции The Rust Programming Language. А потом по доке пошерстить немного.

В данной новости просто абстрактный пример был приведен. Зачем он - я не знаю, с такими случаями не сталкивался (однако, следует признать, мой опыт ограничен). Может для цепочки тестов. Как можно было проще -  ответил ранее.

Если вы запускаете "cargo test" на юнит-тестах - получите или ok, если тест пройден, или fail - в противном случае. То, что вы хотели?

Компилятор же за логикой приложения следить не может (и вряд ли должен). Это область ответственности программиста.

Ответить | Правка | Наверх | Cообщить модератору

327. "Выпуск языка программирования Rust 1.57"  +/
Сообщение от Онаним (?), 03-Дек-21, 22:11 
Честно говоря, круги слишком узкие, чтобы влезать.
И слишком громкие, чтобы просто пройти мимо.
Ответить | Правка | Наверх | Cообщить модератору

372. "Выпуск языка программирования Rust 1.57"  +/
Сообщение от Аноньимъ (ok), 05-Дек-21, 00:04 
Используйте лубрикант на силиконовой основе.
Ответить | Правка | Наверх | Cообщить модератору

307. "Выпуск языка программирования Rust 1.57"  +/
Сообщение от Ordu (ok), 03-Дек-21, 20:50 
> Вам всё-таки нужно что? Протестировать программу или сохранить результат теста в константе?

В данном случае, нужно обломаться на этапе компиляции, если размер типа не соответствует. Это может быть полезно, например, на границах с внешним миром, когда ты описываешь типы, бинарно соответствующие тому, что ты читаешь из сокета. У тебя в спецификации написано, что размер записи 24 байта, а описываешь ты эту запись поле за полем, указывая размер для каждого, как проверить, что ты не ошибся в описании ни одного из полей?

Это можно тестами проверять, но... эмм... А если у меня функция:

fn read_24_bytes_into_struc<T>(dst: &mut T) {
    // как ты здесь в компайл-тайме убедишься, что size_of::<T>() равен 24 байтам?
    // а тут надо проверить, потому что дальше пойдёт unsafe код, который сможет, если что, записать за границу выделенного буфера
    // понятно, что можно проверить в рантайме, но _зачем_ выносить в рантайм проверку, которую можно сделать в компайл тайме?
}

В C это делается как-то так:

#if sizeof(typeof(*dst)) != 24
#error "Go check sizes of your structs, moron"
#endif

Точнее делалось бы, если бы C умел бы в параметризацию по типу. Как это делается в C++, мы не знаем, не интересовались ни разу. Возможно, так же как в C.

> И что здесь необдуманного, не могли бы вы прояснить?

Нет, не могли бы. Мы не понимаем, что здесь необдуманного. Всё продумано отлично.

Ответить | Правка | К родителю #301 | Наверх | Cообщить модератору

309. "Выпуск языка программирования Rust 1.57"  +/
Сообщение от Прохожий (??), 03-Дек-21, 20:58 
Я не вам задавал вопросы. :) Филимону.
Ответить | Правка | Наверх | Cообщить модератору

310. "Выпуск языка программирования Rust 1.57"  +/
Сообщение от Ordu (ok), 03-Дек-21, 21:01 
> Я не вам задавал вопросы. :) Филимону.

А, сори. Я запутался в ответах.

Ответить | Правка | Наверх | Cообщить модератору

311. "Выпуск языка программирования Rust 1.57"  +/
Сообщение от Прохожий (??), 03-Дек-21, 21:02 
Но спасибо, что ответили.
Ответить | Правка | К родителю #309 | Наверх | Cообщить модератору

314. "Выпуск языка программирования Rust 1.57"  +/
Сообщение от Филимон Непонятливый (?), 03-Дек-21, 21:21 
Пятница. Вечер.. Наверное поэтому мы не понимаем друг друга.

Что в С, что в C++ облом на стадии компиляции организовывается через static_assert()

Я знаю зачем это нужно на практике.

Размер типа по указателю это банальный sizeof(*ptr), если ptr не на void

я НЕ понимаю зачем в Русте сохранение при ассерте в переменную. Вернее, понимаю это как хак над assert, который работает в рантайме. А, если сохранять в const, то сработает во время компиляции.

И если я это правильно понял, то это ппц. Я бы мог написать пост с объяснением почему, но он слишком длинный для пятницы. Но если кратко и непонятно: то так убивается дофаминовая система и человек идёт работать охранником.


Необдуманно я пообещал Прохожему не угорать на Рустом. Забейте. Это мой искромётный юмор

Ответить | Правка | К родителю #307 | Наверх | Cообщить модератору

315. "Выпуск языка программирования Rust 1.57"  +/
Сообщение от Ordu (ok), 03-Дек-21, 21:52 
> Пятница. Вечер.. Наверное поэтому мы не понимаем друг друга.
> Что в С, что в C++ облом на стадии компиляции организовывается через
> static_assert()

А, да, я проглядел. Но это не растовый подход. Заводить второй assert, когда можно не заводить? Зачем?

> Размер типа по указателю это банальный sizeof(*ptr), если ptr не на void

А, ну да, можно проще.

> я НЕ понимаю зачем в Русте сохранение при ассерте в переменную. Вернее,
> понимаю это как хак над assert, который работает в рантайме. А,
> если сохранять в const, то сработает во время компиляции.

Это не хак. Если я пишу:

const KEYWORDS = {
    let mut keywords = HashMap::new();
    // populate keywords
    keywords
};

То блок кода будет выполнен в компайл-тайме, и хеш-табличка будет лежать на старте программы в _созданном_ виде в KEYWORDS. (Впрочем, конкретно этот пример, я подозреваю не сработает, потому что HashMap требует аллокаций памяти, и их статически выполнять не удастся, но есть phf, он может.).

Почему бы не использовать то же самое, для выполнение assert'а? Зачем заводить специальный assert, если язык и так позволяет вызывать существующий assert в компайл-тайме? Не, если _тебе_ это зачем-то надо, ты можешь написать свой собственный макрос static_assert, который будет работать так, как тебе хочется.

> Необдуманно я пообещал Прохожему не угорать на Рустом. Забейте. Это мой искромётный
> юмор

Слава богу. Я очень рад, что ты передумал. Мои усилия прошли не даром.

Ответить | Правка | Наверх | Cообщить модератору

381. "Выпуск языка программирования Rust 1.57"  +/
Сообщение от Онаним (?), 05-Дек-21, 00:13 
> Зачем заводить специальный assert, если язык и так позволяет вызывать существующий assert в компайл-тайме

Вот в этом весь хруст.

Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру