LINUX.ORG.RU

Вышел Rust 1.8

 


3

7

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

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

Что нового в стабильной версии 1.8

Этот выпуск содержит два нововведения, и приятный сюрприз для пользователей Windows! Помимо этого идёт работа по замене системы сборки Rust, основанной на make, на Cargo.

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

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);
}

Эта программа выведет Count { value: 6 }. Как и в других трейтах, перегружающих операторы, ассоциированный тип позволяет использовать разные типы в левой и правой части оператора (см. RFC 953).

Второе нововведение, взятое из RFC 218, не такое значительное. В предыдущих версиях Rust структура, не содержащая полей, должна была объявляться без фигурных скобок:

struct Foo; // works
struct Bar { } // error

Вторая форма объявления больше не является ошибочной. Изначально эта форма была запрещена из соображений согласованности с другими пустыми объявлениями, а также для предотвращения неоднозначности синтаксического разбора. Но эта неоднозначность была устранена, начиная с Rust 1.0. Кроме того, запрет этой формы создавал трудности при написании макросов, требуя специальной обработки. Наконец, пользователям, ведущим активную разработку, иногда требовалось менять пустую структуру на непустую и наоборот, что требовало лишней работы и приводило к некрасивым diff'ам.

Возвращаясь к Windows — теперь 32-х битные MSVC сборки поддерживают размотку стека, что переводит платформу i686-pc-windows-msvc в класс 1 (о классах поддержки платформ).

Мы с давних пор используем make для сборки Rust'а, но у нас уже есть своё замечательное средство сборки для программ на Rust: Cargo. В Rust 1.8 мы добавили предварительную поддержку новой системы сборки, написанной на Rust и основанной на Cargo. Мы ещё не используем её по умолчанию, и она требует значительной доработки, поэтому подробное её описание появится в примечаниях к выпуску после её завершения. Сейчас вы можете посмотреть подробности по ссылке на PR 31123.

Стабилизация библиотек

В Rust 1.8 около 20 функций и методов было переведено в категорию стабильных. Их можно разбить на три группы: работа со строками в кодировке UTF-16, различные API для работы со временем, и дополнительные трейты, необходимые для перегрузки операторов, упомянутые в секции об изменениях в языке.

Нововведения в Cargo

  • cargo init создаёт проект в текущем каталоге, не создавая новый, как делает cargo new
  • cargo metadata - дополнительная субкоманда для получения метаданных
  • .cargo/config теперь допускает ключи -v и --color
  • Улучшены возможности Cargo по поддержке платформоспецифичных зависимостей.

Подробное описание изменений.

>>> Вышел Rust 1.8

★★★

Проверено: maxcom ()
Последнее исправление: shahid (всего исправлений: 5)
Ответ на: комментарий от kto_tama

Десятисекндное гугление выдало несколько готовых крейтов.
Например num и rust-gmp.

WatchCat ★★★★★
()
Ответ на: комментарий от makoven

ABI стабилизировать пока не собираются, чтобы не ограничивать возможности внесения изменений в язык. Так что пока внешние интерфейсы через extern «C».

red75prim ★★★
() автор топика
Ответ на: комментарий от WatchCat

Желательно весь

«Желательно»? Что за слюнтяйство. Просто «весь мир».

tailgunner ★★★★★
()
Ответ на: комментарий от no-such-file

Код получился абсолютно нечитаемым


Потому что получилась тонна копипасты которую нужно факторизовать завернув в макросы.

Т.е. от первоначального утверждения ¨синтаксис на sexp более читаемый¨ мы перешли к утверждению ¨синтаксис на sexp более читаемый, если скрыть тонны boilerplate за макросами¨? Ну хорошо, факторизируй копипасту отсюда, завернув её в макросы.

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

Чёт тебя куда-то понесло. Перефразирую: как можно макросами заменить дженерики, оставаясь в рамках системы типов и семантики Rust? Примеров мне, примеров!

Макрос может на этапе компиляции проверять, подходят ли переданные параметры под нужный тип, раз уж тип задаётся в воображаемом псевдорастолиспе с помощью plist.

Т.е. ты хочешь накостылить дженерики на макросах? Но зачем? И да, без указания type constraint'ов это сделать не получится, потому что у тебя не будет нужной информации.

theNamelessOne ★★★★★
()
Ответ на: комментарий от Gorthauer

Есть же пачка библиотек, учитывая cargo, подключать их вообще не составляет труда.

Я знаю, под ¨реализовано в языке¨ я понимаю ¨встроено в язык¨ или ¨находится в стандартной библиотеке¨.

theNamelessOne ★★★★★
()
Ответ на: комментарий от theNamelessOne

А нафига в стандартной библиотеке bignum? По мне так, лучше пусть она будет не слишком толстой, а разработчики крейтов просто будут делать их аккуратно, не ломая обратную совместимость.

Gorthauer ★★★★★
()
Ответ на: комментарий от Gorthauer

А нафига в стандартной библиотеке bignum?

А я говорил, что он там нужен?

theNamelessOne ★★★★★
()
Ответ на: комментарий от makoven

Сейчас это внутреннее дело rustc. Никаких гарантий стабильности ABI нет.

red75prim ★★★
() автор топика
Ответ на: комментарий от intelfx

самое главное, что против отсутствия этой фичи нет workaround'а.

Ну теперь-то можно перейти на ночную версию. Вполне себе «воркараунд».

DarkEld3r ★★★★★
()
Ответ на: комментарий от intelfx

Да блин, самое главное, что против отсутствия этой фичи нет workaround'а.

Есть, даже два: 1) не использовать Rust 2) не использовать фичу.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

И приз в номинации «самый бесполезный совет» достаётся...

Ответ «не использовать Rust» или «не делать X» на вопрос «как в Rust сделать X» — это, конечно, сильно.

Ref.: Как жить без специализации impl-ов?

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от no-such-file

Товарищ. Я честно попытался распарсить вон тот код, но честно признаюсь: не осилил. Я не понимаю, каким образом это нужно читать, чтобы читалось легко. Не отрицаю, что не хватает опыта, но скобкокод лично мне читать сложнее. Всё слишком однообразное, логика тонет в скобках.

anonymous
()
Ответ на: комментарий от anonymous

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

Бог тебя создал для Паскаля, а теперь,
BEGIN
иди, Вирт тебя ждёт.
END

anonymous
()
31 мая 2016 г.
Ответ на: комментарий от red75prim
	libstd-4fda350b.so => /usr/local/lib/libstd-4fda350b.so (0x00110000) <=======
	libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x004df000)
	libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0x0049f000)
	libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0x009fe000)
	libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0x004a4000)
	/lib/ld-linux.so.2 (0x00ab8000)
	libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0x00b29000)
	librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0x004c2000)

Это же стандартная библиотека раста, да? Выходит так компилировать можно только туда, где уже установлен раст?

dnb ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.