Trait std::fmt::Debug 1.0.0[−][src]
Expand description
?
格式。
Debug
应该在面向程序员的调试上下文中格式化输出。
一般来说,您应该只将 derive
和 Debug
实现。
当与备用格式说明符 #?
一起使用时,输出将被漂亮地打印。
有关格式化程序的更多信息,请参见 模块级文档。
如果所有字段都实现 Debug
,则此 trait 可以与 #[derive]
一起使用。当为结构体 derived' 时,它将使用
struct的名称,然后是
{,然后是每个字段名称和
Debug值的逗号分隔列表,然后是
}。 对于
enum,它将使用变体的名称,如果适用,将使用
(,然后是字段的
Debug值,然后是
)`。
Stability
派生的 Debug
格式不稳定,因此 future Rust 版本可能会更改。此外,标准库提供的类型 (libstd
,libcore
,liballoc
等) 的 Debug
实现不稳定,并且可能随 future Rust 版本而改变。
Examples
派生实现:
#[derive(Debug)]
struct Point {
x: i32,
y: i32,
}
let origin = Point { x: 0, y: 0 };
assert_eq!(format!("The origin is: {:?}", origin), "The origin is: Point { x: 0, y: 0 }");
Run手动实现:
use std::fmt;
struct Point {
x: i32,
y: i32,
}
impl fmt::Debug for Point {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("Point")
.field("x", &self.x)
.field("y", &self.y)
.finish()
}
}
let origin = Point { x: 0, y: 0 };
assert_eq!(format!("The origin is: {:?}", origin), "The origin is: Point { x: 0, y: 0 }");
RunFormatter
结构体上有许多辅助方法可以帮助您实现手动实现,例如 debug_struct
。
不希望使用 Formatter
trait (debug_struct
, debug_tuple
, debut_list
, debug_set
, debug_map
) 提供的标准调试表示套件的类型可以通过手动将任意表示写入 Formatter
来执行完全自定义的操作。
impl fmt::Debug for Point {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "Point [{} {}]", self.x, self.y)
}
}
Run使用 derive
或 Formatter
上的调试构建器 API 的 Debug
实现支持使用备用标志 {:#?}
的漂亮打印。
使用 #?
进行漂亮的打印:
#[derive(Debug)]
struct Point {
x: i32,
y: i32,
}
let origin = Point { x: 0, y: 0 };
assert_eq!(format!("The origin is: {:#?}", origin),
"The origin is: Point {
x: 0,
y: 0,
}");
RunRequired methods
使用给定的格式化程序格式化该值。
Examples
use std::fmt;
struct Position {
longitude: f32,
latitude: f32,
}
impl fmt::Debug for Position {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_tuple("")
.field(&self.longitude)
.field(&self.latitude)
.finish()
}
}
let position = Position { longitude: 1.987, latitude: 2.983 };
assert_eq!(format!("{:?}", position), "(1.987, 2.983)");
assert_eq!(format!("{:#?}", position), "(
1.987,
2.983,
)");
RunImplementations on Foreign Types
Implementors
impl Debug for AncillaryError
This is supported on (Android or DragonFly BSD or Emscripten or FreeBSD or Linux or NetBSD or OpenBSD) and Unix only.
1.12.0[src]
impl<'_, K, V> Debug for std::collections::btree_map::Entry<'_, K, V> where
K: Debug + Ord,
V: Debug,
1.17.0[src]
impl<'_, K, V> Debug for std::collections::btree_map::Iter<'_, K, V> where
K: Debug,
V: Debug,
1.17.0[src]
impl<'_, K, V> Debug for std::collections::btree_map::IterMut<'_, K, V> where
K: Debug,
V: Debug,
1.12.0[src]
impl<'_, K, V> Debug for std::collections::btree_map::OccupiedEntry<'_, K, V> where
K: Debug + Ord,
V: Debug,
impl<'_, K, V> Debug for std::collections::btree_map::OccupiedError<'_, K, V> where
K: Debug + Ord,
V: Debug,
1.17.0[src]
impl<'_, K, V> Debug for std::collections::btree_map::Range<'_, K, V> where
K: Debug,
V: Debug,
1.12.0[src]
impl<'_, K, V> Debug for std::collections::btree_map::VacantEntry<'_, K, V> where
K: Debug + Ord,
1.10.0[src]
impl<'_, K, V> Debug for std::collections::btree_map::ValuesMut<'_, K, V> where
V: Debug,
impl<'_, K, V, F> Debug for std::collections::btree_map::DrainFilter<'_, K, V, F> where
K: Debug,
V: Debug,
F: FnMut(&K, &mut V) -> bool,
1.17.0[src]
impl<'_, T> Debug for std::collections::btree_set::SymmetricDifference<'_, T> where
T: Debug,
1.17.0[src]
impl<'_, T, A> Debug for std::collections::vec_deque::Drain<'_, T, A> where
T: Debug,
A: Allocator,
impl<'_, T, F> Debug for std::collections::btree_set::DrainFilter<'_, T, F> where
T: Debug,
F: FnMut(&T) -> bool,
impl<'_, T, F> Debug for std::collections::linked_list::DrainFilter<'_, T, F> where
T: Debug,
F: FnMut(&mut T) -> bool,
1.27.0[src]
impl<'_, T, P> Debug for std::slice::RSplit<'_, T, P> where
T: Debug,
P: FnMut(&T) -> bool,
1.9.0[src]
impl<'_, T, P> Debug for std::slice::RSplitN<'_, T, P> where
T: Debug,
P: FnMut(&T) -> bool,
1.9.0[src]
impl<'_, T, P> Debug for std::slice::Split<'_, T, P> where
T: Debug,
P: FnMut(&T) -> bool,
1.51.0[src]
impl<'_, T, P> Debug for std::slice::SplitInclusive<'_, T, P> where
T: Debug,
P: FnMut(&T) -> bool,
1.51.0[src]
impl<'_, T, P> Debug for SplitInclusiveMut<'_, T, P> where
T: Debug,
P: FnMut(&T) -> bool,
1.9.0[src]
impl<'_, T, P> Debug for std::slice::SplitN<'_, T, P> where
T: Debug,
P: FnMut(&T) -> bool,
impl<'a> Debug for SocketAncillary<'a>
This is supported on (Android or DragonFly BSD or Emscripten or FreeBSD or Linux or NetBSD or OpenBSD) and Unix only.
1.21.0[src]
impl<'a, I, A> Debug for Splice<'a, I, A> where
I: 'a + Debug + Iterator,
A: 'a + Debug + Allocator,
<I as Iterator>::Item: Debug,
impl<'a, K, F> Debug for std::collections::hash_set::DrainFilter<'a, K, F> where
F: FnMut(&K) -> bool,
impl<'a, K, V, F> Debug for std::collections::hash_map::DrainFilter<'a, K, V, F> where
F: FnMut(&K, &mut V) -> bool,
1.5.0[src]
impl<'a, P> Debug for MatchIndices<'a, P> where
P: Pattern<'a>,
<P as Pattern<'a>>::Searcher: Debug,
1.2.0[src]
impl<'a, P> Debug for Matches<'a, P> where
P: Pattern<'a>,
<P as Pattern<'a>>::Searcher: Debug,
1.5.0[src]
impl<'a, P> Debug for RMatchIndices<'a, P> where
P: Pattern<'a>,
<P as Pattern<'a>>::Searcher: Debug,
1.2.0[src]
impl<'a, P> Debug for RMatches<'a, P> where
P: Pattern<'a>,
<P as Pattern<'a>>::Searcher: Debug,
impl<'a, P> Debug for std::str::RSplit<'a, P> where
P: Pattern<'a>,
<P as Pattern<'a>>::Searcher: Debug,
impl<'a, P> Debug for std::str::RSplitN<'a, P> where
P: Pattern<'a>,
<P as Pattern<'a>>::Searcher: Debug,
impl<'a, P> Debug for RSplitTerminator<'a, P> where
P: Pattern<'a>,
<P as Pattern<'a>>::Searcher: Debug,
impl<'a, P> Debug for std::str::Split<'a, P> where
P: Pattern<'a>,
<P as Pattern<'a>>::Searcher: Debug,
1.51.0[src]
impl<'a, P> Debug for std::str::SplitInclusive<'a, P> where
P: Pattern<'a>,
<P as Pattern<'a>>::Searcher: Debug,
impl<'a, P> Debug for std::str::SplitN<'a, P> where
P: Pattern<'a>,
<P as Pattern<'a>>::Searcher: Debug,
impl<'a, P> Debug for SplitTerminator<'a, P> where
P: Pattern<'a>,
<P as Pattern<'a>>::Searcher: Debug,
impl<'a, T, F, A> Debug for std::vec::DrainFilter<'a, T, F, A> where
T: Debug,
F: Debug + FnMut(&mut T) -> bool,
A: Debug + Allocator,
impl<I> Debug for Intersperse<I> where
I: Debug + Iterator,
<I as Iterator>::Item: Clone,
<I as Iterator>::Item: Debug,
impl<I, G> Debug for IntersperseWith<I, G> where
I: Iterator + Debug,
G: Debug,
<I as Iterator>::Item: Debug,
1.29.0[src]
impl<I, U> Debug for Flatten<I> where
I: Debug + Iterator,
U: Debug + Iterator,
<I as Iterator>::Item: IntoIterator,
<<I as Iterator>::Item as IntoIterator>::IntoIter == U,
<<I as Iterator>::Item as IntoIterator>::Item == <U as Iterator>::Item,
1.9.0[src]
impl<I, U, F> Debug for FlatMap<I, U, F> where
I: Debug,
U: IntoIterator,
<U as IntoIterator>::IntoIter: Debug,
1.17.0[src]
impl<K, V> Debug for std::collections::btree_map::IntoIter<K, V> where
K: Debug,
V: Debug,
1.16.0[src]
impl<K, V> Debug for std::collections::hash_map::Drain<'_, K, V> where
K: Debug,
V: Debug,
1.16.0[src]
impl<K, V> Debug for std::collections::hash_map::IterMut<'_, K, V> where
K: Debug,
V: Debug,
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G> Debug for unsafe extern "C" fn(A, B, C, D, E, F, G, ...) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H> Debug for extern "C" fn(A, B, C, D, E, F, G, H, ...) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H> Debug for unsafe extern "C" fn(A, B, C, D, E, F, G, H) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H> Debug for unsafe extern "C" fn(A, B, C, D, E, F, G, H, ...) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H, I> Debug for extern "C" fn(A, B, C, D, E, F, G, H, I) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H, I> Debug for extern "C" fn(A, B, C, D, E, F, G, H, I, ...) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H, I> Debug for unsafe fn(A, B, C, D, E, F, G, H, I) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H, I> Debug for unsafe extern "C" fn(A, B, C, D, E, F, G, H, I) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H, I> Debug for unsafe extern "C" fn(A, B, C, D, E, F, G, H, I, ...) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H, I, J> Debug for extern "C" fn(A, B, C, D, E, F, G, H, I, J) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H, I, J> Debug for extern "C" fn(A, B, C, D, E, F, G, H, I, J, ...) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H, I, J> Debug for unsafe fn(A, B, C, D, E, F, G, H, I, J) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H, I, J> Debug for unsafe extern "C" fn(A, B, C, D, E, F, G, H, I, J) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H, I, J> Debug for unsafe extern "C" fn(A, B, C, D, E, F, G, H, I, J, ...) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H, I, J, K> Debug for fn(A, B, C, D, E, F, G, H, I, J, K) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H, I, J, K> Debug for extern "C" fn(A, B, C, D, E, F, G, H, I, J, K) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H, I, J, K> Debug for extern "C" fn(A, B, C, D, E, F, G, H, I, J, K, ...) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H, I, J, K> Debug for unsafe fn(A, B, C, D, E, F, G, H, I, J, K) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H, I, J, K> Debug for unsafe extern "C" fn(A, B, C, D, E, F, G, H, I, J, K) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H, I, J, K> Debug for unsafe extern "C" fn(A, B, C, D, E, F, G, H, I, J, K, ...) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H, I, J, K, L> Debug for fn(A, B, C, D, E, F, G, H, I, J, K, L) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H, I, J, K, L> Debug for extern "C" fn(A, B, C, D, E, F, G, H, I, J, K, L) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H, I, J, K, L> Debug for extern "C" fn(A, B, C, D, E, F, G, H, I, J, K, L, ...) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H, I, J, K, L> Debug for unsafe fn(A, B, C, D, E, F, G, H, I, J, K, L) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H, I, J, K, L> Debug for unsafe extern "C" fn(A, B, C, D, E, F, G, H, I, J, K, L) -> Ret
1.4.0[src]
impl<Ret, A, B, C, D, E, F, G, H, I, J, K, L> Debug for unsafe extern "C" fn(A, B, C, D, E, F, G, H, I, J, K, L, ...) -> Ret
impl<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Debug for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) where
T0: Debug,
T1: Debug,
T2: Debug,
T3: Debug,
T4: Debug,
T5: Debug,
T6: Debug,
T7: Debug,
T8: Debug,
T9: Debug,
T10: Debug,
T11: Debug + ?Sized,
impl<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Debug for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) where
T1: Debug,
T2: Debug,
T3: Debug,
T4: Debug,
T5: Debug,
T6: Debug,
T7: Debug,
T8: Debug,
T9: Debug,
T10: Debug,
T11: Debug + ?Sized,
impl<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Debug for (T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) where
T2: Debug,
T3: Debug,
T4: Debug,
T5: Debug,
T6: Debug,
T7: Debug,
T8: Debug,
T9: Debug,
T10: Debug,
T11: Debug + ?Sized,
impl<T3, T4, T5, T6, T7, T8, T9, T10, T11> Debug for (T3, T4, T5, T6, T7, T8, T9, T10, T11) where
T3: Debug,
T4: Debug,
T5: Debug,
T6: Debug,
T7: Debug,
T8: Debug,
T9: Debug,
T10: Debug,
T11: Debug + ?Sized,
impl<T4, T5, T6, T7, T8, T9, T10, T11> Debug for (T4, T5, T6, T7, T8, T9, T10, T11) where
T4: Debug,
T5: Debug,
T6: Debug,
T7: Debug,
T8: Debug,
T9: Debug,
T10: Debug,
T11: Debug + ?Sized,
impl<T5, T6, T7, T8, T9, T10, T11> Debug for (T5, T6, T7, T8, T9, T10, T11) where
T5: Debug,
T6: Debug,
T7: Debug,
T8: Debug,
T9: Debug,
T10: Debug,
T11: Debug + ?Sized,
impl<T6, T7, T8, T9, T10, T11> Debug for (T6, T7, T8, T9, T10, T11) where
T6: Debug,
T7: Debug,
T8: Debug,
T9: Debug,
T10: Debug,
T11: Debug + ?Sized,
impl<T7, T8, T9, T10, T11> Debug for (T7, T8, T9, T10, T11) where
T7: Debug,
T8: Debug,
T9: Debug,
T10: Debug,
T11: Debug + ?Sized,
impl<T8, T9, T10, T11> Debug for (T8, T9, T10, T11) where
T8: Debug,
T9: Debug,
T10: Debug,
T11: Debug + ?Sized,
1.17.0[src]
impl<T, A> Debug for std::collections::vec_deque::IntoIter<T, A> where
T: Debug,
A: Allocator,
1.16.0[src]
impl<T, S> Debug for std::collections::hash_set::Difference<'_, T, S> where
T: Debug + Eq + Hash,
S: BuildHasher,
1.16.0[src]
impl<T, S> Debug for std::collections::hash_set::Intersection<'_, T, S> where
T: Debug + Eq + Hash,
S: BuildHasher,
1.16.0[src]
impl<T, S> Debug for std::collections::hash_set::SymmetricDifference<'_, T, S> where
T: Debug + Eq + Hash,
S: BuildHasher,
1.16.0[src]