рдЬрд╛рд╡рд╛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЬрдВрдЧ

рдореИрдВ рдЗрд╡рд╛рди рдХреИрдорд░рди рджреНрд╡рд╛рд░рд╛ рдПрдХ рд▓реЗрдЦ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реВрдВ , рдЬреЛ рдЬрд╛рд╡рд╛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рджреЛ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдФрд░ рд╕рдорд╛рдирддрд╛ рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ - рдореВрд▓ рд▓реЗрдЦрдХ рдХреА рд╕рд╛рдЗрдЯ рдкрд░ рд╣реИ ред рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдПрдХ рдЕрдиреБрднрд╡реА рд░рд╕реНрдЯ рдбреЗрд╡рд▓рдкрд░ рдирд╣реАрдВ рдорд╛рдирддреЗ рд╣реБрдП, рдореИрдВ рд╕рдВрднрд╛рд╡рд┐рдд рдЪрд░реНрдЪрд╛рдУрдВ рдореЗрдВ рдпрдереЛрдЪрд┐рдд рд░реВрдк рд╕реЗ рднрд╛рдЧ рд▓реЗрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реВрдВред


рдореИрдВ рдмреНрд▓реЙрдЧ рдкрд░ рдмрджрд▓рд╛рд╡ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдЙрди рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╡рд┐рд╖рдп рдЫреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реВрдВред рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╖рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЬреЛ рд░рд╕реНрдЯ рд╕рдореБрджрд╛рдп рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рд╡рд╣ рдирдП рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХрд╛ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╣реИред рдореИрдВ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд░рд╕реНрдЯ рдХреЛ рдкрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдЬреЛ рдЬрд╛рд╡рд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдФрд░ рдПрдХ рдирдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рднрд╛рд╖рд╛ рдореЗрдВ рдорд╣рд╛рд░рдд рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВред


рдЬрд╛рд╡рд╛ рдПрдХ рдРрд╕реА рднрд╛рд╖рд╛ рдереА рдЬрд┐рд╕рдХрд╛ рдореИрдВрдиреЗ рд╡рд┐рд╢реНрд╡рд╡рд┐рджреНрдпрд╛рд▓рдп рдореЗрдВ рдЕрдзреНрдпрдпрди рдХрд┐рдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреЗ рд╕рд╛рде рдореЗрд░рд╛ рдЕрдиреБрднрд╡ рдХреБрдЫ рд╣рдж рддрдХ рдХрдард┐рди рд╣реИ рдФрд░ рдореИрдВрдиреЗ рднрд╛рд╖рд╛ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдпрд╛рд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдЬрдм рдореИрдВрдиреЗ рдЕрдВрддрд┐рдо рдмрд╛рд░ рдЬрд╛рд╡рд╛ рд▓рд┐рдЦрд╛ рдерд╛, рдпрджрд┐ рдЖрдк рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ, рддреЛ рдЖрдкрдХреЛ рдПрдХ рдирдпрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рдкреЗрдЯрдирд╛ рд╣реЛрдЧрд╛ Callable<T>ред рддрдм рд╕реЗ, рдЬрд╛рд╡рд╛ рдиреЗ рдПрдХ рд▓рдВрдмрд╛ рд╕рдлрд░ рддрдп рдХрд┐рдпрд╛ рд╣реИред рдпреЗ рдРрд╕реЗ рдХрд╛рд░реНрдп рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдкреНрд░рднрд╛рд╡ рдкрдбрд╝рддрд╛ рд╣реИред рдореИрдВ рд▓рдВрдмреЛрджрд░, OptionalрдкреНрд░рдХрд╛рд░, рдЖрджрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ ред рдпрд╣ рд▓реЗрдЦ рдмрд╛рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдХрд┐ рд░рд╕реНрдЯ рдореЗрдВ рдХреИрд╕реЗ рд▓рд┐рдЦреЗрдВ рдпрд╛ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд╕рднреА рдЬрд╛рд╡рд╛ рдХреЛрдб рдХреЛ рдлреЗрдВрдХрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЬрд╛рд╡рд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдорд╣рд╛рди рднрд╛рд╖рд╛ рд╣реИред рдореИрдВ рдПрдХ рд╢реБрд░реБрдЖрддреА рд░рд╕реНрдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛ рдФрд░ рд░рд╕реНрдЯ рдХреА рдХреБрдЫ рддреБрд▓рдирд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред


рднрд╛рд╖рд╛ рдХреА рдкреНрд░реЗрд░рдгрд╛


