diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..e4b8f74 Binary files /dev/null and b/.DS_Store differ diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 925e68f..ddb2070 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -34,6 +34,8 @@ - [HashMap](collections/hashmap.md) - [Type Conversion](type-conversions/intro.md) - [as](type-conversions/as.md) + - [From/Into](type-conversions/from-into.md) + - [Others](type-conversions/others.md) - [Result and panic todo](result-panic/intro.md) - [panic!](result-panic/panic.md) - [result and ?](result-panic/result.md) diff --git a/src/about.md b/src/about.md new file mode 100644 index 0000000..65054b7 --- /dev/null +++ b/src/about.md @@ -0,0 +1 @@ +# Rust By Practice diff --git a/src/type-conversions/from-into.md b/src/type-conversions/from-into.md new file mode 100644 index 0000000..fef65e6 --- /dev/null +++ b/src/type-conversions/from-into.md @@ -0,0 +1 @@ +# From/Into diff --git a/src/type-conversions/others.md b/src/type-conversions/others.md new file mode 100644 index 0000000..0d2e048 --- /dev/null +++ b/src/type-conversions/others.md @@ -0,0 +1 @@ +# Others diff --git a/zh-CN/.DS_Store b/zh-CN/.DS_Store new file mode 100644 index 0000000..5172429 Binary files /dev/null and b/zh-CN/.DS_Store differ diff --git a/zh-CN/src/.DS_Store b/zh-CN/src/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/zh-CN/src/.DS_Store differ diff --git a/zh-CN/src/SUMMARY.md b/zh-CN/src/SUMMARY.md index 55cf5fe..dbff8e8 100644 --- a/zh-CN/src/SUMMARY.md +++ b/zh-CN/src/SUMMARY.md @@ -32,7 +32,10 @@ - [动态字符串 String](collections/String.md) - [动态数组 Vector](collections/vector.md) - [KV 存储 HashMap](collections/hashmap.md) -- [类型转换 todo](type-conversion.md) +- [类型转换](type-conversions/intro.md) + - [as](type-conversions/as.md) + - [From/Into](type-conversions/from-into.md) + - [Others](type-conversions/others.md) - [返回值和 panic! todo](result-panic/intro.md) - [panic! 深入剖析](result-panic/panic.md) - [返回值result 和 ?](result-panic/result.md) diff --git a/zh-CN/src/about.md b/zh-CN/src/about.md new file mode 100644 index 0000000..dc37056 --- /dev/null +++ b/zh-CN/src/about.md @@ -0,0 +1 @@ +# 关于 pracitce.rs diff --git a/zh-CN/src/type-conversion.md b/zh-CN/src/type-conversion.md deleted file mode 100644 index 7b930e5..0000000 --- a/zh-CN/src/type-conversion.md +++ /dev/null @@ -1 +0,0 @@ -# Type Conversion diff --git a/zh-CN/src/type-conversions/as.md b/zh-CN/src/type-conversions/as.md new file mode 100644 index 0000000..2eae718 --- /dev/null +++ b/zh-CN/src/type-conversions/as.md @@ -0,0 +1,103 @@ +# Type Conversions +Rust provides no implicit type conversion(coercion) between primitive types. But explicit type conversions can be performed using the `as` keyword. + +1. 🌟 +```rust,editable +// FIX the errors and FILL in the blank +// DON'T remove any code +fn main() { + let decimal = 97.123_f32; + + let integer: __ = decimal as u8; + + let c1: char = decimal as char; + let c2 = integer as char; + + assert_eq!(integer, 'b' as u8); + + println!("Success!") +} +``` + +2. 🌟🌟 By default, overflow will cause compile errors, but we can add an global annotation to suppress these errors. +```rust,editable +fn main() { + assert_eq!(u8::MAX, 255); + // the max of `u8` is 255 as shown above. + // so the below code will cause an overflow error: literal out of range for `u8`. + // PLEASE looking for clues within compile errors to FIX it. + // DON'T modify any code in main. + let v = 1000 as u8; + + println!("Success!") +} +``` + +3. 🌟🌟 when casting any value to an unsigned type `T`, `T::MAX + 1` is added or subtracted until the value fits into the new type. +```rust,editable +fn main() { + assert_eq!(1000 as u16, __); + + assert_eq!(1000 as u8, __); + + // For positive numbers, this is the same as the modulus + println!("1000 mod 256 is : {}", 1000 % 256); + + assert_eq!(-1_i8 as u8, __); + + // Since Rust 1.45, the `as` keyword performs a *saturating cast* + // when casting from float to int. If the floating point value exceeds + // the upper bound or is less than the lower bound, the returned value + // will be equal to the bound crossed. + assert_eq!(300.1_f32 as u8, __); + assert_eq!(-100.1_f32 as u8, __); + + + // This behavior incurs a small runtime cost and can be avoided + // with unsafe methods, however the results might overflow and + // return **unsound values**. Use these methods wisely: + unsafe { + // 300.0 is 44 + println!("300.0 is {}", 300.0_f32.to_int_unchecked::()); + // -100.0 as u8 is 156 + println!("-100.0 as u8 is {}", (-100.0_f32).to_int_unchecked::()); + // nan as u8 is 0 + println!("nan as u8 is {}", f32::NAN.to_int_unchecked::()); + } +} +``` + +4. 🌟🌟🌟 Raw pointer can be converted to memory address (integer) and vice versa +```rust,editable + +// FILL in the blanks +fn main() { + let mut values: [i32; 2] = [1, 2]; + let p1: *mut i32 = values.as_mut_ptr(); + let first_address: usize = p1 __; + let second_address = first_address + 4; // 4 == std::mem::size_of::() + let p2: *mut i32 = second_address __; // p2 points to the 2nd element in values + unsafe { + // add one to the second element + __ + } + + assert_eq!(values[1], 3); + + println!("Success!") +} +``` + + +5. 🌟🌟🌟 +```rust,editable +fn main() { + let arr :[u64; 13] = [0; 13]; + assert_eq!(std::mem::size_of_val(&arr), 8 * 13); + let a: *const [u64] = &arr; + let b = a as *const [u8]; + unsafe { + assert_eq!(std::mem::size_of_val(&*b), __) + } +} +``` diff --git a/zh-CN/src/type-conversions/from-into.md b/zh-CN/src/type-conversions/from-into.md new file mode 100644 index 0000000..fef65e6 --- /dev/null +++ b/zh-CN/src/type-conversions/from-into.md @@ -0,0 +1 @@ +# From/Into diff --git a/zh-CN/src/type-conversions/intro.md b/zh-CN/src/type-conversions/intro.md new file mode 100644 index 0000000..b2f15f9 --- /dev/null +++ b/zh-CN/src/type-conversions/intro.md @@ -0,0 +1,2 @@ +# Type conversions +There are several ways we can use to perform type conversions, such as `as`, `From/Intro`, `TryFrom/TryInto`, `transmute` etc. diff --git a/zh-CN/src/type-conversions/others.md b/zh-CN/src/type-conversions/others.md new file mode 100644 index 0000000..0d2e048 --- /dev/null +++ b/zh-CN/src/type-conversions/others.md @@ -0,0 +1 @@ +# Others