рдореИрдВ рдЗрд╡рд╛рди рдХреИрдорд░рди рджреНрд╡рд╛рд░рд╛ рдПрдХ рд▓реЗрдЦ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реВрдВ , рдЬреЛ рдЬрд╛рд╡рд╛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рджреЛ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдФрд░ рд╕рдорд╛рдирддрд╛ рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ - рдореВрд▓ рд▓реЗрдЦрдХ рдХреА рд╕рд╛рдЗрдЯ рдкрд░ рд╣реИ ред рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдПрдХ рдЕрдиреБрднрд╡реА рд░рд╕реНрдЯ рдбреЗрд╡рд▓рдкрд░ рдирд╣реАрдВ рдорд╛рдирддреЗ рд╣реБрдП, рдореИрдВ рд╕рдВрднрд╛рд╡рд┐рдд рдЪрд░реНрдЪрд╛рдУрдВ рдореЗрдВ рдпрдереЛрдЪрд┐рдд рд░реВрдк рд╕реЗ рднрд╛рдЧ рд▓реЗрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реВрдВред
рдореИрдВ рдмреНрд▓реЙрдЧ рдкрд░ рдмрджрд▓рд╛рд╡ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдЙрди рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╡рд┐рд╖рдп рдЫреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реВрдВред рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╖рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЬреЛ рд░рд╕реНрдЯ рд╕рдореБрджрд╛рдп рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рд╡рд╣ рдирдП рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХрд╛ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╣реИред рдореИрдВ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд░рд╕реНрдЯ рдХреЛ рдкрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдЬреЛ рдЬрд╛рд╡рд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдФрд░ рдПрдХ рдирдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рднрд╛рд╖рд╛ рдореЗрдВ рдорд╣рд╛рд░рдд рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВред
рдЬрд╛рд╡рд╛ рдПрдХ рдРрд╕реА рднрд╛рд╖рд╛ рдереА рдЬрд┐рд╕рдХрд╛ рдореИрдВрдиреЗ рд╡рд┐рд╢реНрд╡рд╡рд┐рджреНрдпрд╛рд▓рдп рдореЗрдВ рдЕрдзреНрдпрдпрди рдХрд┐рдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреЗ рд╕рд╛рде рдореЗрд░рд╛ рдЕрдиреБрднрд╡ рдХреБрдЫ рд╣рдж рддрдХ рдХрдард┐рди рд╣реИ рдФрд░ рдореИрдВрдиреЗ рднрд╛рд╖рд╛ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдпрд╛рд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдЬрдм рдореИрдВрдиреЗ рдЕрдВрддрд┐рдо рдмрд╛рд░ рдЬрд╛рд╡рд╛ рд▓рд┐рдЦрд╛ рдерд╛, рдпрджрд┐ рдЖрдк рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ, рддреЛ рдЖрдкрдХреЛ рдПрдХ рдирдпрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рдкреЗрдЯрдирд╛ рд╣реЛрдЧрд╛ Callable<T>
ред рддрдм рд╕реЗ, рдЬрд╛рд╡рд╛ рдиреЗ рдПрдХ рд▓рдВрдмрд╛ рд╕рдлрд░ рддрдп рдХрд┐рдпрд╛ рд╣реИред рдпреЗ рдРрд╕реЗ рдХрд╛рд░реНрдп рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдкреНрд░рднрд╛рд╡ рдкрдбрд╝рддрд╛ рд╣реИред рдореИрдВ рд▓рдВрдмреЛрджрд░, Optional
рдкреНрд░рдХрд╛рд░, рдЖрджрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ ред рдпрд╣ рд▓реЗрдЦ рдмрд╛рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдХрд┐ рд░рд╕реНрдЯ рдореЗрдВ рдХреИрд╕реЗ рд▓рд┐рдЦреЗрдВ рдпрд╛ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд╕рднреА рдЬрд╛рд╡рд╛ рдХреЛрдб рдХреЛ рдлреЗрдВрдХрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЬрд╛рд╡рд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдорд╣рд╛рди рднрд╛рд╖рд╛ рд╣реИред рдореИрдВ рдПрдХ рд╢реБрд░реБрдЖрддреА рд░рд╕реНрдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛ рдФрд░ рд░рд╕реНрдЯ рдХреА рдХреБрдЫ рддреБрд▓рдирд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рднрд╛рд╖рд╛ рдХреА рдкреНрд░реЗрд░рдгрд╛
рдкрд╣рд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рднрд╛рд╖рд╛ рдХреЗ рд▓рдХреНрд╖реНрдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред рдХрдИ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ "рд╕рд░рд▓, рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рдФрд░ рдореЙрдбреНрдпреВрд▓рд░" рд╣реЛрдирд╛ рдерд╛ , рдЗрд╕реЗ рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдореЗрдВ рдХрд╛рдо рдХрд░рдирд╛ рдерд╛, рд╡рд┐рднрд┐рдиреНрди рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП рдкреЛрд░реНрдЯреЗрдмрд▓ рд╣реЛрдирд╛ рдерд╛, рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЙрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдирд╛ рдерд╛ред рд░рд╕реНрдЯ рдХреЗ рд▓рдХреНрд╖реНрдп "рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рддреЗрдЬрд╝ рдФрд░ рдореЗрдореЛрд░реА рдХреБрд╢рд▓" рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИрдВ , рдПрдХ "рд░рд┐рдЪ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо, рдореЗрдореЛрд░реА рд╕рд┐рдХреНрдпреЛрд░рд┐рдЯреА, рдереНрд░реЗрдб-рд╕реЗрдл" рд╣реИрдВ, рдЕрдЪреНрдЫреА рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреИрдХреЗрдЬ рдореИрдиреЗрдЬрд░ рд╣реИрдВред
. Rust , , . , Rust , . , , , , ( ) , (embedded) . , Rust. Rust , , (dangling) .
, Rust ( wasm frontends yew ). , , , , ( ) . .
, , Java Rust :
; , , . , .
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());
let b: Option<usize> = Some(1);
. , . , . , .
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 {
fn new() -> Self {
Self {
list: vec![]
}
}
fn add_thang(&mut self, thang: Thang) {
self.list.push(thang);
}
}
fn main() {
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 };
}
- . , , 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)];
}
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;
}
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) {
unimplemented!()
}
Rust . , , Java. , . Java , Rust . , . , , . Future
, Iterator
IntoIterator
for..in
, Index
[]
, Add
, Sub
, Mul
. , Add
Add
std.
pub trait Add<Rhs = Self> {
type Output;
fn add(self, rhs: Rhs) -> Self::Output;
}
Std Add
Rhs
, Self
, .. (1). ┬л ┬╗ Output
(2) add
, self
( self
) rhs
Rhs
( ) , Output
(3).
use std::ops::Add;
#[derive(Debug)]
struct Content<T> {
val: T,
}
impl<T> Add for Content<T>
where
T: Add,
{
type Output = Content<<T as Add>::Output>;
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
, 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 рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╕рдВрдХрд▓рди рд╕рдордп рдмрдврд╝рд╛рдирд╛ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрддреНрдкрдиреНрди рдХреЛрдб рдХреА рдорд╛рддреНрд░рд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХрд░рдирд╛ред
рд╕рдВрдкрд░реНрдХ рдЗрд╡рд╛рди рдХреИрдорд░рди: рдореЗрд▓ , рдЬреАрдердм , рдЯреНрд╡рд┐рдЯрд░ , рд▓рд┐рдВрдХреНрдбрдЗрди
рд░рд╕реНрдЯ рдЕрдиреБрд╡рд╛рдж рдХреА рдзреАрдореА рдЪрд░реНрдЪрд╛ рд░рд╕реНрдЯ рдЕрдиреБрд╡рд╛рдж рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдЪреИрдЯ рдореЗрдВ рд╣реЛрддреА рд╣реИ ред