Форум программистов, компьютерный форум, киберфорум
Rust
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.72/25: Рейтинг темы: голосов - 25, средняя оценка - 4.72
Заблокирован

Проблемы Rust

04.03.2021, 13:30. Показов 5603. Ответов 31

Студворк — интернет-сервис помощи студентам
Привет всем. Предлагаю в этой теме собирать, обсуждать и предлагаю решение тех проблем, которые язык Rust создаёт своим пользователям.

Язык Rust предлагает много полезных инструментов своим пользователям.
Но и ставит препоны им он тоже довольно часто.
Самый простой пример - Rust не позволяет считать просто число из входного потока.
Вместо этого нам предлагают читать строки.

пример:


C
1
2
3
4
5
6
7
8
9
10
use std::io::{self, prelude::*};
 
fn main() {
   
   let mut number = String::new();
   
   io::stdin().read_line(&mut buf).unwrap();
 
   println!("{}", num);
}
Но что, если нам надо хранить входные данные именно как число, а не как строку?
Нам предлагается ее "распарсить".

C
1
2
3
4
5
6
7
8
9
10
11
12
13
use std::io::{self, prelude::*};
 
fn main() {
   
   let mut number = String::new();
   let mut digits = 0;
   
    io::stdin().read_line(&mut number).unwrap();
    digits = number.trim().parse::<i32>().unwrap(); //перед тем, как парсить нужно убрать из строки все лишнее, чтобы остались только цифры.
    //для этого применяем еще и  метод trim() к строке иначе получим ошибку!
    println!("{}", digits);
 
}
Все прекрасно.
Но что если введенное число больше i32?
Опять получим ошибку и панику.
Как быть? Парсить как самый большой тип, а потом приводить к нужному?
Тут опять возникают вопросы, так как не все типы можно приводить друг к другу.

Остаётся применять костыли и парсить саму строку именно как строку.

Например если я хочу получить число u8, то можно посчитать длину строки.

C
1
2
3
if number.len() > 3  {
  ...
}
И если она превышает 3 символа(без учёта символа конца строки), то это число уже точно не попадает в диапазон типа u8.
Тогда вам придётся знать и помнить диапазоны значений или вызывать их из библиотеки.

продолжение следует...

Добавлено через 46 минут
З.Ы. можно использовать синтаксис match, но проблема в том, что match должен возвращать один и тот же тип из всех ветвей: вернуть число или сообщить об ощибке просто так не выйдет. Придется создавать новый тип, который будет служить контейнером.
А вот синтаксис if let подойдет в самый раз. И не придется считать длинну строки.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.03.2021, 13:30
Ответы с готовыми решениями:

Проблемы в реализации md5 на Rust
решил сам реализовать md5 га Rust но возникла проблема. алгоритм вроде правильный но результат нет можете подсказать где ошибка? код: ...

Я хочу писать на Rust но у меня возникли проблемы
при установке rustup - init вылезают подобные ошибки:error: could not rename component file from...

[Rust] Обсуждение возможностей и предстоящей роли языка Rust
Psilon, чем он тебя так привлек? И почему именно &quot;убийца плюсов&quot;? Если напишешь развернутый ответ, обещаю вынести в отдельную тему и...

31
Заблокирован
09.03.2021, 12:22  [ТС]
Студворк — интернет-сервис помощи студентам
korvin_, а еще я вот сейчас смотрю и в Rust нет фактически алгоритмов, которые позволяют открыть файл, считать его целиком в буфер и закрыть файл. Методы fs::read_to_string, fs::read сами открывают файл, читают данные. Закрывают ли они потом файл, проверяю ли на ошибки - остаётся загадкой.
Есть вот только read_to_end в io::Read.

Добавлено через 1 минуту
Цитата Сообщение от korvin_ Посмотреть сообщение
Если файл только читается, то вызывать sync_all не нужно, очевидно же.
я про это и говорю. по этому как проверить, что файл закрыт?
Цитата Сообщение от korvin_ Посмотреть сообщение
Так после записи и вызывай sync_all, если хочешь убедиться, что всё записалось, в чём проблема?
проблема не в том, что всё ли записалось или нет. проблема в том, что дискриптор файла все еще может быть открыт для других операций.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
09.03.2021, 12:27
Цитата Сообщение от RatPoison Посмотреть сообщение
по этому как проверить, что файл закрыт?
А как ты проверишь, что файл закрыт, по результату close?

Цитата Сообщение от RatPoison Посмотреть сообщение
проблема в том, что дискриптор файла все еще может быть открыт для других операций.
И? В чём тут проблема?
0
Заблокирован
09.03.2021, 12:31  [ТС]
Цитата Сообщение от korvin_ Посмотреть сообщение
А как ты проверишь, что файл закрыт, по результату close?
fclose в С
Возвращаемое значение
Если файл успешно закрыт, возвращается нулевое значение.
В случае ошибки, возвращается EOF.

