The OpenNET Project / Index page

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



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

Оглавление

Выпуск языка программирования Rust 1.77, opennews (?), 22-Мрт-24, (0) [смотреть все]

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


98. "Выпуск языка программирования Rust 1.77"  –2 +/
Сообщение от Аноним (184), 22-Мрт-24, 19:41 
> https://ibb.co/ZYfJDwM
> Когда вижу такой синтаксис, моя рука тянется к нагану

Не самый плохой пример, кстати. Или вот:


pub fn read<P: AsRef<Path>>(path: P) -> io::Result<Vec<u8>> {
  fn inner(path: &Path) -> io::Result<Vec<u8>> {
    let mut file = File::open(path)?;
    let mut bytes = Vec::new();
    file.read_to_end(&mut bytes)?;
    Ok(bytes)
  }
  inner(path.as_ref())
}

Тоже не самый плохой из возможных :)
Вырвиглаз в расте обречен из за перегруженной семантики. Тут ничего не поделаешь.

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

125. "Выпуск языка программирования Rust 1.77"  +2 +/
Сообщение от freecoder (ok), 22-Мрт-24, 21:18 
Зачем писать бессмысленные нагромождения синтаксиса? Можно и лаконичнее.
pub fn read(path: impl AsRef<Path>) -> io::Result<Vec<u8>> {
    let mut bytes = Vec::new();
    File::open(path.as_ref())?.read_to_end(&mut bytes)?;

    Ok(bytes)
}


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

131. "Выпуск языка программирования Rust 1.77"  –1 +/
Сообщение от Аноним (184), 22-Мрт-24, 21:45 
> Зачем писать бессмысленные нагромождения синтаксиса?

Не бессмысленное, а чтоб показать влияние семантики.

> Можно и лаконичнее.

Можно хоть в однострочник всё запихать. Всё равно вырвиглаз. Со временем можно привыкнуть, но... вырвиглаз.

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

217. "Выпуск языка программирования Rust 1.77"  –1 +/
Сообщение от Вы забыли заполнить поле Name (?), 24-Мрт-24, 13:12 
> Зачем писать бессмысленные нагромождения синтаксиса? Можно и лаконичнее.
>
pub fn read(path: impl AsRef<Path>) -> io::Result<Vec<u8>> { 
>     let mut bytes = Vec::new();
>     File::open(path.as_ref())?.read_to_end(&mut bytes)?;
>     Ok(bytes)
> }

Как определить какие возможные ошибки может вернуть данная функция? Для этого надо в код File::open и read_to_end смотреть?

Почему ошибки аллокации в Vew::new никак не обрабатываются? Считается нормной просто запаниковать и упасть?

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

225. "Выпуск языка программирования Rust 1.77"  +/
Сообщение от Аноним (-), 25-Мрт-24, 12:12 
> Как определить какие возможные ошибки может вернуть данная функция?

Посмотреть на возвращаемое значение и увидеть там не Result, а io::Result; хлопнуть себя ладонью по лбу и сказать "аааа, это ж та обёртка над Result, которая Result<T, io::Error>".

Если это неочевидно, но интересно, то я бы рекомендовал не вопросы по форумам задавать, а пойти и почитать Rust Book.

> Почему ошибки аллокации в Vew::new никак не обрабатываются? Считается нормной просто запаниковать и упасть?

Да.

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

227. "Выпуск языка программирования Rust 1.77"  +/
Сообщение от Вы забыли заполнить поле Name (?), 25-Мрт-24, 13:25 
>> Как определить какие возможные ошибки может вернуть данная функция?
> Посмотреть на возвращаемое значение и увидеть там не Result, а io::Result; хлопнуть
> себя ладонью по лбу и сказать "аааа, это ж та обёртка
> над Result, которая Result<T, io::Error>".

А если бы там кроме io::Error были бы другие, например от сторонней либы, что тогда писать?

>> Почему ошибки аллокации в Vew::new никак не обрабатываются? Считается нормной просто запаниковать и упасть?
> Да.

Кек. Нормально для системного языка.

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

233. "Выпуск языка программирования Rust 1.77"  +/
Сообщение от Аноним (-), 25-Мрт-24, 18:45 
> А если бы там кроме io::Error были бы другие, например от сторонней либы, что тогда писать?

