Pull to refresh
89
0
Александр Мещеряков@freecoder_xx

Rust разработчик

Send message

Почему жуть? Вот перелопатить половину JavaScript-приложения только для того, чтобы понять все возможные значения, которые могут посылаться в данную функцию — вот это жуть. Rust от такого спасает.

Почему я использую Rust в вебе — и в рабочих, и в личных проектах:


  1. Хорошая производительность "из коробки" и хороший потенциал для тюнинга оной в дальнейшем.
  2. Универсальность языка и хорошая поддержка модульности — можно активно переиспользовать код в широком спектре разных проектов.
  3. Поддержка WebAssembly, возможность писать клиент и сервер на одном языке с использованием общего кода.
  4. Развитая система типов упрощает доработку и поддержку.
  5. Относительно просто писать многопоточный и асинхронный код.
  6. Удобное управление ресурсами (встроенное RAII как для памяти, так и для чего угодно еще).
  7. Легковесность, отличный тулинг.

Но я бы не советовал его брать тем, кто:


  • Не готов осваивать новую концепцию программирования (владение и заимствование).
  • Не готов терпеть сыроватую экосистему, в которую время от времени нужно котрибьютить.
  • Не собирается развивать свой проект, а хочет быстро написать прототип и выбросить.
  • Предпочитает программирование в стиле REPL.

Есть. Если есть интерес к Rust и хочется его опробовать — то так и нужно сделать. В противном случае имейте ввиду, что придется потратить время на освоение программирования на Rust.

Документации маловато.

Но ведь для стандартных коллекций дженерики-то по сути есть! А вот пользователю этот инструмент не предоставляется. Если кого-то волнует раздувание кода и медленная компиляция, то он же может просто их не использовать.

Вы погружаетесь в человека, открывающего коробку, — вам кажется, что ВЫ открываете ее. Внезапно вы можете представить покупку, и вы истолковываете себе это так: "Хм, хочу ли я купить кастрюлю? Я представляю, как покупаю ее. Следовательно, я должен хотеть ее купить".

Странно, но я ни разу не купил товар, распоковку которого смотрел (кроме тех, которые смотрел уже с принятым решением о покупке). Зачем покупать, если ты уже виртуально товар получил, распоковал и пережил все эмоции? )

Цена изменения кода на Rust сильно высокая

Цена чего конкретно? Изменять Rust-код довольно легко и безопасно, так как система типов у языка достаточно мощная и большинство ошибок отлавливает компилятор.

Объяснение в статье только больше запутывает. Ставните:


fn foo(mut person: Person) { unimplemented!() }
fn bar(person: Person) { unimplemented!() }

и


fn baz(person: &Person) { unimplemented!() }
fn bin(person: &mut Person) { unimplemented!() }

Очевидно же, что в первом случае mut относится к имени аргумента, которое привязывается к значению уже внутри функции, а во втором случае mut — это часть типа.

Как мне кажется, намного проще и чище — просто не указывать. Для любого ссылочного типа лайфтайм может быть выведен, мы же не пишем из-за этого &'_ Type.

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


Но вопрос был про lifetime elision. Собственно, я ожидал подобного вопроса. WASD1 в примере не указано, как именно определен псевдоним MyResult:


type MyResult<'a, T> = Result<&'a T, <T as FromStr>::Err>;

Как видите, лайфтайм никуда не делся, просто в сигнатуре функции он будет выведен автоматически и поэтому указывать явно его не нужно. Если функция возвращает ссылочный тип, и при этом принимает в качестве аргумента только одну ссылку или если среди аргументов есть ссылка &self, то лайфтайм возвращаемого значения будет таким же, как у данного аргумента. Lifetime Elision

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

Да, _ — это ключевое слово, а не переменная, которое означает "игнорировать связывание в этом месте".

По моему


fn (i32, i32)

Выглядит чище, чем


(i32, i32) -> ()

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

Я писал о том, что точка с запятой не просто разделяет инструкции, она превращает выражение в инструкцию. У вас строка кода может быть как инструкцией, так и выражением, и если нужно последнее — просто не ставьте точку с запятой.

В обмен на гарантию отсутствия не только NPE, но и UB на ровном месте. Вообще, после нескольких месяцев интенсивного использования Rust мозг перестраивается и борьба с borrow-checker прекращается. Дело привычки.

Как уже написали, под это есть готовый RCF и в редакции Rust 2021 вполне возможно он будет реализован.

как понять что метод что-то НЕ возвращает

Смотреть на сигнатуру. В любом случае лучше всегда на нее смотреть, зачастую этого уже достаточно.

Соглашусь, что иногда return удобно использовать, чтобы сократить количество вложенных блоков и улучшить читаемость. Хотя во многих других случаях лучше без него.

Information

Rating
Does not participate
Location
Санкт-Петербург, Санкт-Петербург и область, Россия
Registered
Activity