Демонстрация на това защо Rust е интересен език, който си заслужава да се пробва.
Две-три думи за ust
View Slide
@AndrewRadev
“Много е готин”
Ferris the Crustacean
Какво толкова пренаписваттия ръстаджии?
Redox
Alacritty
Ripgrep
Servo
Игрички●Piston●SHAR●ggez
Защо?
Защо?●Скорост●Съвместимост●C, Ruby, Python, Erlang●Микроконтролери●Web Assembly●Безопасност
Rust винаги шофира
Защо?●Скорост●Съвместимост●Безопасност●Елегантност●Общност: документация, конференции,форуми, процес на разработка
Малко код
Zero-cost abstractionC++ implementations obey the zero-overheadprinciple: 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
fn main() {let potato = "Любов, любов, варен картоф,разрежеш го, а той суров.";println!("--\n{}\n--", potato);}// ===================---Любов, любов, варен картоф,разрежеш го, а той суров.---
fn main() {let potato = "Любов, любов, варен картоф,разрежеш го, а той суров.";let lines = potato.trim().lines().map(|l| l.trim());println!("---");for line in lines {println!("{}", line);}println!("---");}// ===================---Любов, любов, варен картоф,разрежеш го, а той суров.---
fn main() {let potato = "Любов, любов, варен картоф,разрежеш го, а той суров.";let lines = potato.trim().lines().map(|l| l.trim());println!("+-------------------------------+");for line in lines {println!("| {}\t|", line);}println!("+-------------------------------+");}// ===================+-------------------------------+| Любов, любов, варен картоф, || разрежеш го, а той суров. |+-------------------------------+
let lines = potato.trim().lines().map(|l| l.trim());for line in lines {println!("{}", line);}
let lines = potato. // => &strtrim().lines().map(|l| l.trim());for line in lines {println!("{}", line);}fn trim(&self) -> &str {//// " Любов, ала-бала, картоф "// ^___________________________^ -> текущия &str//// " Любов, ала-бала, картоф "// ^_____________________^ -> върнатия &str}
let lines = potato.trim().lines(). // => Lines (std::str::Lines)map(|l| l.trim());for line in lines {println!("{}", line);}
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);}
Zero-cost abstraction●Удобен интерфейс●Ефективна имплементация
Error handling
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
let mut fun = try! {File::open("fun.txt").or_else(|_| File::open("passable.txt")).or_else(|_| File::open("okay_i_guess.txt"))};
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);}
macro_rules! try {($expr:expr) => {match $expr {Ok(result) => result,Err(e) => return Err(e),}}}
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);}
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);}
Безопасност
Досадна безопасност●Няма NULL●3.14 * 2 е компилационна грешка●Жонглиране на references (“псевдоними”)●(demo)
Полезна безопасност :)●HashMap.entry()●Има Result, Option – по-удобни от NULL●Добре документирани и полезни операции счисла●(demo)
Learning curve●“Това е ужасно, защо не мога да направякаквото си знам”?●Крачка назад●Четене на документация●Различен (по-добър) подход
Защо?●Скорост●Съвместимост●Безопасност●Елегантност●Общност●Труден, но си заслужава
The Rust Book
?