LINUX.ORG.RU

Rust 1.26

 


5

11

Команда разработчиков языка 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 ()
Последнее исправление: tailgunner (всего исправлений: 22)
Ответ на: комментарий от baist

Полиморфизм, это когда одна форма объектов, но разные реализации объектов. Это философская трактовка. Для ООП будет трактовка «один интерфейс — много реализаций», для ФП «обрабатывать значения разных типов идентичным образом»

В ООП тоже можно «обрабатывать значения разных типов идентичным образом», а в ФП тоже можно «один интерфейс — много реализаций». В общем, неправильное противопоставление.

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

Те, кто сидит на тикле - это точно не умные. А те, кто на перле - это просто старые.

28+ это конечно старость

Я бы спросил, к возрасту чего относится 28+, но мне пофиг, да это и оффтопик.

Ох, извини, не хотел задеть чувства «остальных».

Да ты и не задел.

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

Ох, извини, не хотел задеть чувства «остальных».

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

Прекрасно понятно что я говорю о Box, но надо ж, потроллить, лишь бы придраться. А &Trait таки может иметь даже vtable, еще и, таки да, такой вариант полиморфизма.

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

Прекрасно понятно что я говорю о Box

Прекрасно понятно, что ты говоришь о том, что динамического полиморфизма в Rust нет, а сборщик мусора в Си++ есть.

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

Динамического полиморфизма в расте нет.

А это что?:

trait Foo {
    fn method(&self) -> String;
}

impl Foo for u8 {
    fn method(&self) -> String {
        format!("u8: {}", *self)
    }
}

impl Foo for String {
    fn method(&self) -> String {
        format!("string: {}", *self)
    }
}

fn do_something(x: &Foo) -> String {
    x.method()
}

fn main() {
    let x = "Hello".to_string();
    println!("{}", do_something(&x));
    let x = 1_u8;
    println!("{}", do_something(&x));
}

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

Очень. И твое заявление что динамикдиспатча в расте нет потому что Box<Trait> не часть языка — идиотизм.

Потому как трейтобъекты еще как часть языка, а динамикдиспатч обеспечивают именно они.

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

Откуда вы только беретесь такие?!

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

А тебе не стыдно изображать из себя знатока ФП?

Не стыдно, ведь я не изображаю.

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

Box - это не часть языка Rust, это часть окружения Rust

Box первоначально обозначался тильдой, ~. Согласно твоей трактовке, в той форме он был бы частью языка?

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

И на каком системном языке вы писали, милейший?

Именно web? На Си. Во времена CGI. И, как я уже сказал, Rust, похоже, нечаянно получился еще и языком общего назначения.

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

Новости на лоре теперь настолько быстро появляются, что их некогда читать

Это все из за оплаты биткойнами...

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

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

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

Посмотри на rocket (высокоуровнее) и actix-web (ниже, но с батарейками и не так низко как hyper)

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

Box<Trait>

не сам язык, а его расширение в виде Trait. А трайтообъекты я проверил ассемблирных листинг, таки ссылки с vtable ходят.

Разочарован. Значит rust уже должен проигрывать С в скорости и объеме программ.

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

Те, кто сидит на тикле - это точно не умные. А те, кто на перле - это просто старые.

А те, которые сидят на Haskell?

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

Те, кто сидит на тикле - это точно не умные. А те, кто на перле - это просто старые.

А те, которые сидят на Haskell?

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

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

А трайтообъекты я проверил ассемблирных листинг, таки ссылки с vtable ходят.

vtable - только для trait objects. Когда же идет прямой вызов, то никакого vtable.

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

Еще чего доброго, этот xmonad'олюбитель на себя намекает. Но писать конфиг для WM != сидеть на Haskell.

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

Да потому что в таком случае идет трансляция программы в код, а не присоединение уже готовой libstd. Я вижу раст также, в плюсах также, в си также.

На примере того же C можно компилять программы и без stdlib.h и пр. Я это делал когда интересовался разработкой ОС. Для написания ядра или загрузчика приходится выкидывать стандартные библиотека. Т.е. malloc не должен быть.

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

Пппццц все вокруг унмые! Все небось ассемблерный листинги небось читают, еще не хватало сидеть в HEX редакторе.

Но оно и к лучшему, мало специалистов, которые хорошо знают как оно там внутри работаю. Я сам стремлюсь(уже 10 лет!!!) быть что называется true full stack developer. А не то что сейчас фулстек называют обычных программистов(в более старом его понимании).

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

Да и на С с препроцессором можно тоже много чего сделать(и ООП, и GB), только это не делает его полноценным ООП или ФП языком со сборщико мусора. У Qt так вообще метакомпилятор для реализации сигналов/слотов, чтобы делать синхроно/асинхронные события делать. Как в чистом ООП никаких функций и методов, объект испускает сообщение, другой объект его ловит.

Это все хаки, костыли и расширения. К поддержке на уровне синтаксиса это не сильно относиться.

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

К поддержке на уровне синтаксиса это не сильно относиться.

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

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

как я уже сказал, Rust, похоже, нечаянно получился еще и языком общего назначения

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

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

Trait — самая что ни на есть непосредственная часть языка.

Разочарован. Значит rust уже должен проигрывать С в скорости и объеме программ.

Всё возможно, когда юзер упорот.

Не используй виртуальные вызовы — не будет проигрыша в скорости.

А уж про то что виртуальщина раздевает программы — это вообще нонсенс. Блоатинг — как раз следствие мономорфизации при статической диспетчеризации. Чего в Си вообще нет.

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

Судя по этой инфе, лицензия Rust интереснее для тех, кто разделяет принципы FSF. Apache совместим с GPLv3, MIT — тоже.

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

Вот где непаханное поле для ошибок после написания .. или ...

for i in 0, 4, 2 {}

И то лучше бы было, где «2» - указание шага при необходимости.

grem ★★★★★
()

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

avently
()

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

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

Как я не люблю синтаксис Си, но он в разы лучше.

Не лучше. Ты просто привык к нему, и потому он тебе кажется нормальным.
Если бы ты программировал на OCaml'е, то синтаксис раста был для тебя нормальным, а синтаксис С — ущербным.

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

Но если такие существуют, то они безусловно умные.

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

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

пейсал на окамле 7 лет и довольно крупные прожекты. Раст кажется уродцем.

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

может и так. Но к Котлину я тоже не привыкал, а он оказался великолепным.

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