Святая Корова! (Holy std: borrow: Cow!)

оригинал: llogic • перевод: Сергей Ефремов • обучение • поддержите на Patreon

На днях я участвовал в обсуждении на reddit того, насколько трудны на самом деле времена жизни. При работе над clippy мне не приходилось до этого времени иметь с ними дела, потому что всем, чем мы пользовались, владел компилятор, особого мнения на этот счёт у меня не было, и тут The_Doculope заявил:

Есть места, в которых опускание времён жизни может укусить нас за задницу.

(/u/The_Doculope на /r/rust)

Честно говоря, я был шокирован!

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

(я на /r/rust)

Сразу после написания этого, мне попалась строка в исходном коде clippy, которой я был не очень доволен, потому что в ней происходило клонирование строки (с помощью .to_string()! богохульство!) просто для использования её в &format(…). Итак, происходило это в Result<String, …>::unpack_or(…), поэтому сначала я попытался дать обладаемой строке такое же время жизни, как и у полученной, без особого смысла.

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

Я избавлю вас от этих покрытых моей кровью сообщений об ошибках, потому что убеждён — если вы писали код на Rust, вы их знаете наизусть, и, даже наоборот, на самом деле все было не так уж и плохо, потому что, к счастью, я вспомнил такой удобный std::borrow::Cow, а уж переписать сниппет с ним (и std::convert::From) было раз плюнуть. Я даже создал fn для его повторного использования, таким образом, так я официально написал свой первый метод, аннотированный временем жизни. [ДОСТИЖЕНИЕ ОТКРЫТО]

Святая Корова! — Продолжение (Holy std: borrow: Cow! — Redux)

оригинал: llogic • перевод: Сергей Ефремов • обучение • поддержите на Patreon

Последний раз я использовал очень полезный Cow, чтобы разобраться с тем, нужно ли клонировать str или просто заимствовать её. Это было моё первое применение аннотаций времён жизни, и это было явно похоже на достижение. : -)

На /r/rust, пользователь Artemciy спросил меня очень хороший вопрос

[…] Как это работает? Похоже на какую-то магию. Имею ввиду, как String становится str?

А также предложил свой вариант ответа:

P. S. Похоже, что в String есть реализация IntoCow’, которая преобразует её в str, но если посмотреть на эту реализацию — опять какая-то магия. Может String в тайне является str?

(выделено мной)

Хороший вопрос. На самом деле, наверное, вы бы хотели прочитать про обмен догадками, озарение, исследования, неправильные решения и драму в интернете. Но увы! У кого есть на это время? Поэтому попытаюсь донести всю суть от начала и до конца.

Анонс Rust 1.8

оригинал: The Rust Core Team • перевод: Станислав Ткач • новости • поддержите на Patreon

Мы рады представить новую версию Rust 1.8. Rust — это системный язык программирования, нацеленный на безопасную работу с памятью, скорость и параллельное выполнение кода.

Как обычно, вы можете установить Rust 1.8 с соответствующей страницы официального сайта, а также ознакомиться с подробным списком изменений в этой версии на GitHub. В этот релиз вошло порядка 1400 патчей.

Что вошло в стабильную версию 1.8

В релиз вошли две новые возможности, а ещё у нас есть хорошие новости для пользователей Windows! Также продолжаются работы по замене make в нашей билд-системе на Cargo.

Во-первых, различные операторы составного присваивания, такие как += и -=, теперь могут быть перегружены через соответствующие трейты. Это изменение было результатом RFC 953 и выглядит следующим образом:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
use std::ops:: AddAssign;

#[derive(Debug)]
struct Count {
    value: i32,
}
   
impl AddAssign for Count {
    fn add_assign(&mut self, other: Count) {
        self.value += other.value;
    }
}  

fn main() {
    let mut c1 = Count { value: 1 };
    let c2 = Count { value: 5 };

    c1 += c2;

    println!("{:?}", c1);
}

Как пользоваться типажами From и Into

оригинал: llogic • перевод: Сергей Ефремов • обучение • поддержите на Patreon

(Эта статья написана для Rust 1.4, и код по-прежнему работает в 1.7 без изменений)

Пришло время поговорить про типажи From и Into (и некоторые с ними связанные) и задать вопрос, где и когда их использовать. Заметьте, что есть ещё специфические типажи (например, IntoIterator) и более конкретные их варианты (например, FromStr); надо быть в курсе всего этого при написании кода на Rust.

Мы начинаем продажу эксклюзивного издания Растономикона!

• Михаил Панков • новости • поддержите на Patreon

Добрый день, дорогие читатели. Как вы знаете, наше сообщество перевело книгу о продвинутом и небезопасном программировании на Rust — «Rustonomicon». Мы решили, что хорошее содержимое должно быть в хорошей форме, и объявляем об уникальном издании этой книги, которая должна быть на полке каждого программиста на Rust.

Конечно, мы не могли обойти стороной отсылку к Лавкрафту. Напомним, что Некрономико́н (англ. Necronomicon) — вымышленная книга, придуманная Говардом Лавкрафтом и часто упоминаемая в литературных произведениях, основанных на мифах Ктулху. Согласно рассказу «Ведьмин Лог», в этой книге описаны все магические ритуалы, а также полная история Древних, которые постоянно вели ожесточённые войны.