mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-11-04 06:56:14 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			90 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
// run-pass
 | 
						|
 | 
						|
fn main() {
 | 
						|
    named_argument_takes_precedence_to_captured();
 | 
						|
    formatting_parameters_can_be_captured();
 | 
						|
    capture_raw_strings_and_idents();
 | 
						|
    repeated_capture();
 | 
						|
 | 
						|
    #[cfg(panic = "unwind")]
 | 
						|
    {
 | 
						|
        panic_with_single_argument_does_not_get_formatted();
 | 
						|
        panic_with_multiple_arguments_is_formatted();
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
fn named_argument_takes_precedence_to_captured() {
 | 
						|
    let foo = "captured";
 | 
						|
    let s = format!("{foo}", foo = "named");
 | 
						|
    assert_eq!(&s, "named");
 | 
						|
 | 
						|
    let s = format!("{foo}-{foo}-{foo}", foo = "named");
 | 
						|
    assert_eq!(&s, "named-named-named");
 | 
						|
 | 
						|
    let s = format!("{}-{bar}-{foo}", "positional", bar = "named");
 | 
						|
    assert_eq!(&s, "positional-named-captured");
 | 
						|
}
 | 
						|
 | 
						|
fn capture_raw_strings_and_idents() {
 | 
						|
    let r#type = "apple";
 | 
						|
    let s = format!(r#"The fruit is an {type}"#);
 | 
						|
    assert_eq!(&s, "The fruit is an apple");
 | 
						|
 | 
						|
    let r#type = "orange";
 | 
						|
    let s = format!(r"The fruit is an {type}");
 | 
						|
    assert_eq!(&s, "The fruit is an orange");
 | 
						|
}
 | 
						|
 | 
						|
#[cfg(panic = "unwind")]
 | 
						|
fn panic_with_single_argument_does_not_get_formatted() {
 | 
						|
    // panic! with a single argument does not perform string formatting.
 | 
						|
    // RFC #2795 suggests that this may need to change so that captured arguments are formatted.
 | 
						|
    // For stability reasons this will need to part of an edition change.
 | 
						|
 | 
						|
    #[allow(non_fmt_panics)]
 | 
						|
    let msg = std::panic::catch_unwind(|| {
 | 
						|
        panic!("{foo}");
 | 
						|
    })
 | 
						|
    .unwrap_err();
 | 
						|
 | 
						|
    assert_eq!(msg.downcast_ref::<&str>(), Some(&"{foo}"))
 | 
						|
}
 | 
						|
 | 
						|
#[cfg(panic = "unwind")]
 | 
						|
fn panic_with_multiple_arguments_is_formatted() {
 | 
						|
    let foo = "captured";
 | 
						|
 | 
						|
    let msg = std::panic::catch_unwind(|| {
 | 
						|
        panic!("{}-{bar}-{foo}", "positional", bar = "named");
 | 
						|
    })
 | 
						|
    .unwrap_err();
 | 
						|
 | 
						|
    assert_eq!(msg.downcast_ref::<String>(), Some(&"positional-named-captured".to_string()))
 | 
						|
}
 | 
						|
 | 
						|
fn formatting_parameters_can_be_captured() {
 | 
						|
    let width = 9;
 | 
						|
    let precision = 3;
 | 
						|
 | 
						|
    let x = 7.0;
 | 
						|
 | 
						|
    let s = format!("{x:width$}");
 | 
						|
    assert_eq!(&s, "        7");
 | 
						|
 | 
						|
    let s = format!("{x:<width$}");
 | 
						|
    assert_eq!(&s, "7        ");
 | 
						|
 | 
						|
    let s = format!("{x:-^width$}");
 | 
						|
    assert_eq!(&s, "----7----");
 | 
						|
 | 
						|
    let s = format!("{x:-^width$.precision$}");
 | 
						|
    assert_eq!(&s, "--7.000--");
 | 
						|
}
 | 
						|
 | 
						|
fn repeated_capture() {
 | 
						|
    let a = 1;
 | 
						|
    let b = 2;
 | 
						|
    let s = format!("{a} {b} {a}");
 | 
						|
    assert_eq!(&s, "1 2 1");
 | 
						|
}
 |