Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Две-три думи за Rust (ТърновоКонф 2018)

Две-три думи за Rust (ТърновоКонф 2018)

Демонстрация на това защо Rust е интересен език, който си заслужава да се пробва.

Andrew Radev

June 02, 2018
Tweet

More Decks by Andrew Radev

Other Decks in Programming

Transcript

  1. Две-три думи за ust

    View Slide

  2. @AndrewRadev

    View Slide

  3. “Много е готин”

    View Slide

  4. Ferris the Crustacean

    View Slide

  5. View Slide

  6. View Slide

  7. Какво толкова пренаписват
    тия ръстаджии?

    View Slide

  8. Redox

    View Slide

  9. Redox

    View Slide

  10. Alacritty

    View Slide

  11. Ripgrep

    View Slide

  12. Ripgrep

    View Slide

  13. Servo

    View Slide

  14. Игрички

    Piston

    SHAR

    ggez

    View Slide

  15. View Slide

  16. Защо?

    View Slide

  17. Защо?

    Скорост

    Съвместимост

    C, Ruby, Python, Erlang

    Микроконтролери

    Web Assembly

    Безопасност

    View Slide

  18. Rust винаги шофира

    View Slide

  19. Защо?

    Скорост

    Съвместимост

    Безопасност

    Елегантност

    Общност: документация, конференции,
    форуми, процес на разработка

    View Slide

  20. Малко код

    View Slide

  21. Zero-cost abstraction
    C++ implementations obey the zero-overhead
    principle: What you don’t use, you don’t pay for
    [Stroustrup, 1994]. And further: What you do use,
    you couldn’t hand code any better.
    – Stroustrup

    View Slide

  22. fn main() {
    let potato = "
    Любов, любов, варен картоф,
    разрежеш го, а той суров.
    ";
    println!("--\n{}\n--", potato);
    }
    // ===================
    ---
    Любов, любов, варен картоф,
    разрежеш го, а той суров.
    ---

    View Slide

  23. fn main() {
    let potato = "
    Любов, любов, варен картоф,
    разрежеш го, а той суров.
    ";
    let lines = potato.
    trim().
    lines().
    map(|l| l.trim());
    println!("---");
    for line in lines {
    println!("{}", line);
    }
    println!("---");
    }
    // ===================
    ---
    Любов, любов, варен картоф,
    разрежеш го, а той суров.
    ---

    View Slide

  24. fn main() {
    let potato = "
    Любов, любов, варен картоф,
    разрежеш го, а той суров.
    ";
    let lines = potato.
    trim().
    lines().
    map(|l| l.trim());
    println!("+-------------------------------+");
    for line in lines {
    println!("| {}\t|", line);
    }
    println!("+-------------------------------+");
    }
    // ===================
    +-------------------------------+
    | Любов, любов, варен картоф, |
    | разрежеш го, а той суров. |
    +-------------------------------+

    View Slide

  25. let lines = potato.
    trim().
    lines().
    map(|l| l.trim());
    for line in lines {
    println!("{}", line);
    }

    View Slide

  26. let lines = potato. // => &str
    trim().
    lines().
    map(|l| l.trim());
    for line in lines {
    println!("{}", line);
    }
    fn trim(&self) -> &str {
    //
    // " Любов, ала-бала, картоф "
    // ^___________________________^ -> текущия &str
    //
    // " Любов, ала-бала, картоф "
    // ^_____________________^ -> върнатия &str
    }

    View Slide

  27. let lines = potato.
    trim().
    lines(). // => Lines (std::str::Lines)
    map(|l| l.trim());
    for line in lines {
    println!("{}", line);
    }

    View Slide

  28. let lines = potato.
    trim().
    lines().
    map(|l| l.trim());
    for line in lines {
    println!("{}", line);
    }

    View Slide

  29. let lines = potato.
    trim().
    lines().
    map(|l| l.trim()); // => std::iter::Map,
    [[email protected]/main.rs:10:13: 10:25]>
    for line in lines {
    println!("{}", line);
    }

    View Slide

  30. let lines = potato.
    trim().
    lines().
    map(|l| l.trim());
    for line in lines {
    println!("{}", line);
    }

    View Slide

  31. Zero-cost abstraction

    Удобен интерфейс

    Ефективна имплементация

    View Slide

  32. Error handling

    View Slide

  33. file, err := os.Open("filename.ext")
    if err != nil {
    return err
    }
    match File::open("filename.ext") {
    Ok(file) => file,
    Err(e) => return e,
    }
    enum Result {
    Ok(T),
    Err(E),
    }
    Result

    View Slide

  34. let mut fun = try! {
    File::open("fun.txt").
    or_else(|_| File::open("passable.txt")).
    or_else(|_| File::open("okay_i_guess.txt"))
    };

    View Slide

  35. use std::fs::File;
    use std::io::{self, Read};
    fn main() {
    match do_magic_stuff() {
    Ok(contents) => println!("{}", contents),
    Err(e) => panic!("OH, NO! {}", e),
    }
    }
    fn do_magic_stuff() -> Result {
    let mut boring = match File::open("boring.txt") {
    Ok(f) => f,
    Err(e) => return Err(e),
    };
    let mut fun = match File::open("fun.txt") {
    Ok(f) => f,
    Err(e) => return Err(e),
    };
    let mut contents = String::new();
    boring.read_to_string(&mut contents);
    fun.read_to_string(&mut contents);
    return Ok(contents);
    }

    View Slide

  36. use std::fs::File;
    use std::io::{self, Read};
    fn main() {
    match do_magic_stuff() {
    Ok(contents) => println!("{}", contents),
    Err(e) => panic!("OH, NO! {}", e),
    }
    }
    fn do_magic_stuff() -> Result {
    let mut boring = match File::open("boring.txt") {
    Ok(f) => f,
    Err(e) => return Err(e),
    };
    let mut fun = match File::open("fun.txt") {
    Ok(f) => f,
    Err(e) => return Err(e),
    };
    let mut contents = String::new();
    boring.read_to_string(&mut contents);
    fun.read_to_string(&mut contents);
    return Ok(contents);
    }

    View Slide

  37. macro_rules! try {
    ($expr:expr) => {
    match $expr {
    Ok(result) => result,
    Err(e) => return Err(e),
    }
    }
    }

    View Slide

  38. use std::fs::File;
    use std::io::{self, Read};
    fn main() {
    match do_magic_stuff() {
    Ok(contents) => println!("{}", contents),
    Err(e) => panic!("OH, NO! {}", e),
    }
    }
    fn do_magic_stuff() -> Result {
    let mut boring = match File::open("boring.txt") {
    Ok(f) => f,
    Err(e) => return Err(e),
    };
    let mut fun = match File::open("fun.txt") {
    Ok(f) => f,
    Err(e) => return Err(e),
    };
    let mut contents = String::new();
    boring.read_to_string(&mut contents);
    fun.read_to_string(&mut contents);
    return Ok(contents);
    }

    View Slide

  39. use std::fs::File;
    use std::io::{self, Read};
    fn main() {
    match do_magic_stuff() {
    Ok(contents) => println!("{}", contents),
    Err(e) => panic!("OH, NO! {}", e),
    }
    }
    fn do_magic_stuff() -> Result {
    let mut boring = try!(File::open("boring.txt"));
    let mut fun = try!(File::open("fun.txt"));
    let mut contents = String::new();
    boring.read_to_string(&mut contents);
    fun.read_to_string(&mut contents);
    return Ok(contents);
    }

    View Slide

  40. use std::fs::File;
    use std::io::{self, Read};
    fn main() {
    match do_magic_stuff() {
    Ok(contents) => println!("{}", contents),
    Err(e) => panic!("OH, NO! {}", e),
    }
    }
    fn do_magic_stuff() -> Result {
    let mut boring = File::open("boring.txt")?;
    let mut fun = File::open("fun.txt")?;
    let mut contents = String::new();
    boring.read_to_string(&mut contents);
    fun.read_to_string(&mut contents);
    return Ok(contents);
    }

    View Slide

  41. Безопасност

    View Slide

  42. Досадна безопасност

    Няма NULL

    3.14 * 2 е компилационна грешка

    Жонглиране на references (“псевдоними”)

    (demo)

    View Slide

  43. Полезна безопасност :)

    HashMap.entry()

    Има Result, Option – по-удобни от NULL

    Добре документирани и полезни операции с
    числа

    (demo)

    View Slide

  44. Learning curve

    “Това е ужасно, защо не мога да направя
    каквото си знам”?

    Крачка назад

    Четене на документация

    Различен (по-добър) подход

    View Slide

  45. Защо?

    Скорост

    Съвместимост

    Безопасност

    Елегантност

    Общност

    Труден, но си заслужава

    View Slide

  46. The Rust Book

    View Slide

  47. ?

    View Slide