ΠΠΎΠΌΠ°Π½Π΄Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² Rust ΡΠ°Π΄Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΡ Π½ΠΎΠ²ΡΡ Π²Π΅ΡΡΠΈΡ ΡΠ²ΠΎΠ΅Π³ΠΎ ΡΠ·ΡΠΊΠ°: 1.35. Rust — ΡΡΠΎ ΡΠ·ΡΠΊ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠΈΡΠ°ΡΡ Π½Π°Π΄ΡΠΆΠ½ΡΠ΅ ΠΈ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ.
ΠΡΠ»ΠΈ Ρ Π²Π°Ρ ΡΠΆΠ΅ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ Rust ΡΠ΅ΡΠ΅Π· rustup,ΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:
$ rustup update stable
ΠΠ»Π°Π²Π½ΠΎΠ΅ Π² ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ — ΡΡΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠΈΡ ΡΡΠ΅ΠΉΡΠΎΠ² Π·Π°ΠΌΡΠΊΠ°Π½ΠΈΡ Fn, FnOnce, FnMut, Π΄Π»Ρ Box<dyn Fn>, Box<dyn FnOnce>, Box<dyn FnMut>, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ. ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡΡ Π·Π°ΠΌΡΠΊΠ°Π½ΠΈΡ ΠΊ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΡΠΌ Π½Π° Π½Π΅Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ, Π²ΡΠ·ΠΎΠ² ΠΌΠ°ΠΊΡΠΎΡΠ° dbg!() ΡΠ΅ΠΏΠ΅ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ Π±Π΅Π· Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ², Π±ΡΠ»Π° ΠΏΡΠΎΠ²Π΅Π΄Π΅Π½Π° ΡΡΠ°Π±ΠΈΠ»ΠΈΠ·Π°ΡΠΈΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ.
Π Π΄Π΅ΡΠ°Π»ΡΠΌ:
- Π Π½ΠΎΠ²ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΡΠ΅ΠΉΡΠΎΠ² Fn, FnOnce, FnMut, Π΄Π»Ρ Box<dyn Fn>, Box<dyn FnOnce>, Box<dyn FnMut>, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ.
Π’Π΅ΠΏΠ΅ΡΡ ΡΠ°ΠΊΠΎΠΉ ΠΊΠΎΠ΄ Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ:
fn foo(x: Box<dyn Fn(u8) -> u8>) -> Vec<u8> {
vec![1, 2, 3, 4].into_iter().map(x).collect()
}Π’Π°ΠΊΠΆΠ΅, ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠ·ΡΠ²Π°ΡΡ Π·Π°ΠΌΡΠΊΠ°Π½ΠΈΠ΅ ΠΏΡΡΠΌΠΎ ΠΈΠ· Box<dyn FnOnce>:
fn foo(x: Box<dyn FnOnce()>) {
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!("Five is included in zero to ten.");
}
} - ΠΠΎΠ»Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ ΡΡΠ°Π±ΠΈΠ»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ API Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π½Π°ΠΉΡΠΈ ΡΡΡ
- ΠΠΎΠ²ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ Π΄Π»Ρ f32 ΠΈ f64:
- Π ΡΡΠΎΠΌ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ, Π² Clippy (ΠΡΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ Π²Π°Ρ ΠΊΠΎΠ΄ Π½Π° Π½Π°Π»ΠΈΡΠΈΠ΅ ΠΌΠ½ΠΎΠ³ΠΈΡ
ΠΎΡΠΈΠ±ΠΎΠΊ) Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Π½ΠΎΠ²ΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΡ Π΄Π»Ρ drop_bounds. ΠΡΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΡΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ, ΠΊΠΎΠ³Π΄Π° Π²Ρ ΡΡΠ°Π²ΠΈΡΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΠ΅ΡΠ΅Π½ΠΈΠ΅: T: Drop — Π΄Π»Ρ ΠΎΠ±ΠΎΠ±ΡΠ΅Π½Π½ΡΡ
ΡΡΠ½ΠΊΡΠΈΠΈ:
fn foo<T: Drop>(x: T) {}ΠΠΌΠ΅ΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ T: Drop ΡΠ°ΡΠ΅ Π²ΡΠ΅Π³ΠΎ ΡΠ²Π»ΡΠ΅ΡΡΡΡ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΡΡΠ°Π·Ρ ΠΈΡΠΊΠ»ΡΡΠ°ΡΡΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΈΠΏΡ ΠΊΠ°ΠΊ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, u8.(ΠΠΎΠ»ΡΡΠ΅ ΠΎΠ± ΡΡΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΈΡΠ°ΡΡ ΡΡΡ)
- ΠΡΠ΅Π½Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ»ΡΡΡΠ΅Π½ΠΎ ΠΈ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΎ Π² Cargo (ΠΏΠ°ΠΊΠ΅ΡΠ½ΡΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ ΡΠ·ΡΠΊΠ°), ΠΏΠΎΠ»Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ
ΠΡΡΠΎΡΠ½ΠΈΠΊ: linux.org.ru