ΠΠΊΠΈΠΏΡΡ Π½Π° Rust Ρ ΡΠ°Π΄ΠΎΡΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Ρ Π½ΠΎΠ²Π°ΡΠ° Π²Π΅ΡΡΠΈΡ Π½Π° ΡΠ²ΠΎΡ Π΅Π·ΠΈΠΊ: 1.35. Rust Π΅ Π΅Π·ΠΈΠΊ Π·Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°Π½Π΅, ΠΊΠΎΠΉΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° ΠΏΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° Π½Π°Π΄Π΅ΠΆΠ΄Π½ΠΈ ΠΈ Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ.
ΠΠΊΠΎ Π²Π΅ΡΠ΅ ΠΈΠΌΠ°ΡΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ Rust ΡΡΠ΅Π· rustup, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ΅ ΠΎΠ±Π½ΠΎΠ²ΠΈΡΠ΅ Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ°:
$ rustup update stable
ΠΡΠ½ΠΎΠ²Π½ΠΎΡΠΎ Π² ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ΡΠΎ Π΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡΡΠ° Π½Π° ΡΡΠ΅ΠΉΡΠΎΠ²Π΅ΡΠ΅ Π·Π° Π·Π°ΠΌΠΈΠΊΠ²Π°Π½Π΅ Fn, FnOnce, FnMut Π·Π° Box, Box, Box ΡΡΠΎΡΠ²Π΅ΡΠ½ΠΎ. ΠΠΎΠ±Π°Π²Π΅Π½Π° Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π·Π° ΠΏΡΠΈΠ²ΠΎΠ΄Π΅Π½Π΅ Π½Π° Π·Π°ΠΌΠΈΠΊΠ²Π°Π½ΠΈΡ ΠΊΡΠΌ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ Π½Π° Π½Π΅Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ, Π° ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΌΠ°ΠΊΡΠΎΡΠ° dbg!() ΡΠ΅Π³Π° Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π±Π΅Π· Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΈ; ΡΡΠ°Π±ΠΈΠ»ΠΈΠ·Π°ΡΠΈΡ Π½Π° ΡΡΠ°Π½Π΄Π°ΡΡΠ½Π°ΡΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΡΡΡΠΎ Π±Π΅ΡΠ΅ ΠΏΡΠΎΠ²Π΅Π΄Π΅Π½Π°.
ΠΠΎ-ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ:
- Π Π½ΠΎΠ²Π°ΡΠ° Π²Π΅ΡΡΠΈΡ Π±ΡΡ
Π° Π΄ΠΎΠ±Π°Π²Π΅Π½ΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π½Π° ΡΡΠ΅ΠΉΡΠΎΠ²Π΅ΡΠ΅ Fn, FnOnce, FnMut Π·Π° Box, Box, Box ΡΡΠΎΡΠ²Π΅ΡΠ½ΠΎ.
Π‘Π΅Π³Π° ΡΠ°ΠΊΡΠ² ΠΊΠΎΠ΄ ΡΠ΅ ΡΠ°Π±ΠΎΡΠΈ:
fn foo(x: Box u8>) -> Vec {
vec![1, 2, 3, 4].into_iter().map(x).collect()
}Π‘ΡΡΠΎ ΡΠ°ΠΊΠ°, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·Π²ΠΈΠΊΠ°ΡΠ΅ Π·Π°ΠΌΠΈΠΊΠ²Π°Π½Π΅ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ ΠΎΡ Box:
fn foo(x: Box) {
x()
} - Π‘Π΅Π³Π° Π·Π°ΠΌΠΈΠΊΠ²Π°Π½ΠΈΡΡΠ° ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΏΡΠΈΠ²Π΅ΠΆΠ΄Π°Ρ ΠΊΡΠΌ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ Π½Π° unsafe fn.
Π‘Π΅Π³Π° ΡΠ°ΠΊΡΠ² ΠΊΠΎΠ΄ Π΅ Π²Π°Π»ΠΈΠ΄Π΅Π½:
/// The safety invariants are those of the `unsafe fn` pointer passed.
unsafe fn call_unsafe_fn_ptr(f: unsafe fn()) {
f()
}fn main() {
// SAFETY: There are no invariants.
// The closure is statically prevented from doing unsafe things.
unsafe {
call_unsafe_fn_ptr(|| {
dbg!();
});
}
} - ΠΠΎΠ±Π°Π²Π΅Π½Π° Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π΄Π° ΡΠ΅ ΠΈΠ·Π²ΠΈΠΊΠ²Π° ΠΌΠ°ΠΊΡΠΎΡΠ° dbg!() Π±Π΅Π· Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΈ.
ΠΠΊΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°Π΄Π΅ΡΠ΅ Π½Π° ΡΠΎΠ·ΠΈ ΠΌΠ°ΠΊΡΠΎΡ ΠΈΠ·ΡΠ°Π·, ΡΠΎΠΉ ΡΠ΅ ΠΈΠ·Π²Π΅Π΄Π΅ Π½Π΅Π³ΠΎΠ²ΠΈΡ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ. ΠΡΠΈΠΌΠ΅Ρ:
fn main() {
let mut x = 0;if dbg!(x == 1) {
x += 1;
}dbg!(x);
}ΠΡΠΈ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΡΠ°ΠΊΡΠ² ΠΊΠΎΠ΄ ΡΠ΅ Π²ΠΈΠ΄ΠΈΡΠ΅:
[src/main.rs:4] x == 1 = false
[src/main.rs:8] x = 0Π‘Π΅Π³Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ ΡΠ°ΠΊΠ°:
fn main() {
let condition = true;if condition {
dbg!();
}
}ΠΡΠΈ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΡΠ°ΠΊΡΠ² ΠΊΠΎΠ΄ ΡΠ΅ Π²ΠΈΠ΄ΠΈΡΠ΅:
[src/main.rs:5] - ΠΡΡ
Π° ΡΡΠ°Π±ΠΈΠ»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ Π½ΡΠΊΠΎΠΈ ΡΠ°ΡΡΠΈ ΠΎΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½Π°ΡΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°.
- ΠΠΎΠ²ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈ Π·Π° f32 ΠΈ f64:
- f32::copysign
- f64::copysign
Π‘ΡΡΠ½ΠΎΡΡΡΠ° Π½Π° ΡΡΠ½ΠΊΡΠΈΠΈΡΠ΅ Π΅ Π΄Π° ΠΊΠΎΠΏΠΈΡΠ°Ρ Π·Π½Π°ΠΊΠ° Π½Π° Π΄ΡΡΠ³ΠΎ ΡΠΈΡΠ»ΠΎ. ΠΡΠΈΠΌΠ΅Ρ:
fn main() {
assert_eq!(3.5_f32.copysign(-0.42), -3.5);
} - ΠΠΎΠ±Π°Π²Π΅Π½ΠΈ ΡΠ° Π½ΠΎΠ²ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈ Π·Π° ΡΠΈΠΏΠΎΠ²Π΅ Range.
- Range::contains
- RangeFrom::contains
- RangeTo::contains
- RangeInclusive::contains
- RangeToInclusive::contains
Π‘ ΡΠ΅Π·ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈ Π»Π΅ΡΠ½ΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΠΈΡΠ΅ Π΄Π°Π»ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° ΡΡΠΎΠΉΠ½ΠΎΡΡ Π΅ Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎΡΡΡΠ°:
fn main() {
if (0..=10).contains(&5) {
println!("ΠΠ΅Ρ Π΅ Π²ΠΊΠ»ΡΡΠ΅Π½ Π² Π½ΡΠ»Π° Π΄ΠΎ Π΄Π΅ΡΠ΅Ρ.");
}
} - ΠΡΠ»Π΅Π½ ΡΠΏΠΈΡΡΠΊ Ρ ΡΡΠ°Π±ΠΈΠ»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ API ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ ΡΡΠΊ
- ΠΠΎΠ²ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈ Π·Π° f32 ΠΈ f64:
- Π ΡΠΎΠ²Π° ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅, Π² Clippy (ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ°, ΠΊΠΎΡΡΠΎ ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π° ΠΊΠΎΠ΄Π° Π²ΠΈ Π·Π° Π³ΡΠ΅ΡΠΊΠΈ), Π±Π΅ Π΄ΠΎΠ±Π°Π²Π΅Π½Π° Π½ΠΎΠ²Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π·Π° drop_bounds. Π’Π°Π·ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΡΡΠ°Π±ΠΎΡΠ²Π°, ΠΊΠΎΠ³Π°ΡΠΎ ΠΏΠΎΡΡΠ°Π²ΠΈΡΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅: T: Drop β Π·Π° ΠΎΠ±ΠΎΠ±ΡΠ΅Π½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ:
fn foo(x: T) {}ΠΠΌΠ΅ΡΠΎ T: Drop ΡΠ΅ΡΡΠΎ Π΅ Π³ΡΠ΅ΡΠΊΠ°, ΡΡΠΉ ΠΊΠ°ΡΠΎ Π½Π΅Π·Π°Π±Π°Π²Π½ΠΎ ΠΈΠ·ΠΊΠ»ΡΡΠ²Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ ΡΠΈΠΏΠΎΠ²Π΅, ΠΊΠ°ΡΠΎ Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ u8. (ΠΠΎΠ²Π΅ΡΠ΅ Π·Π° ΡΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΡΠΎΡΠ΅ΡΠ΅ΡΠ΅) ΡΡΠΊ)
- ΠΠ½ΠΎΠ³ΠΎ Π½ΠΎΠ²ΠΎΠ²ΡΠ²Π΅Π΄Π΅Π½ΠΈΡ ΠΈ ΠΊΠΎΡΠ΅ΠΊΡΠΈΠΈ Π² Cargo (ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡΡ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ Π·Π° Π΅Π·ΠΈΠΊΠ°), ΠΏΡΠ»Π΅Π½ ΡΠΏΠΈΡΡΠΊ Ρ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: linux.org.ru