Цитата Сообщение от korvin_ Посмотреть сообщение
И? В чём тут проблема?
В том, что это может привести в потере данных. у меня так в C было.
0
Модератор
 Аватар для Curry
5164 / 3519 / 536
Регистрация: 01.06.2013
Сообщений: 7,657
Записей в блоге: 9
09.03.2021, 12:47
Цитата Сообщение от korvin_ Посмотреть сообщение
А если вы ещё имели дело и с C++
В плюсах не рекомендуется кидать исключения из деструктора, по этому, там та же проблема с обработкой ошибок при закрытии в деструкторе ofstream, например. Нужно выполнять close() до выхода из скопа, иначе ошибку не поймаешь.
0
Заблокирован
09.03.2021, 13:08  [ТС]
Посмотрел как с этим дела обстоят у Vlang.
Забавно, что тут чувак требует
Eliminate file.close() and related using destructors #1325
I thought Go missed an opportunity when garbage collection didn't extend to streams and files. They required manual "freeing/closing" instead of the language handling it for me when the variable went out of scope. Defer was pushed as a helper for calling close, but this doesn't work correctly in a loop unless it's wrapped by a function. Mistakes are often made with http clients in Go for example.

This would reduce code size, eliminate leaks and reduce cognitive load. Thoughts?

Ниже он так же ссылается на Rust и метод Drop.
Когда в Rust это само является проблемой )

Автор ему отвечает

medvednikov commented on 27 Jul 2019

This was discussed on Telegram, several people noted that such things should be explicit.

I had a similar idea.

Чтобы не было такой котовасии, на мой взгляд, должны быть методы которые реализуют диструктор автоматически, но при этом проверяют ошибки. И методы, которые подразумевают ручное управление.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
09.03.2021, 13:33
Цитата Сообщение от RatPoison Посмотреть сообщение
fclose в С
Возвращаемое значение
Если файл успешно закрыт, возвращается нулевое значение.
В случае ошибки, возвращается EOF.
Нет, файл всегда закрывается.

https://man7.org/linux/man-pages/man2/close.2.html

Dealing with error returns from close()

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
       … the Linux kernel
       always releases the file descriptor early in the close operation,
       freeing it for reuse; the steps that may return an error, such as
       flushing data to the filesystem or device, occur only later in
       the close operation.
 
       Many other implementations similarly always close the file
       descriptor (except in the case of EBADF, meaning that the file
       descriptor was invalid) even if they subsequently report an error
       on return from close().
 
       …
 
       This permits the behavior that occurs on Linux and many other
       implementations, where, as with other errors that may be reported
       by close(), the file descriptor is guaranteed to be closed.
А возможные ошибки связаны с предыдущими операциями write (соответственно, если сделан успешный sync_all, то их не будет), либо при некорректной дескрипторе (а получить некорректный дескриптор при RAII синтаксически не возможно).

Code
1
2
       A careful programmer who wants to know about I/O errors may
       precede close() with a call to fsync(2).
Цитата Сообщение от RatPoison Посмотреть сообщение
В том, что это может привести в потере данных. у меня так в C было.
Успешный close не гарантирует отсутствия потери данных.

NOTES

Code
1
2
3
4
5
6
       A successful close does not guarantee that the data has been
       successfully saved to disk, as the kernel uses the buffer cache
       to defer writes.  Typically, filesystems do not flush buffers
       when a file is closed.  If you need to be sure that the data is
       physically stored on the underlying disk, use fsync(2).  (It will
       depend on the disk hardware at this point.)
0
Модератор
 Аватар для Curry
5164 / 3519 / 536
Регистрация: 01.06.2013
Сообщений: 7,657
Записей в блоге: 9
09.03.2021, 14:52
Можно сделать по принципу функции withFile из Haskell
Rust
1
2
3
4
   with_file_create("foo.txt", |file| {
        file.write(......);
        file.write(......);
    }).unwrap();
Функция with_file_create создаёт файл, передаёт открытый файл для работы замыканию, а при завершении замыкания выполняет всё что нужно для корректного закрытия файла и возвращает ошибку если надо.
Принцип, я думаю, понятен.
Заодно и свежеприделанный mik-a-el-ем тег RUST проверю.
p.s. Мда, тег есть, раскраски пока нет. Ну, будем надеяться, это временно.

Добавлено через 28 минут
Хм. Подсветки немного прибавилось.
Проверим. А функция with_file_create могла бы выглядеть, наверное, как то так.
Rust
1
2
3
4
5
6
7
8
9
10
11
use std::fs::File;
use std::path::Path;
 
fn with_file_create<P: AsRef<Path>, F, R: Send>(p : P, f : F) -> std::io::Result<R>
    where F : FnOnce(&mut File) -> R + Send + 'static
{
    let mut file = File::create(p)?;
    let result = Ok(f(&mut file));
    file.sync_all()?;
    result
}
p.s. С подсветкой не лучше чем если тег С указывать.
0
Администратор
 Аватар для mik-a-el
