Less confusing placeholder when RefCell is exclusively borrowed

Based on ExpHP's comment in
https://users.rust-lang.org/t/refcell-borrow-mut-get-strange-result/12994

> it would perhaps be nicer if it didn't put something that could be
> misinterpreted as a valid string value

The previous Debug implementation would show:

    RefCell { value: "<borrowed>" }

The new one is:

    RefCell { value: <borrowed> }
This commit is contained in:
David Tolnay 2017-09-21 21:52:59 -07:00
parent 17600c1ea7
commit f9d92d219d
No known key found for this signature in database
GPG key ID: F9BA143B95FF6D82
2 changed files with 23 additions and 1 deletions

View file

@ -1700,8 +1700,18 @@ impl<T: ?Sized + Debug> Debug for RefCell<T> {
.finish()
}
Err(_) => {
// The RefCell is mutably borrowed so we can't look at its value
// here. Show a placeholder instead.
struct BorrowedPlaceholder;
impl Debug for BorrowedPlaceholder {
fn fmt(&self, f: &mut Formatter) -> Result {
f.write_str("<borrowed>")
}
}
f.debug_struct("RefCell")
.field("value", &"<borrowed>")
.field("value", &BorrowedPlaceholder)
.finish()
}
}

View file

@ -13,6 +13,7 @@
#![allow(unused_features)]
#![feature(box_syntax)]
use std::cell::RefCell;
use std::fmt::{self, Write};
use std::usize;
@ -240,6 +241,8 @@ pub fn main() {
// test that trailing commas are acceptable
format!("{}", "test",);
format!("{foo}", foo="test",);
test_refcell();
}
// Basic test to make sure that we can invoke the `write!` macro with an
@ -319,3 +322,12 @@ fn test_once() {
assert_eq!(format!("{0} {0} {0} {a} {a} {a}", foo(), a=foo()),
"1 1 1 2 2 2".to_string());
}
fn test_refcell() {
let refcell = RefCell::new(5);
assert_eq!(format!("{:?}", refcell), "RefCell { value: 5 }");
let borrow = refcell.borrow_mut();
assert_eq!(format!("{:?}", refcell), "RefCell { value: <borrowed> }");
drop(borrow);
assert_eq!(format!("{:?}", refcell), "RefCell { value: 5 }");
}