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)

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

Лично Вас?

Проблема в том, что я не одинок, к сожалению. Реально к сожалению, т.к. печальная ситуация с C++ уже местами сильно задалбывает.

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

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

Выборка не менее надежная, чем у Вас, надо сказать)

Синтаксис — дело привычки, и он у раста не настолько ужасен, чтобы не привыкнуть в нему полностью за пару недель.

То что он отличается от C++ — очевидно, но выдавать непривычное за нечто ужасное — это как-то снобизмом и ксенофобией уже попахивает.

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

Ну а говнокод есть на любом языке — от этого никуда не деться.

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

Опрос Stackoverflow показал, что раст любимый язык большинства опрошенных. Или там растоманы весь SO захватили и накрутили голоса?

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

Я когда, привыкший к синтаксису Фортрана и Бейсика, впервые увидел код на Си, то подумал: «Какой же некрасивый язык!». Все очень индивидуально и определяется прошлым опытом

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

Тогда нет. Тогда язык Си был в диковину. Да, не так молод ;)

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

Но как? Чтобы вернуть что-то из функции, нужно это что-то создать в функции, а вывод типов потребует точно указать тип этого объекта.

если с боксом, то вот так https://play.rust-lang.org/?gist=50e696cc5e8b3dcdddeac22637a9666b&version...

extern crate rand;
use rand::Rng;
use std::fmt::Debug;

#[inline(never)]
fn my_u32() -> impl Debug + Copy {
    let mut rng = rand::thread_rng();
    let r =  rng.gen::<u32>();
    return r;
}

fn my_f64() -> impl Debug + Copy  {
    let mut rng = rand::thread_rng();
    let r =  rng.gen::<f64>();
    return r;
}

fn my_val() -> Box<Debug> {
    let mut rng = rand::thread_rng();
    let r =  rng.gen::<u8>();
    println!("random={}", r);
    if r > 127 {
        println!("return i32");
        return Box::new(my_u32());
    }
    else{
        println!("return f64");
        return Box::new(my_f64());
    }
}


fn main() {
    let vs: Vec<Box<Debug>> = vec![Box::new(my_u32()), Box::new(my_f64()), my_val()];
    for v in &vs {
        println!("{:?}", v);
    }
}

пример выхлопа (он рандомный если что)

random=233
return i32
3098332417
0.3006261433519364
569887438

т.е. если я правильно понимаю, то my_val возвращает тип, у которого известен только трейт Debug, а реальный тип неизвестен компилятору

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