рдкрд╣рд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рднрд╛рд╖рд╛ рдХреЗ рд▓рдХреНрд╖реНрдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред рдХрдИ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ "рд╕рд░рд▓, рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рдФрд░ рдореЙрдбреНрдпреВрд▓рд░" рд╣реЛрдирд╛ рдерд╛ , рдЗрд╕реЗ рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдореЗрдВ рдХрд╛рдо рдХрд░рдирд╛ рдерд╛, рд╡рд┐рднрд┐рдиреНрди рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП рдкреЛрд░реНрдЯреЗрдмрд▓ рд╣реЛрдирд╛ рдерд╛, рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЙрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдирд╛ рдерд╛ред рд░рд╕реНрдЯ рдХреЗ рд▓рдХреНрд╖реНрдп "рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рддреЗрдЬрд╝ рдФрд░ рдореЗрдореЛрд░реА рдХреБрд╢рд▓" рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИрдВ , рдПрдХ "рд░рд┐рдЪ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо, рдореЗрдореЛрд░реА рд╕рд┐рдХреНрдпреЛрд░рд┐рдЯреА, рдереНрд░реЗрдб-рд╕реЗрдл" рд╣реИрдВ, рдЕрдЪреНрдЫреА рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреИрдХреЗрдЬ рдореИрдиреЗрдЬрд░ рд╣реИрдВред


. Rust , , . , Rust , . , , , , ( ) , (embedded) . , Rust. Rust , , (dangling) .


, Rust ( wasm frontends yew ). , , , , ( ) . .


, , Java Rust :


  • ( GC)
  • ()

; , , . , .




Rust . Rust enum struct. enum тАФ ( , ). enum Java, , Java enum, . enum , , . , , Rust null nil. Rust, .


enum Option<T> {
    None,
    Some(T),
}

Option, T. T , T. Option 2 , None (" ") , Some T. :


let a = Some("foo".to_string()); //    Option<String>

let b: Option<usize> = Some(1); //    Option<usize>,    

. , . , . , .


Rust enum match. , .


fn plus(a: Option<usize>) -> Option<usize> {
    match a {
        Some(v) => Some(v + 1),
        None => None
   }
}

, . match. cheats.rs match. if/else.


Option, - ( Some ) . , Option , .


fn plus(a: Option<usize>) -> Option<usize> {
    a.map(|v| v + 1)
}

|| {} тАФ . Rust - , , " " .



struct тАФ . , , , .


struct A {
   field: usize
}

"" .


let a: (usize, usize) = (1, 1); //    

.


struct Foo<T> {
    field: T
}


enum struct . , impl . , Rust. struct impl , :


struct Thangs {
   list: Vec<Thang>
}

struct Thang;

impl Thangs {
   // **  `new`    ,   ' '
   fn new() -> Self {
       Self {
           list: vec![]
       }
   }

   fn add_thang(&mut self, thang: Thang) {
       self.list.push(thang);
   }
}

fn main() {
  // ** &mut self   'add_thangs'   mut   
   let mut thangs = Thangs::new();
   thangs.add_thang(Thang);
}

Java, value.method() " ". , &mut self :


let mut thangs = Thangs::new();
Thangs::add_thang(&mut thangs, Thang);

, Rust . enum struct . Java - struct impl , "", ( , ). " Rust ", Java , . Java 14 "Records" () . , Java "", ( , Rust , sum product ). Java, - , , !




Rust . , . . :


struct Thing { field: usize }

fn main() {
    let a = Thing { field: 1 };
    // .. do stuff with a
}

- . , , Sized. , . , ( main) .


Java, new, , .



Box ( stdlib , Rc, Arc ..). , , ? , , , , ( ). , , , , "" Box , .


fn main () {
    let a = Box::new(Thing { field: 1 });
}

, . , . , , a a. usize , .


Box . - Java,


trait Foo {}

struct Thing;

impl Foo for Thing {}

struct OtherThing;

impl Foo for OtherThing {}

fn main () {
    let a: Vec<Box<dyn Foo>> = vec![Box::new(OtherThing), Box::new(Thing)]; //   
    //  ''     ,    
    //            Foo
    }

trait, . , . , . Rust , , , , .


, , . Rust тАФ .


.


enum List<T> {
    Nil,
    Cons((T, List<T>))
}

