LINUX.ORG.RU

Rust 1.26

 


5

9

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

Обновить Rust можно с помощью команды:

curl https://sh.rustup.rs -sSf | sh # если у вас еще не установлен rustup
rustup update stable

Основные изменения:

  • Вторая редакция книги «The Rust Programming Language» (почти) готова, и теперь рекомендована по умолчанию для ознакомления вместо первой версии. Также готовится к выходу бумажное издание книги.
  • impl Trait в заголовках функций

    Стало возможно указывать Trait в заголовке функции в качестве типа возвращаемого значения:

    fn foo() -> impl Iterator<Item = i32> {
        // ...
    }
    
    Это позволяет не указывать полный тип в заголовке функции, если с точки зрения API конкретный тип не имеет значения. Такой синтаксис подразумевает статическую диспетчеризацию, в отличие от Box<Trait>.

    Также эта возможность удобна для использования с замыканиями (closures):

    fn foo() -> impl Fn(i32) -> i32 {
        |x| x + 1
    }
    

    Новый синтаксис теперь можно использовать и для типов аргументов фунции:

    // раньше нужно было писать так:
    fn foo<T: Trait>(x: T) {
    
    // сейчас можно так:
    fn foo(x: impl Trait) {
    

  • Неявное разыменование ссылок в сопоставлении с образцом (match, if let, ...)

    Теперь следующий код больше не вызывает ошибку компиляции:

    fn hello(arg: &Option<String>) {
        match arg {
            Some(name) => println!("Hello {}!", name),
            None => println!("I don't know who you are."),
        }
    }
    
    и эквивалентен такому:
    fn hello(arg: &Option<String>) {
        match arg {
            &Some(ref name) => println!("Hello {}!", name),
            &None => println!("I don't know who you are."),
        }
    }
    
    То же работает и для &mut + ref mut.

  • Раскрытие срезов (slice) в сопоставлении с образцом
    fn foo(s: &[u8]) {
        match s {
            [a, b] => (),
            [1, _, _] => (),
            _ => (),
        }
    }
    
  • Закрытые интервалы вида 0..=4, включающие обе границы в диапазон перечисления
        for i in 0..=4 {
            println!("i: {}", i); // выведет 0, 1, 2, 3 и 4
        }
    
  • Новые целочисленные типы i128 и u128
  • Функция main() теперь может возвращать тип Result
    use std::fs::File;
    
    fn main() -> Result<(), std::io::Error> {
        let f = File::open("bar.txt")?;
    
        Ok(())
    }
    
  • Ускорения в работе компилятора
  • Стабилизирована функция std::fs::read_to_string
  • При форматировании через trait Debug теперь можно выводить целочисленные значения в шестнадцатеричном виде:
    assert!(format!("{:02x?}", b"Foo\0") == "[46, 6f, 6f, 00]")
    
  • Номер версии Cargo, начиная с этого релиза, изменяется синхронно с номером версии Rust

>>> Подробности

★★★★★

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

так проще простого или не шмогли, определись уже

и то, и другое, и можно без хлеба! (С) винни-пух

и проще простого, и не шмогли — я определился

емнип я че-то из пайка читал — он просто нытик; т.е. проблемы ставит почти правильно, но возможные пути к их решению не намечает, а просто ноет (я где-то это писал на лоре, но поиск не ищет)

такой может даже и дженерики не смочь в новом языке

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

видимо вот это я читал: http://herpolhode.com/rob/utah2000.pdf

ну например он пишет: Hardware has changed dramatically; software is stagnant.

и какова лично его практическая реакция? может, чуток улучшить software, создав хороший язык программирования с некоторыми полезными инновациями, чтобы не быть stagnant?

конечно же нет!!! он в 2009 году создает язык на уровне чего-то между уровнем си 1970 и явы 1995

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

я думаю, ты в курсе, что он приложил руку к Plan9, UTF-8, чем не практическая реакция? а Go создавался по заказу Гугла, которому нужен был простой, но шустрый язык для их инфраструктуры.

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

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

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

Го не задумывался, как новаторский язык

го просто не задумывался. От слова совсем. Была одна идея, сделать всё асинхронно, и чтоб обучать проще. ТЗ поставлено, сговнякаем что-нибудь. Ну и сговнякали. Причём такое впечатление, что для всего просто брали первую попавшуюся идею. Вместо нормальных, но «сложных» дженериков предлагается interface {} и кодогенератор. Я понимаю, template magic из STL сильно непонятен, но эта проблема решается политикой компании, один раз настучать по башке сильно умному кодеру и всё. Нет, вместо этого лишим всех возможности использовать примитивные дженерики. Причём реально проблема не решается, тот же умник вместо темплейт мэджика накатает фабрик по производству фабрик и это всё обернёт в кодогенерацию, так что в результате всё равно придётся по башке стучать. С обработкой ошибок и того дурнее, блог Пайка об обработке ошибок это просто шедевр. «Я тут сделал гениальное изобретение, но практически пользоваться этим невозможно, поэтому немного потрахавшись и написав чуток boilerplate кода можно реализовать аналог старого доброго errno.

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

Го не задумывался, как новаторский язык

Если ты в XXI веке считаешь дженерики новаторством, ты живешь даже не в 1980-х годах, а еще раньше.

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

Если судить по Go, он и до сих пор и живет в 1980-х.

Но Go успешен, чего не скажешь о языках с мощщными типами. Может Пайк то поумнее заумных хипсторов, не? Средний IQ кодеров вряд ли вырос с 80-х, им просто сложен ваш матан. Смотри, везде побеждают самые примитивные язычки: C, Java, PHP, JS, теперь Go. Это выбор народа. Даже микрософту не удалось особо пропихнуть свою более лучшую жабу, сложноватым сисярп получился.

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

Даже микрософту не удалось особо пропихнуть свою более лучшую жабу, сложноватым сисярп получился.

Потому что жаба спокойно крутится на серверах, на которых внезапно обычно стоят Unix'ы и Linux'ы, а не шindoшs.

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

Но Go успешен, чего не скажешь о языках с мощщными типами.

Никто не ставит это под сомнение. Просто печально, что это примитивное поделие стало успешным.

Может Пайк то поумнее заумных хипсторов, не?

Не. Просто его язычок продвигает Гугл.

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

ну например он пишет: Hardware has changed dramatically; software is stagnant. и какова лично его практическая реакция?

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

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

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

Просто мы никогда не кодили на PHP.

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

Просто мы никогда не кодили на PHP.

Страшно далеки вы от народа. Лол.

По сравнению с Python, Go кажется деревянной поделкой. Впрочем, пофиг на Go. Если похапешники из народа нашли свое счастье, я рад за них (на самом деле мне пофиг на их счастье).

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

Не. Просто его язычок продвигает Гугл.

Этого не достаточно для успеха.

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

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

Не. Просто его язычок продвигает Гугл.

Этого не достаточно для успеха.

Этого не всегда достаточно, конечно.

Низкий порог входа и высокая продуктивность при достаточной надежности и качестве вне зависимости от уровня разработчиков

Этого тоже не достаточно для успеха - как минимум, нужны еще экосистема и библиотеки. И то, и другое у Go есть благодаря Гуглу. Без Гугла за спиной Go так и остался бы еще одним D, Обероном, Паскалем, Модулой-3, или еще чем-то, о чем даже я не помню.

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

Без Гугла за спиной Go так и остался бы еще одним D, …

Но ведь Ди живет и развивается. Без хайпа, но кому он нужен? А ты его занес в разряд музейных экспонатов из времен, когда ЯП были зеленее.

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

Без хайпа, но кому он нужен?

D никому не нужен. А хайп нужен, чтобы D стал хоть кому то нужен. Кому то в смысле компаниям, которые потом проинвестировали бы в разработку самого D. Вот такой хайпоцикл без которого язык может жить только в уютненькой сумке у крупной корпорации.

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

D никому не нужен.

Это хто такое сказал, а? Это он тебе не нужен, а за всех не надо ля-ля. Коммерческие компании инвестируют в разработку D, та же Weka спонсирует разработку ldc, дишного компилятора на основе llvm.

А хайпа нет, это да. И слава богу. А то появлялись такие вот яростные последователи языка, плодили кучу постов на форуме яростно обсуждаю полнейшую хрень - просто потому что они только что прочитали/им рассказали про одну из базовых вещей и им пришла в голову идея ее улучшить. А потом когда люди бросали попытки объяснить, что это нововведение не самая важная штука в языке - обвиняли сообщество в том, что оно плохое, язык говно и «все вы умрете», потому что не смогли оценить «блистясчую» идею яростного (теперь уже не) последователя языка.

И, кстати, если бы у Ди было такое же финансирование как у Го или Раста, то ситуация была совсем другой.

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

Вот, кстати, не понимаю, зачем пилят эти Дарты, Кристалы, Нимы - когда есть Ди?

Зачем люди что-то делают, когда можно ничего не делать?

Дарты

На замену JS.

Кристалы

Синтаксис Ruby + производительность

Нимы

Питоноподобный синтаксис + производительность. Есть и некоторые оригинальные идеи.

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

Я так понимаю тебя смущает «уникальность» типа для каждого списка.

Да. И вытекающая из этого невозможность написать не-дженерик функции для обработки таких списков.

Сразу скажу не встречал чтобы кто то окрестил такую конструкцию кортежем.

В Rust это и есть кортеж. В Haskell - не знаю, там вообще своля атмосфера и терминология.

Т.е. я хочу сказать что в целом аргумент «уникальный тип для каждого значения значит не список а кортеж» - выглядит не слишком убедительно

Зависит от определения «списка». Если считать, что тип списка не зависит от его длины, гетерогенный «список» - это не список; если считать, что список - это нечто, манипулироемо функциями head и tail - то да, это список.

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

Кристал и Ним быстрее Ди? с чего бы?

А с чего бы и нет? Померяй. И даже если ди быстрее, ну и что? Кто-то не хочет плюсы с gc, хочет другое, вот и пилят (с похожим успехом).

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

Синтаксис херня, анон. Ним вообще не похож на питон если чо, а кристал наоборот почти точная реализация рубей на статике. Оба проекта любопытные, но бесперспективные как и твой ди.

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

Мы точно про D, который как раз в погоне за фичами просрал все полимеры?

Всегда забавно смотреть на человека, который все про всех знает и уже все решил. Тебе не скучно с нами, простыми? А кто убил Кеннеди не подскажешь?

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

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

Да. И вытекающая из этого невозможность написать не-дженерик функции для обработки таких списков.

Я немного не в курсе что такое дженерик. т.е. не то что бы совсем, но термином не владею. Посему вопрос. Есть список и к нему функция

-- [a] - общий тип для списков
-- head :: [a] -> a - тип для head
Вопрос, это дженерик или не дженерик?

В Rust это и есть кортеж. В Haskell - не знаю, там вообще своля атмосфера и терминология.

Кроме как в программировании я встречал кортеж, скажем, в математике и криптографии. Ну там это использовалось просто «пара» или «тройка» элементов. На тип ограничений нет. Но штука в том что это нечто постоянное, неизменное. Т..е если уж это кортеж <K,P,R> то к нему нельзя добавить элемент. И убрать нельзя. Т..е это уже будут другие кортежи. И это полностью совпадает с терминологией хаскеля, на сколько я понимаю.

Не претендую на то что раст не может иметь свою терминологию, но имхо есть вероятность что ты слишком вольно трактуешь слово «кортеж».

Зависит от определения «списка». Если считать, что тип списка не зависит от его длины, гетерогенный «список» - это не список; если считать, что список - это нечто, манипулироемо функциями head и tail - то да, это список.

Но ведь должен быть и смысл определения. Т.е. какой смысл давайть определение «тип списка не зависит от его длины, а иначе это не список»? И что тогда есть Vect a n который я уже приводил в пример, если не список? Определение (в смысле код) в идрисе скажем совершенно не отличается от хаскелевского обычного списка со скидкой на второй параметр в типе.

AndreyKl ★★★★ ()
Последнее исправление: AndreyKl (всего исправлений: 1)
Ответ на: комментарий от AndreyKl
-- [a] - общий тип для списков
-- head :: [a] -> a - тип для head

Вопрос, это дженерик или не дженерик?

https://en.wikipedia.org/wiki/Generic_programming, https://ru.wikipedia.org/wiki/Обобщённое_программирование — по содержанию, кстати, статья в русской Вики отличается от английской).

Кроме как в программировании я встречал кортеж, скажем, в математике и криптографии. Ну там это использовалось просто «пара» или «тройка» элементов. На тип ограничений нет. Но штука в том что это нечто постоянное, неизменное.

нечто постоянное, неизменное

Tuple, кортеж, immutable, а не const. Изменение кортежа повлечет создание нового кортежа.

Кортеж это гетерогенный упорядоченный список конечного размера. Кортеж характеризуется длиной, или точнее арностью (arity) — так же, как и функции. И так же, как и функции, кортежи с разной арностью имеют разные типы. В ФП функции, принимающие несколько аргументов, и описываются как функции, принимающие кортеж. Абстрагироваться от арности не получается именно из-за гетерогенной природы кортежа. То есть можно его заполнить объектами одного типа, но система типов всё равно потребует указать тип каждого элемента.

Я так понимаю, HList это тип-кортеж, для которого реализовали часть интерфейса списков путём искусственной гомогенизации за счёт использования типа-обертки для элементов списка. Стал ли он от этого списком? Не думаю. Можно ли им пользоваться в тех местах, где требуются возможности списков? Да, но только в тех местах, где использовано обобщенное программирование.

Virtuos86 ★★★★★ ()
Последнее исправление: Virtuos86 (всего исправлений: 2)
Ответ на: комментарий от AndreyKl
-- [a] - общий тип для списков
-- head :: [a] -> a - тип для head

Вопрос, это дженерик или не дженерик?

По описанию ты просто предложил компилятору вывести тип a самостоятельно, потому что a это анонимный тип. Если использовать head в программе со списком чисел, например, то первому использованию компилятор выведет, что она имеет тип head :: [Int] -> Int. Если после этого попытаться использовать head до кучи еще со списком строк, то компилятор по идее должен выругаться на несоответствие типов. Но как там у вас в Хаскеле точно, я не знаю.

Вместо a надо указать какой-нибудь тайпкласс, тогда head будет обобщенной.

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

Этого тоже не достаточно для успеха - как минимум, нужны еще экосистема и библиотеки.

Нужны. Но те же Python и Ruby смогли обзавестись приличными stdlib без Google за спиной. А тот же C# даже при поддержке MS за пределами экосистемы Windows малозаметен.

Так что вклад Google в разработку батареек для Go огромен, конечно, но, имхо, основная «поддержка» от Google состоит не в этом. А в том, что:

1. Google делает очень грамотный PR для Go.

2. Для многих сам факт того, что Go используется в Google, уже весомый аргумент в пользу Go. Типа знаменитого «Nobody ever got fired for buying IBM». Мол, если уж в самом Google пишут на Go, то уж нам уж...

PS. Потомки Pascal-я в виде ObjectPascal и Delphi в 80-е и 90-е вполне себе были на коне. Тем же D, Oberon и Modula-3 до такого успеха вряд ли дожить. Но, в случае с Pascal-ями, синтаксис языка многое в его судьбе определил :)

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

Этого тоже не достаточно для успеха - как минимум, нужны еще экосистема и библиотеки.

Нужны. Но те же Python и Ruby смогли обзавестись приличными stdlib без Google за спиной.

О том и речь - они смогли, а Go понадобился Гугл. Потому что язычок унылый и неинтересный.

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

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

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

Хотя я не уверен, что у них она приличная. Что-то в духе сишных либ небось со сваливанием в void на любой чих. Ну тут лишь бы хомячкам нравилось. Вот в пхп4 была адская помойка из функций, но язык взлетел ого-го.

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

О том и речь - они смогли, а Go понадобился Гугл.

Странная логика. Так же можно сказать, что Rust-у понадобилась Mozilla. Но, мне думается, такая аналогия с Rust-а и Mozilla не всем понравится.

Потому что язычок унылый и неинтересный.

Это он тебе кажется неинтересным, потому что ты в очень специфической нише работаешь. А тем, кому нужно в компании недавних войтишников за короткие срок REST API прицепить к какой-нибудь бизнес-ориентированной херне (в сторону которой ты даже и смотреть не будешь), язык гораздо более интересный и практичный, чем всякие Rust-ы с плюсами.

Ну и, по правде говоря, я сам не могу найти аргументов в пользу C/C++/Rust/Ada для проектов, вроде недавно открытого Netflix-ом Titus-а (там, как минимум, titus-executor на Go написан, в остальные части не заглядывал).

eao197 ★★★★★ ()