что самое интересное, до этого раст давал Офигенно Информативную Ошибку https://play.rust-lang.org/?gist=5d5c5f57bbbc3659be2f14f54d3845e0&version...

  Compiling playground v0.0.1 (file:///playground)
error[E0308]: mismatched types
  --> src/main.rs:22:16
   |
22 |         return my_str();
   |                ^^^^^^^^ expected anonymized type, found a different anonymized type
   |
   = note: expected type `impl std::fmt::Debug` (anonymized type)
              found type `impl std::fmt::Debug` (anonymized type)

error: aborting due to previous error

For more information about this error, try `rustc --explain E0308`.
error: Could not compile `playground`.

To learn more, run the command again with --verbose.

вот это

   = note: expected type `impl std::fmt::Debug` (anonymized type)
              found type `impl std::fmt::Debug` (anonymized type)

-- подлинный шедевр компиляторостроения, хотя, емнип, в некоторых языках такое может быть на самом деле (да-да, я про js)

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

подлинный шедевр компиляторостроения

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

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

вместо одного анонимного типа у тебя другой

ну так компилятор видит разницу, и именно то что он видит, он и должен написать (а по его ответу *я* разницу не вижу, в этом претензия)

кроме того, там вроде проблема в чем-то другом, я даже и не понял в чем — может бокса нет, а может трейта Copy

update: ты мою длинную простынь с валидным кодом прочел перед своим вопросом?

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

Да, всё индивидуально, в школе был бэйсик, он вызвал такое отвращение, что вернуться к изучению программирования смог только спустя лет 10 благодаря С и линуксу.

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

Я не понимаю, о чем спор. Имхо, если бы у Rust-а был более читаемый синтаксис, то он был бы более популярным. И желающих приобщиться к нему было бы больше.

Полагаю, что если бы Rust был чуть более многословным, то и читать Rust-овский код было бы проще. Поскольку, как по мне, так Go-шные портянки воспринимаются проще, чем цепочки из Rust-овских методов.

Но это все досужие домыслы конкретного C++ника, который пока не видит смысла вкладывать собственные ресурсы в разработку на Rust-е. При этом за чужие деньги написание кода на Rust вряд ли бы вызвала у меня сложности. Правда, есть большие сомнения, что в дикой природе Rust много кому нужен.

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

если с боксом

то это трэйт-объект, динамическая диспетчеризация, тип становится известен только в рантайме — так что мимо. impl Trait дает именно статическую диспетчеризацию, а значит будет выполнена мономорфизация, нивелируя избыточность обобщенного кода (FIXME).

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

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

в моем примере my_val возвращает неизвестный тип с известным только трейтом; речь шла не об этом?

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

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

судя по всему на расте буду писать плагины к фаерфоксу — т.е. использовать его вместо js; при этом unsafe код в плагинах запретят, и ревью кода будет делать компилятор — это прогресс

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

так же раст можно использовать в сочетании «2 сеньора и 10 обезьян индусов», где индусам тоже запрещен unsafe; в отличие от с++ индусы не смогут сделать расстрел памяти (хотя и смогут делать утечки) — т.е. получаем плюсы модели разработки на яве, но с доступом к железу и без тормозов

но, несмотря на все это, мне раст не нравится

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

А где без GC их можно нормально написать?

я не знаю, хотя исследования на эту тему есть

из практических — в D емнип можно долго-долго граф строить внутри функции, не делая ликов указателей наружу, а потом объявить константным и выдать на него константный указатель (указатели?) наружу, и компилятор с этим согласится — но я могут в деталях тут соврать (при этом в D другая константность, чем с++)

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

судя по всему на расте буду писать плагины к фаерфоксу — т.е. использовать его вместо js

Не будут. По крайней мере, таких намерений нигде не озвучено.

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

Синтаксис — дело привычки, и он у раста не настолько ужасен, чтобы не привыкнуть в нему полностью за пару недель.

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

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

Не будут. По крайней мере, таких намерений нигде не озвучено.

меня это удивляет (хотя свое «судя по всему» я не прочитал, а вывел)

ты видишь какие-то препятствия (с точки зрения нарушения безопасности на уровне железа) к тому, чтобы дать доступ к каким-то кишкам фаерфокса плагинам, написанным на safe rust?

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

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

что самое интересное, до этого раст давал Офигенно Информативную Ошибку

anonymized type

Уже выясняли выше по треду (ну, я выяснял), что это не анонимный тип, а тип, считающийся анонимным в данной конкретной точке с точки зрения вывода типов. Компилятор вывел, что под impl Debug в выводе my_int скрывается u32, а под impl Debug в выводе my_str скрывается String. Фактически в итоге для компилятора код выглядит как

fn my_int() -> u32 {
    1u32
}

fn my_str() -> String {
    "Hello".to_string()
}
А внятную ошибку он тебе не выдает, потому что ты _сам_ описал типы результата функций как анонимные.

Короче, ответом на твой вопрос будет: «нет, impl Trait не позволит писать гетерогенные массивы». У этой фичи другие бонусы.

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

khrundel

Он задался чёткой целью: прищучить tailgunner'а. Сложно его упрекнуть в этом modus operandi, поскольку таковая цель является голубой мечтой многих ;-).

в моем примере my_val возвращает неизвестный тип с известным только трейтом; речь шла не об этом?

Почитай, пожалуйста, доку по данному вопросу, чтобы мы могли говорить на одном языке: https://doc.rust-lang.org/book/first-edition/trait-objects.html

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

я по-проще сформулирую свою телегу чуть выше: safe rust кмк уже не позволяет просканировать сырую память на тему поиска структур скажем менеджера паролей, теперь осталось к компилятору прикрутить проверку «начиная от указателя на кнопку закрытия вкладки нельзя придти к указателю на хранилище паролей», после чего — профит

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

Но компилятор пишет «ожидается Foo, но я вижу Foo». Лол. Что это за тупизна?

Уж извини, но тупизной отдаёт твой комментарий. Потому что Foo это трэйт, типаж, а не сам тип. А сам тип будет — `impl Foo`. Компилятор пишет, что ожидает один тип, соответствующий типажу Foo, а ему подсовывают другой, тоже соответствующий Foo, но другой.

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

А внятную ошибку он тебе не выдает, потому что ты _сам_ описал типы результата функций как анонимные.

скорее всего не поэтому; скорее всего потому, что компилятор вызвал функцию сравнения каких-то типов и она вернула «не равны», и затем выдает диагностику, а в диагностике разрабы либо не учли, что внешнее представление двух разных типов может совпасть, либо сознательно обрезали внешнее представление, но в данном случае обрезали слишком сильно

возможны и другие варианты

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

ты видишь какие-то препятствия (с точки зрения нарушения безопасности на уровне железа) к тому, чтобы дать доступ к каким-то кишкам фаерфокса плагинам, написанным на safe rust?

Нет, но это не имеет ровно никакого значения. Сама идея мертворожденная.

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

В твоей прекрасной идее есть небольшая уязвимость: писать на Rust что-то, сложнее факториала, довольно сложно и предъявляет определенные требования к навыкам программиста. Это сильно посложнее, чем говнякать на джаваскрипте WebExtensions, как сейчас.

Это не единственная проблема, но чисто практически — не последняя по существенности.

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

Уж извини, но тупизной отдаёт твой комментарий. Потому что Foo это трэйт, типаж, а не сам тип. А сам тип будет — `impl Foo`. Компилятор пишет, что ожидает один тип, соответствующий типажу Foo, а ему подсовывают другой, тоже соответствующий Foo, но другой.

переход на личности начал ты, так что далее не обижайся

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

ошибка:
ожидается дата 2018 года
принята   дата 2018 года

и промолчит, что разница в дне и месяце

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

Но компилятор пишет «ожидается Foo, но я вижу Foo»

Компилятор пишет «ждал один анонимизированный тип, а получил другой анонимизированный»; Foo - это реализуемый трейт, а не имя типа.

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

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

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

Это сильно посложнее, чем говнякать на джаваскрипте WebExtensions, как сейчас.

те плагины, что были у фаерфокса, местами сильно посложнее чем WebExtensions, и лезли именно что в кишки фаерфокса через опасные js-обертки сишних функций, а вовсе не к DOM конкретных страничек во вкладках (хотя сходу я эти плагины не назову, но воя «наше расширение теперь не работает» по-моему достаточно, и не работает в основном из-за этого)

хотя кстати, можно ли на WebExtensions сделать полноценный vimperator например?

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

Нет, но это не имеет ровно никакого значения. Сама идея мертворожденная.

и почему?

Эээ... ну, например, потому, что автору плагина придется делать N бинарей, по одному на платформу; что невозможно проверить, что бинарь сделан из safe Rust; что у Rust нет стандартного ABI (ты же не предлагаешь использовать C FFI?); что у Firefox нет стабильного ABI (или вообще никакого ABI); что порог входа в программирование на Rust запретительно высок для авторов плагинов; что автор плагина может забыть об общей кодовой базе для Chrome и Firefox. Наверное, можно найти и еще причины, но, по-моему, даже приведенных достаточно на 146%.

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

ну, например, потому, что автору плагина придется делать N бинарей,

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

кстати, бинари без исходников компилятор раста ведь не умеет проверять на safe rustness (как это назвать), ведь так?

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

я че-то не рассматривал закрытые плагины,

Я тоже.

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

А ты рассматривал, нужно ли это Мозилле?

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

что автор плагина может забыть об общей кодовой базе для Chrome и Firefox

а так и должно быть, т.к. это киллер-фича фокса; а те простые вещи, что можно сделать на WebExtensions будут работать в обоих браузерах

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

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

ошибка: ожидается дата 2018 года принята дата 2018 года

и промолчит, что разница в дне и месяце

Ты так ничего и не понял.

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

Советский матфак или физфак.

ДВК-2 по дядиному протеже в техникуме, когда я был школьником

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

Ты так ничего и не понял.

и что я не понял? что ты безнадежный фанбой раста и обращаться к тебе бесполезно, или что-то другое?

твоя логика сводится к тому, что компилятор 100% прав в своей диагностике, но ты упорно не замечаешь, что этого недостаточно — компилятор должен

1. доступно объяснить программисту, *почему* компилятор прав — а в данном случае, исходя из диагностики компилятора это не сделать; более того, даже не ясно, куда копать

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

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

можно ли на WebExtensions сделать полноценный vimperator например?

Нет. Текущий API обязывает все клавиатурные шоткаты как минимум начинаться с клавиши-модификатора, что, как я понимаю, вимеров не устраивает. Есть еще какие-то ограничения, но я их не помню.

Как я понимаю, сейчас вимо-плагины вешают обработчики на сигналы onkeydown или как там они называются для каждой страницы, что, естественно, не работает на служебных страницах браузера, а также на AMO, емнип.

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