. List<T> Nil , Cons, . , , ?
?


    error[E0072]: recursive type `List` has infinite size
     --> src/lib.rs:7:1
      |
    7 | enum List<T> {
      | ^^^^^^^^^^^^ recursive type has infinite size
    8 |     Nil,
    9 |     Cons((T, List<T>))
      |          ------------ recursive without indirection
      |
      = help: insert indirection (e.g., a `Box`, `Rc`, or `&`) at some point to make `List` representable

. help . , , . , , , N-? , , ? , . .


, .


enum List<T> {
    Nil,
    Cons((T, Box<List<T>>))
}

. , . .




Java Rust, ( ) :


enum Shape {
    Circle { radius: f32 },
    Rectangle { width: f32, height: f32 },
}

area () , , , :


impl Shape {
    pub fn area(self) -> f32 {
        match self {
            Shape::Circle { radius } => std::f32::consts::PI * radius.powi(2),
            Shape::Rectangle { width, height } => width * height,
        }
    }
 }

Java . Rust pub ( ), ( ). , Rust reference.


. Java Shape Circle Rectangle, area. Rust Java, :


  • Shape:
    • Java: Shape
    • Rust: Shape , ( match , )
  • Shape:
    • Java: "" Shape, ,
    • Rust: impl

' ' (expression problem). . enum Rust / Java. , Rust match enum. : ┬л , ?┬╗


, .


trait Area {
    fn area(self) -> f32; //          ( i32)
}

struct Rectangle {
    width: f32,
    height: f32
}

struct Circle {
    radius: f32
}

impl Area for Rectangle {
    fn area(self) -> f32 {
        self.width * self.height
    }
}

impl Area for Circle {
    fn area(self) -> f32 {
        std::f32::consts::PI * self.radius.powi(2)
    }
}

, Circle Rectangle, perimeter, :


trait Perimeter {
    fn perimeter(self) -> f32;
}

impl Perimeter for Rectangle {
    fn perimeter(self) -> f32 {
        2. * (self.width + self.height)
    }
}
//  ..

. , , "" " ".


fn do_something<T: Perimeter + Area>(shape: T) { //   ,    Perimeter  Area
        unimplemented!() // :   
        //        
    }


Rust . , , Java. , . Java , Rust . , . , , . Future , Iterator IntoIterator for..in, Index [], Add, Sub, Mul . , Add


Add std.


pub trait Add<Rhs = Self> { // 1
    type Output; // 2
    fn add(self, rhs: Rhs) -> Self::Output; // 3
}

Std Add Rhs, Self, .. (1). ┬л ┬╗ Output (2) add, self ( self) rhs Rhs ( ) , Output (3).


use std::ops::Add;

#[derive(Debug)]
struct Content<T> { // 1
    val: T,
}

impl<T> Add for Content<T> // 2
   where
    T: Add, // 3
{
    type Output = Content<<T as Add>::Output>; // 4
    fn add(self, rhs: Content<T>) -> Self::Output {
        Content {
            val: self.val + rhs.val,
        }
    }
}

fn main() {
    let a = Content { val: 2 };
    let b = Content { val: 5 };
    println!("{:?}", a + b); // Content { val: 7 }
}

Content, T (1). Add , Content Add (2), , Content Add (3). , Output Content Output T, Add (4). , , , . , , . , " " , Rust. , Rust , ( ), .


, Sized , fn foo<T>(t: T) -> T, T: Sized. T: ?Sized, T . .



Java . OO Rust, Java. Java тАФ (subtype polymorphism), Rust тАФ (ad-hoc) . , , , ( <T: Trait> ).


, "" . , enum struct, impl. impl , . , , -. .


Rust . str, String, OsStr, OsString, CString CStr ( - ?). , str String, тАФ . , , ?


&str , &str &String , String Deref<Target=str> ( Target= , Target " "). .


fn foo<S: AsRef<str>>(s: S) {
    unimplemented!()
}

AsRef тАФ stdlib. :


trait AsRef<T>
  where
    T: ?Sized,
{
    fn as_ref(&self) -> &T;
}

, T, , &T. foo String,


let a = String::from("stuff");
foo(a);

? , ( ). Rust stdlib.


, . , , . , . Java ( , Java ). Java , . ┬л ┬╗. Rust , .



, , . , - . , , . Rust , ! , Rust .


.


: Java Rust


Java , . , . - Java , .. . , , Java , ( Java <T> <T extends Class> ), Java , (type erasure). , Object -. Java, , тАФ . - vtable, .


Rust . foo foo , foo . , foo 4 AsRef<str>, 4 . ┬л┬╗. , Rust " ". ( Box), ObjectрдЕрдЧрд░ рд╣рдо рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓ рдЯреЗрдмрд▓ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд░реЗрдВред рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдиреБрдХрд╕рд╛рди рдЕрдВрддрд┐рдо рдХреЛрдб рдЖрдХрд╛рд░ рдФрд░ рд╕рдВрдХрд▓рди рд╕рдордп рд╣реИред рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдХрд┐рддрдиреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ рдФрд░ рд╣рдореЗрдВ рдХрд┐рддрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реБрдП, рдЕрдзрд┐рдХ рдХреЛрдб LLVM рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╕рдВрдХрд▓рди рд╕рдордп рдмрдврд╝рд╛рдирд╛ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрддреНрдкрдиреНрди рдХреЛрдб рдХреА рдорд╛рддреНрд░рд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХрд░рдирд╛ред


рд╕рдВрдкрд░реНрдХ рдЗрд╡рд╛рди рдХреИрдорд░рди: рдореЗрд▓ , рдЬреАрдердм , рдЯреНрд╡рд┐рдЯрд░ , рд▓рд┐рдВрдХреНрдбрдЗрди


рд░рд╕реНрдЯ рдЕрдиреБрд╡рд╛рдж рдХреА рдзреАрдореА рдЪрд░реНрдЪрд╛ рд░рд╕реНрдЯ рдЕрдиреБрд╡рд╛рдж рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдЪреИрдЯ рдореЗрдВ рд╣реЛрддреА рд╣реИ ред


All Articles