Merge pull request #312 from Tanish-Eagle/edit

Edit
This commit is contained in:
Sunface 2022-10-11 10:16:11 +08:00 committed by GitHub
commit 080495bd2f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 31 additions and 32 deletions

View File

@ -77,7 +77,7 @@ Yeah, `Debug` is simple and easy to use. But sometimes we want to customize the
Unlike `Debug`, there is no way to derive the implementation of the `Display` trait, we have to manually implement it. Unlike `Debug`, there is no way to derive the implementation of the `Display` trait, we have to manually implement it.
Anotherthing to note: the placefolder for `Display` is `{}` not `{:?}`. Another thing to note: the placefolder for `Display` is `{}` not `{:?}`.
4. 🌟🌟 4. 🌟🌟
```rust,editable ```rust,editable
@ -103,16 +103,16 @@ fn main() {
assert_eq!(format!("{}",point), "Display: 3.3 + 7.2i"); assert_eq!(format!("{}",point), "Display: 3.3 + 7.2i");
assert_eq!(format!("{:?}",point), "Debug: Complex { real: 3.3, imag: 7.2 }"); assert_eq!(format!("{:?}",point), "Debug: Complex { real: 3.3, imag: 7.2 }");
println!("Success!") println!("Success!");
} }
``` ```
### `?` operator ### `?` operator
Implementing `fmt::Display` for a structure whose elements must be handled separately is triky. The problem is each `write!` generates a `fmt::Result` which must be handled in the same place. Implementing `fmt::Display` for a structure whose elements must be handled separately is tricky. The problem is each `write!` generates a `fmt::Result` which must be handled in the same place.
Fortunately, Rust provides the `?` operator to help us eliminate some unnecessary codes for deaing with `fmt::Result`. Fortunately, Rust provides the `?` operator to help us eliminate some unnecessary codes for dealing with `fmt::Result`.
5. 🌟🌟 5. 🌟🌟
```rust,editable ```rust,editable
@ -147,7 +147,7 @@ impl fmt::Display for List {
fn main() { fn main() {
let v = List(vec![1, 2, 3]); let v = List(vec![1, 2, 3]);
assert_eq!(format!("{}",v), "[0: 1, 1: 2, 2: 3]"); assert_eq!(format!("{}",v), "[0: 1, 1: 2, 2: 3]");
println!("Success!") println!("Success!");
} }
``` ```

View File

@ -1,4 +1,4 @@
# formating # Formatting
## Positional arguments ## Positional arguments
@ -6,7 +6,7 @@
```rust,editable ```rust,editable
/* Fill in the blanks */ /* Fill in the blanks */
fn main() { fn main() {
println!("{0}, this is {1}. {1}, this is {0}", "Alice", "Bob");// => Alice, this is Bob. Bob, this is Alice println!("{0}, this is {1}. {1}, this is {0}", "Alice", "Bob"); // => Alice, this is Bob. Bob, this is Alice
assert_eq!(format!("{1}{0}", 1, 2), __); assert_eq!(format!("{1}{0}", 1, 2), __);
assert_eq!(format!(__, 1, 2), "2112"); assert_eq!(format!(__, 1, 2), "2112");
println!("Success!"); println!("Success!");
@ -25,10 +25,10 @@ fn main() {
assert_eq!(format!(__,a = "a", b = 'b', c = 3 ), "a 3 b"); assert_eq!(format!(__,a = "a", b = 'b', c = 3 ), "a 3 b");
/* Fix the error */ /* Fix the error */
// named argument must be placed after other arguments // Named argument must be placed after other arguments
println!("{abc} {1}", abc = "def", 2); println!("{abc} {1}", abc = "def", 2);
println!("Success!") println!("Success!");
} }
``` ```
@ -37,7 +37,7 @@ fn main() {
3.🌟🌟 By default, you can pad string with spaces 3.🌟🌟 By default, you can pad string with spaces
```rust,editable ```rust,editable
fn main() { fn main() {
// the following two are padding with 5 spaces // The following two are padding with 5 spaces
println!("Hello {:5}!", "x"); // => "Hello x !" println!("Hello {:5}!", "x"); // => "Hello x !"
println!("Hello {:1$}!", "x", 5); // => "Hello x !" println!("Hello {:1$}!", "x", 5); // => "Hello x !"
@ -45,24 +45,24 @@ fn main() {
assert_eq!(format!("Hello __!", 5, "x"), "Hello x !"); assert_eq!(format!("Hello __!", 5, "x"), "Hello x !");
assert_eq!(format!("Hello __!", "x", width = 5), "Hello x !"); assert_eq!(format!("Hello __!", "x", width = 5), "Hello x !");
println!("Success!") println!("Success!");
} }
``` ```
4.🌟🌟🌟 Left align, right align, pad with specified characters. 4.🌟🌟🌟 Left align, right align, pad with specified characters.
```rust,editable ```rust,editable
fn main() { fn main() {
// left align // Left align
println!("Hello {:<5}!", "x"); // => Hello x ! println!("Hello {:<5}!", "x"); // => Hello x !
// right align // Right align
assert_eq!(format!("Hello __!", "x"), "Hello x!"); assert_eq!(format!("Hello __!", "x"), "Hello x!");
// center align // Center align
assert_eq!(format!("Hello __!", "x"), "Hello x !"); assert_eq!(format!("Hello __!", "x"), "Hello x !");
// left align, pad with '&' // Left align, pad with '&'
assert_eq!(format!("Hello {:&<5}!", "x"), __); assert_eq!(format!("Hello {:&<5}!", "x"), __);
println!("Success!") println!("Success!");
} }
``` ```
@ -78,10 +78,10 @@ fn main() {
assert!(format!("{number:0>width$}", number=1, width=6) == __); assert!(format!("{number:0>width$}", number=1, width=6) == __);
println!("Success!") println!("Success!")
} ;}
``` ```
## precision ## Precision
6.🌟🌟 Floating point precision 6.🌟🌟 Floating point precision
```rust,editable ```rust,editable
@ -95,11 +95,11 @@ fn main() {
assert_eq!(format!("__", v), "+3.14"); assert_eq!(format!("__", v), "+3.14");
assert_eq!(format!("__", v), "3"); assert_eq!(format!("__", v), "3");
println!("Success!") println!("Success!");
} }
``` ```
7.🌟🌟🌟 string length 7.🌟🌟🌟 String length
```rust,editable ```rust,editable
fn main() { fn main() {
let s = "Hello, world!"; let s = "Hello, world!";
@ -108,11 +108,11 @@ fn main() {
assert_eq!(format!("Hello __!", 3, "abcdefg"), "Hello abc!"); assert_eq!(format!("Hello __!", 3, "abcdefg"), "Hello abc!");
println!("Success!") println!("Success!");
} }
``` ```
## binary, octal, hex ## Binary, octal, hex
- format!("{}", foo) -> "3735928559" - format!("{}", foo) -> "3735928559"
- format!("0x{:X}", foo) -> "0xDEADBEEF" - format!("0x{:X}", foo) -> "0xDEADBEEF"
@ -126,15 +126,15 @@ fn main() {
assert_eq!(format!("__", 27), "0x1b"); assert_eq!(format!("__", 27), "0x1b");
assert_eq!(format!("__", 27), "0x1B"); assert_eq!(format!("__", 27), "0x1B");
println!("{:x}!", 27); // hex with no prefix => 1b println!("{:x}!", 27); // Hex with no prefix => 1b
println!("{:#010b}", 27); // pad binary with 0, width = 10, => 0b00011011 println!("{:#010b}", 27); // Pad binary with 0, width = 10, => 0b00011011
println!("Success!") println!("Success!");
} }
``` ```
## Capture the environments ## Capture the environment
9.🌟🌟🌟 9.🌟🌟🌟
```rust,editable ```rust,editable
fn get_person() -> String { fn get_person() -> String {
@ -168,15 +168,15 @@ fn main() {
**Example** **Example**
```rust,editable ```rust,editable
fn main() { fn main() {
// exponent // Exponent
println!("{:2e}", 1000000000); // => 1e9 println!("{:2e}", 1000000000); // => 1e9
println!("{:2E}", 1000000000); // => 1E9 println!("{:2E}", 1000000000); // => 1E9
// pointer address // Pointer address
let v= vec![1, 2, 3]; let v= vec![1, 2, 3];
println!("{:p}", v.as_ptr()); // => 0x600002324050 println!("{:p}", v.as_ptr()); // => 0x600002324050
// escape // Escape
println!("Hello {{}}"); // => Hello {} println!("Hello {{}}"); // => Hello {}
} }
``` ```

View File

@ -1,6 +1,6 @@
# println! and format! # println! and format!
Printing is handled by a series of [`macros`][macros] defined in [`std::fmt`][fmt] Printing is handled by a series of [`macros`][macros] defined in [`std::fmt`][fmt]
some of which include: Some of which include:
* `format!`: write formatted text to [`String`][string] * `format!`: write formatted text to [`String`][string]
* `print!`: same as `format!` but the text is printed to the console (io::stdout). * `print!`: same as `format!` but the text is printed to the console (io::stdout).
@ -8,8 +8,7 @@ some of which include:
* `eprint!`: same as `format!` but the text is printed to the standard error (io::stderr). * `eprint!`: same as `format!` but the text is printed to the standard error (io::stderr).
* `eprintln!`: same as `eprint!`but a newline is appended. * `eprintln!`: same as `eprint!`but a newline is appended.
All parse text in the same fashion. As a plus, Rust checks formatting All parse text in the same fashion. As a plus, Rust checks format correctness at compile time.
correctness at compile time.
## `format!` ## `format!`
1.🌟 1.🌟