Re[3]: Option vs ? - критика Rust
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 21.10.23 13:49
Оценка: -1
Здравствуйте, Zhendos, Вы писали:

Z>Здравствуйте, gandjustas, Вы писали:


S>>>Ведь Rust отстает, получается.

G>>Да, с точки зрения синтаксических возможностей раст довольно бедный язык. ? оператор есть, а ?? нет. И ! нет, надо везде писать .unwrap().

Z>"unwrap" как раз не надо везде писать, он нужен для тестов или "main" функции,

Z>"unwrap" в коде функции как раз антепатерн.
Например я пишу приложение, которое pdf файлы разбирает на кусочки. Если друг не получилось прочитать или записать файл, то программа должна упасть. У меня нет других вариантов обработки этой ошибки. Причем упасть желательно со стектрейсом. Почему в этом случае я не должен использовать unwrap?

G>>Нет оператора is как C#, предлагается через громоздкий if let делать.

G>>А еще нет перегрузок функций, дефолтных параметров, нет функций с переменным числом параметров.

Z>Я бы назвал это как раз достоинствами. В областях где нужна надежность,

Z>код который можно только однозначно понять очень важен.

Твоя вера сильна.



Z>И неявная передача дополнительного параметра (дефолтные параметры),

Z>или наличие функций с одинаковыми именами, но потенциально разным поведением в одном контексте (перегрузка)
Z>это однозначно плохо.
Говорят, если белое долго называть черным, то некоторые даже поверят.

Z>Из-за совместимости с С функции с переменным числом параметров как раз поддерживаются:

Z>
Z>extern "C" {
Z>    pub fn printf(__format: *const ::std::os::raw::c_char, ...) -> ::std::os::raw::c_int;
Z>}
Z>

Ты же не можешь в расте сделать свою функцию с переменным числом параметров. Даже если ты её потом экспортируешь.

G>>Операции с указателями крайне неудобны, так как операция разыменовывания имеет меньший приоритет и нет оператора -> как в C. Вроде как сделано для того, чтобы люди меньше писали unsafe, но некоторые вещи сложно эффективно выразить в safe.


Z>Указатель можно превратить в ссылку одним "unsafe", а потом обращаться ко всем полям через ".",

У тебя есть указатель на структуру А, в которой есть поле — указатель на B, напиши как будет выглядеть обращение к этому полю.

Z>и эффективность от этого никак не пострадает.

Аминь


G>>отсутствие наследования (которое в каждом втором фреймфорке переизобретено).

Z>Наследование-то есть. Но наследование поведения, а ООП как раз о поведении.
То что в расте вы называете наследованием поведение — это экстеншн-методы в извращенной форме.

Z>Наследования данных действительно нет, но для ООП это и не нужно, просто так исторически

Z>сложилось, что классы наследовали и поведение и данные.
Ага, не нужно. Открываем доку https://rust-cli.github.io/book/tutorial/cli-args.html прямо с оф сайта видим:
use clap::Parser;

/// Search for a pattern in a file and display the lines that contain it.
#[derive(Parser)]
struct Cli {
    /// The pattern to look for
    pattern: String,
    /// The path to the file to read
    path: std::path::PathBuf,
}

fn main() {
    let args = Cli::parse();
}


Упс, наследование поведения через макросы. Даже ооп как такового нет, а наследование есть.

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

G>>Отсутствие стандартного метода работы с метаданными и вообще отсутствие высокоуровневых концепций в стандартной библиотеке,

Z>Здесь не понял о чем речь.
Где в стандартной библиотеке json, http client, http server, unicode. Так чтобы их не стесняясь использовать и в создании своей библиотеки?


G>>async прибитый к конкретному движку.

Z>Это не правда, "async" в embedded применяется,
Z>там не просто "tokio" нет, там даже стандартной библиотеки не используется,
Не понимаю твою мантру. Ты хочешь сказать что можно написать веб-сервис, а потом например заменить tokio на async-std, не переписывая прикладной код?

Z>а "async" прекрасно работает. Там же по сути концепций раз два и обчелся: Waker, Context и Future.

Концепций может и мало, а их реализаций много. И они несовместимы между собой. И нет какой-то типовой, всклоченной в стандартную библиотеку.

Z>И их может кто угодно использовать, как это может считаться "прибитым к конкретному движку" непонятно

В этом и проблема.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.