То есть, если функция генерирует ошибки разного типа, и их все хочется возвращать?

Есть разные подходы. Либо ты садишься и создаёшь свой тип ошибок, который включает все, либо берёшь anyhow и оставляешь эту задачу ему. anyhow конструирует типы ошибок в динамике, то есть ты получаешь vtables, аллокации памяти из кучи и все прочие неотъемлимые ООП гнусности.

> Нормально для системного языка.

Да. Бывают исключения, но это де факто статистическая норма.

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

235. "Выпуск языка программирования Rust 1.77"  +/
Сообщение от Вы забыли заполнить поле Name (?), 25-Мрт-24, 22:47 
>> А если бы там кроме io::Error были бы другие, например от сторонней либы, что тогда писать?
> То есть, если функция генерирует ошибки разного типа, и их все хочется
> возвращать?

Ну кажется нормальная задача. Вот функция работает с io + разбирает какой-то формат и там могут быть свои ошибки.

> Есть разные подходы. Либо ты садишься и создаёшь свой тип ошибок, который
> включает все, либо берёшь anyhow и оставляешь эту задачу ему. anyhow
> конструирует типы ошибок в динамике, то есть ты получаешь vtables, аллокации
> памяти из кучи и все прочие неотъемлимые ООП гнусности.

В zig как я понял можно просто написать ?T в возваращаемом типе и все возможные ошибки функции будут выведены в compile time. Странно, что в расте для этого нужны какие-то приседния.


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

254. "Выпуск языка программирования Rust 1.77"  +/
Сообщение от freecoder (ok), 27-Мрт-24, 10:16 
> В zig как я понял можно просто написать ?T в возваращаемом типе
> и все возможные ошибки функции будут выведены в compile time. Странно,
> что в расте для этого нужны какие-то приседния.

Допустим, внутри функции генерируется ошибка типа E и другая ошибка типа U. Чему будет равен обобщающий обе ошибки тип T?

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

261. "Выпуск языка программирования Rust 1.77"  +/
Сообщение от Вы забыли заполнить поле Name (?), 27-Мрт-24, 22:49 
>> В zig как я понял можно просто написать ?T в возваращаемом типе
>> и все возможные ошибки функции будут выведены в compile time. Странно,
>> что в расте для этого нужны какие-то приседния.
> Допустим, внутри функции генерируется ошибка типа E и другая ошибка типа U.
> Чему будет равен обобщающий обе ошибки тип T?

https://ziglang.org/documentation/master/#Merging-Error-Sets

Мне вот интересно как это в расте будет.

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

263. "Выпуск языка программирования Rust 1.77"  +/
Сообщение от Карлос Сношайтилис (ok), 31-Мрт-24, 21:21 
А мне вот непонятно, как сделано в зиге.
По твоей ссылке там джойн одинаковых типов - енамов (не знаю как они в зиге называются).
А если у тебя ошибки разных типов?
Енам, строка, число, объект. Зиг просто в кучу сваливает?
А если конфликт имён, как понять где какая ошибка? Или не скомпилируется?
Ответить | Правка | Наверх | Cообщить модератору

236. "Выпуск языка программирования Rust 1.77"  +1 +/
Сообщение от Вы забыли заполнить поле Name (?), 25-Мрт-24, 22:49 
>> Нормально для системного языка.
> Да. Бывают исключения, но это де факто статистическая норма.

https://lkml.org/lkml/2021/4/14/1099

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

256. "Выпуск языка программирования Rust 1.77"  +/
Сообщение от freecoder (ok), 27-Мрт-24, 10:30 
Это было 3 года назад.

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

260. "Выпуск языка программирования Rust 1.77"  +/
Сообщение от Вы забыли заполнить поле Name (?), 27-Мрт-24, 22:47 
> Это было 3 года назад.

А что изменилось?

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

255. "Выпуск языка программирования Rust 1.77"  +/
Сообщение от freecoder (ok), 27-Мрт-24, 10:25 
> Кек. Нормально для системного языка.

Так-то Rust не является специализированным языком для системного программирования, скорее это язык общего назначения, допускающий применение в системном программировании. Проблема с паниками при аллокации - со временем решается в языке. В случае с `Vec`, если вам нужно обработать ошибку аллокации, используйте метод `try_reserve`.

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

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

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




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

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