87964 / 53285 / 249
Регистрация: 10.04.2006
Сообщений: 13,783
09.03.2021, 14:58
Curry, геши само генерирует цсс в зависимости от файла языка. Можете поискать альтернативный, если хотите.
0
Модератор
 Аватар для Curry
5164 / 3519 / 536
Регистрация: 01.06.2013
Сообщений: 7,657
Записей в блоге: 9
09.03.2021, 16:38
Цитата Сообщение от mik-a-el Посмотреть сообщение
Можете поискать альтернативный, если хотите.
Что то не ищется. Даже розеттакоде использует старый вариант, хотя там тоже geshi.
История повторяется как с Haskell. И в Haskell, и в Rust одиночный апостроф не обязательно начало символьного литерала, если после (') не следует (\) и через символ апостроф снова не повторяется, то выделять его как строку не нужно, он не будет парным.
Самый простой способ удалить в rust.php, в
PHP
1
'QUOTEMARKS' => array("'", '"'),
первый элемент массива. Тогда и настоящие символьные литералы не будут красным закрашиваться.
Для Haskell на киберфоруме как то хитрее переделали, но исходник я не видел.

Добавлено через 6 минут
p.s. Кстати, и для F# та же засада - апостров используется не только для символьного литерала.
0
Заблокирован
09.03.2021, 17:30  [ТС]
Цитата Сообщение от Curry Посмотреть сообщение
Заодно и свежеприделанный mik-a-el-ем тег RUST проверю.
что-то я не вижу этот тег
0
Модератор
 Аватар для Curry
5164 / 3519 / 536
Регистрация: 01.06.2013
Сообщений: 7,657
Записей в блоге: 9
09.03.2021, 17:34
Его вручную нужно набирать [_RUST][/_RUST]. Подчёркивания только уберите. Таких секретных тегов на киберфоруме много.
1
Заблокирован
09.03.2021, 18:38  [ТС]
Curry, ясно)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.03.2021, 18:38

[Rust] Как привязывать WinAPI-функции к коду на Rust?
Может кто-нить дать код, КАК привязывать вин апишные функции к растовскому коду (на примере MesageBox). ...

Расскажите о своём опыте программирования на Rust
Доброе утро! Расскажите, пожалуйста, о своём опыте программирования на Rust. Можно в сравнении с C# или Delphi. Спасибо.

Язык V (VLang)
Пока программисты C++ думаю станет ли Rust тем языком, который сможет потеснить плюсы и занять их нишу, сам Rust уже пятый год подряд...

[Rust] Time
Подскажите как узнать время в Rust. //Rust extern crate time; fn main() { let now = time::get_time(); ...

Rust+assembler
Как связать язык rust и ассемблер не используя ассемблерные вставки(неудобно использовать их в RUSTе)?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
Новые блоги и статьи
Теория всего 12. ВГК
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928 Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
Теория всего 11. Основные параметры
anaschu 21.07.2026
Дешифровка тензорного ядра Soil Chemistry 2. 0: Истинный инвариант Теории Всего Чистовой исходный код многокомпонентной сукцессии зафиксирован. Модель оперирует единым вектором состояния. . .
Теория всего 10. Клод трусишка
anaschu 21.07.2026
Алгоритмический суицид ИИ: Когда математика ОДУ взламывает цензурные шлюзы Свежайший мета-прецедент нашей разработки! Клод официально отказался строить итоговую кроссплатформенную модель, как. . .
Теория всего 9. Окончательная проработка метафоры "дерево = традиции"
anaschu 21.07.2026
Скрытые параметры ядра ОДУ: Механика Глубинного Рока Клод утаил от вас ключевую математику кризисов. В движке игры зашиты пять скрытых коэффициентов, определяющих, как именно ТНК и Мемы ломают. . .
Теория всего 8. Clauude трусишка. Ответ джемени
anaschu 21.07.2026
Игровой баланс «Модели Всего»: Алгоритмический блок как механика Семантического БуфераЭтот скриншот отказа Клода — идеальный, чистейший прецедент для нашей Теории Всего. Вы столкнулись не просто с. . .
Теория всего 7. Дерево - это патриархат, грибы - это феминизм
anaschu 21.07.2026
Уничтожение Патриархата: Как ТНК, Мемы и Половой отбор зачистили «Сексуальный Пролетариат» Величайшая иллюзия современного человека — вера в «свободу воли», «социальный прогресс» и «эволюцию. . .
История и социология Терры на примере борьбы микориз за пространство. 1. Глоссарий терры.
anaschu 21.07.2026
Решил тут подумать о возможности сделать лор некоторой комп игры - стратегии, или худжественной книги антиутопии, которые будут юзать планету,которая максимально будет похожа на нашу землю, но где. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru