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)
Ответ на: комментарий от quantum-troll
  match addr.to_socket_addrs() {
        Ok(r) => {
            for a in r {
                match (a, proto) {
                    (_, InternetProtocol::Any)
                    | (SocketAddr::V4(_), InternetProtocol::IpV4)
                    | (SocketAddr::V6(_), InternetProtocol::IpV6) =>
                        match TcpStream::connect(&a) {
                            Ok(s) => {
                                return Ok(s);
                            }

так значительно лучше, да

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

Ты в качестве снотворного читаешь штоле?? :))))

Не, просто чтобы чем-то занять себя, вместо считания овечек :)

Ну и хорошо! Вторая версия выйдет ещё более усыпляющей. :D

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

Мне кажется, Rust не взлетит.

Лично меня это мало волнует, я для себя.

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

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

сомневаюсь. Если он изменится до неузнаваемости, то это будет его конец (а создатели не дураки ж). Вон на Ди посмотри.

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

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

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

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

Тоже мне аргумент. Ну, сделают в Rust IDE для конструкции «let o = ИмяТипа» специальное правило intellisense «поищи в структуре 'ИмяТипа' функции, возвращающие объект ИмяТипа, и предложи их».

А все методы обязаны иметь self. И даже исключений нет.

И это хорошо. Одна из вещей, которых мне не хватает из Python.

Ах да... привет, не узнаю тебя в гриме... lester?

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous
for a in addr.to_socket_addrs().map_err(|| "Could not resolve")? {
    if    proto == InternelProtocol::Any
       || proto == InternelProtocol::IpV4
       || proto == InternelProtocol::IpV4
    {
        match TcpStrem::connect(&a) {
            Ok(s) => return Ok(s),
            Err(e) => println!("some error: {}", e),
        }
    }
}
Err("Could not connect")
anonymous
()
Ответ на: комментарий от anonymous

Там очепятка в if 3 сравнение должно быть proto == InternelProtocol::IpV6

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

Если возвращать не Result<TcpStream, String>, a Result<TcpStream, io::Error>, то

match addr.to_socket_addrs() { Ok(r) => for a in r {... 

можно заменить на

for a in try!(addr.to_socket_addrs()) { ...

Две ветки в match a можно объединить в

match (a,proto) {
  (V4(_), Any) | (V4(_), IpV4) 
  | (V6(_), Any) | (V6(_), IpV6) => {
    try!(TcpStream::connect(&a))
  }
}

В общем, кто-то ещё с растом не разобрался.

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

Исправление

return Ok(try!(TcpStream::connect(&a)));
red75prim ★★★
() автор топика
Ответ на: комментарий от quantum-troll

match либо не полный, либо он там не нужен.

SocketAddr::V4(_) => {
    if proto == InternetProtocol::Any || proto == InternetProtocol::IpV4 {
        match TcpStream::connect(&a) {
SocketAddr::V6(_) => {
    if proto == InternetProtocol::Any || proto == InternetProtocol::IpV6 {
        match TcpStream::connect(&a) {
anonymous
()
Ответ на: комментарий от quantum-troll

Да, ты прав. Спасибо, что заметил. Вот исправленный вариант:

for a in try!(addr.to_socket_addrs().map_err(|| "Could not resolve")) {
    match (a, proto) {
           (_               && InternetProtocol::Any)
        || (SockAddr::V4(_) && InternetProtocol::IpV4)
        || (SockAddr::V6(_) && InternetProtocol::IpV6) => {
            match TcpSteam::connect(&a) {
                Ok(s) => return Ok(s),
                Err(e) => println!("some error: {}", e),
            }
        }
    }
}
Err("Could not connect")

Ещё заменил ? на try!;

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

Что то я увлёкся с ошибками.

for a in try!(addr.to_socket_addrs().map_err(|| "Could not resolve")) {
    match (a, proto) {
          (_              , InternetProtocol::Any)
        | (SockAddr::V4(_), InternetProtocol::IpV4)
        | (SockAddr::V6(_), InternetProtocol::IpV6) => {
            match TcpSteam::connect(&a) {
                Ok(s) => return Ok(s),
                Err(e) => println!("some error: {}", e),
            }
        }
    }
}
Err("Could not connect")
anonymous
()
Ответ на: комментарий от anonymous

Можно все вообще свернуть в:

return tcp::socket(service_, ip::address::from_string(addr)); 

И вместо ни о чем не говоряших «Could not connect» и пр. прилетят исключения c описаниями.

П.С. да, to_socket_addrs используется в коде на Rust лишь потому-что нет одинарного to_socket_addr.

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

Можно все вообще свернуть в:

return tcp::socket(service_, ip::address::from_string(addr)); 

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

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

(ну или на худой конец как в восьмой джаве)

Существенной разницы не вижу. Разные «скобки» для параметров, обязательность -> в джаве и невозможность указать возвращаемый тип. Пожалуй, вариант раста мне нравится даже немного больше.

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

Последний штрих.

for a in try!(addr.to_socket_addrs().map_err(|| "Could not resolve")) {
    use InternetProtocol::*;
    match (a, proto) {
        (_, Any) | (SockAddr::V4(_), IpV4) | (SockAddr::V6(_), IpV6) => {
            match TcpSteam::connect(&a) {
                Ok(s) => return Ok(s),
                Err(e) => println!("some error: {}", e),
            }
        }
    }
}
Err("Could not connect")

quantum-troll ★★★★★
()
Последнее исправление: quantum-troll (всего исправлений: 1)
Ответ на: комментарий от red75prim

Не, не последний. В match (a, proto) покрыты не все варианты.

Вас понял, товарищ компилятор!

for a in try!(addr.to_socket_addrs().map_err(|| "Could not resolve")) {
    use InternetProtocol::*;
    match (a, proto) {
        (_, Any) | (SockAddr::V4(_), IpV4) | (SockAddr::V6(_), IpV6) => {
            match TcpSteam::connect(&a) {
                Ok(s) => return Ok(s),
                Err(e) => println!("some error: {}", e),
            }
        }
        _ => { /* ... */ }
    }
}
Err("Could not connect")
anonymous
()
Ответ на: комментарий от Xroft

На фоне Rust D смотрится как конфетка) Писать одно удовольствие. Читать код тоже.

И продолжается это счастье уже 15 лет...

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

D 1.00 Jan 2, 2007. Давайте уже от релиза считать, а не от того когда там версия 0.01 вышла.

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

Мне кажется анонимус говорил в негативном ключе.

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

Главная изюминка D — привычный и понятный синтаксис. И отсутствие изъебов С++. Вон в Rust наводили изюминок, которые в реальных проектах одни проблемы создают.

Xroft ★★
()
Последнее исправление: Xroft (всего исправлений: 1)
Ответ на: комментарий от Xroft

Привычный плюсовику? Меня, честно говоря, все эти ::{foo,bar}, <T> в rust'е немного напрягают, хотя я вроде бы и понимаю там что происходит. Мне очень нравится синтаксис Golang'а, но и у него слишком много минусов. Наверное, я так никогда и не найду свой идеальный ЯП :)

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

Где-то читал историю одного человека, как они в 90-х согласились написать компилятор для какой-то фирмы. Увлекательное чтиво, но нет, для этого я слишком глупый.

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

Нужен харизматичный лидер без бороды. Без этого не получится 😂

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

Не историю одного человека, а статью «Редкая профессия».

Написать ЦПП-компилятор в 90-е и писать велосипедный компилятор сегодня — две большие разницы. Есть antlr (и flex/bison для динозавров), так что головной боли по поводу компилятора сильно меньше. В них не все так просто укладывается, но тебе же свой велосипед писать, так что подозрительные места можно скостить (так и сделали golang-щики, забив на тучу современных вещей)

Есть jvm и llvm для де-факто исполнения кода, так что никакими ассемблерами упарываться не нужно. И куча виртуальных машин поменьше, от питонового parrot до дотнетового дотнета.

Так что грабли только в том, чтобы разобраться в инструментах (не нужны семь пядей, но нужно время), и перейти к разработке stdlib/оптимизациям/поддержке ide/прочей фиговой куче вещей, вот это реально неподъемно.

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

Синтаксис в D компромиссный, но мало библиотек, хэлловорд ~600кб. Большим размером бинарников страдают вообще все сравнительно новые языки. Будь то rust, D, Go или даже haskell.

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

Хватит мечтать, займись делом. Глава первая.

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

О, точно, спасибо, надо перечитать :)

Ты меня не за того принимаешь, анон. Для меня это хобби и только, чтобы создать свой ЯП надо 0) хотеть его создать 1) много знать 2) иметь кучу свободного времени. У меня ни того, ни другого, ни третьего :(

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

Только что проверил. dmd app.d | app.exe 199KB. Да и какой смысл размерами Hello World мериться если оверхед в 100-200-500КБ тупо разовый. И на любом проекте сложнее Hello World тупо будет не заметен.

Xroft ★★
()
Ответ на: комментарий от Xroft
localhost /tmp dmd -release test.d && du -hs test && strip -s test && du -hs test
672K	test
484K	test

Так в том и дело. Вот например, у меня на роутере свободного места 1.2мб. Я бы хотел туда поставить небольшой сервер для моего чатика с друзьями, но не могу. Потому что сервер ~3мб, на Go написан.

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

Поклонников наберёт (как Ди), но влезать на рынок, где всё поделено между Жабой, Сипипями и C# - нереально

Мне кажется, есть огромная разница. Изначально D планировался под продажу большим клиентам. Отсюда и лицензия «не для людей» и пр. Rust + Cargo изначально для людей (шмаркаю на GOROOT) и предназначен для людей. Синтаксис дикий, я согласен,но к версии 3.0, я думаю,мы с ним подружимся.

void_ptr ★★★★
()
Последнее исправление: void_ptr (всего исправлений: 1)
Ответ на: комментарий от dnb

Да какой еще размер бинарников? SSD идут от 128 ГБ, винты от 1 ТБ.

Приложения для мобилок, что с пачку сигарет, идут от 50 МБ, всякие геокарты/кэши/ресурсы требуют памяти сотнями.

Графон-игры по 40 ГБ отжирают. FullHD фильмы, лослесс аудио, raw-фотки место забирают и добавки просят.

А тут на мегабайтный здрассьтемир агрятся.

Сколько ты полноценных программ за свою жизнь напишешь? 100? 10? Да хорошо, если одну, такой прогой даже не каждый десятый может похвастать.

И пофигу, сколько она будет весить. Обычно говорят, что будут пользователи - будут и оптимизации. По факту их не не будет, ну и фиг с ними, раз получилось хоть что-то рабочее.

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

Изначально D планировался для людей

/fixed

Отсюда и лицензия «не для людей»

Boost

Синтаксис дикий, я согласен,но к версии 3.0

Предлагаю Rust пойти по пути FireFox и тогда за год дойдет сразу до Rust 9.0

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

Странная какая-то задача. Поделитесь опытом, как вы друзей с других месседжеров в ваш чатик перетаскиваете?

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

В D там ещё и сборщик мусора в рантайме. Кстати, программу на Rust можно попробовать собрать с динамической линковкой.

cargo rustc --release -- -C prefer-dynamic

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

Xroft Ну мы все понимаем что некоторые «кухонные» разговоры лучше не выносить к торговцам этими разговорами. А так, конечно, пользуемся Телеграмом.

Так 8кб выходит. Спасибо :)

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

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

Классический hello world не должен превышать пары кб, все остальное от лукавого.

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

Ага, при этом люди ставят себе Visual Studio и кучу компиляторов на 5 GB, а потом что вообще не понимают что там происходит.

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

В нем пара килобайт не потому, что на C написан, а потому, что использует libc. Что именно в нее напихали, что там нужно, что не нужно — не моего и не твоего ума дело. Добавь ее размер к программе.

Заметь, что ГУИ приложение на винде весит те же пару килобайт, а в линуксах GTK/Qt сожрёт ой-ёй-ёй сколько.

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

А компы настолько сложны, что никто в мире не понимает, что там происходит.

Можно набраться наглости, и обявить: кто-то, знающий, как написать HW на C, как вызвать консольный компилятор и линкер — все понимает. И может ругаться на VS и компиляторов на гигабайты.

Только этот человек не сможет написать прогу, работающую на другой системе. Не сможет сделать GUI. Не сможет скомпилировать под другой процессор. Не сможет сделать так, чтобы прога запускалась через 5 лет. И не конфликтовала с имеющимися библиотеками. И интегрировалась с настройками системы.

А если сможет, то увидит, что ему нужно куда больше, чем 5 ГБ. И нифига не понятно, как это работает.

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