Трейт Pointer
Трейт Pointer из модуля std::fmt
позволяет форматировать значения как адреса памяти.
Он используется совместно со спецификатором
{:p} в макросах форматирования,
таких как println!, format! и других.
Трейт реализован для ссылок и сырых указателей,
а также для типов, которые автоматически приводятся
к указателям. Параметров трейт не принимает -
он лишь определяет метод fmt, который
записывает адрес в переданный Formatter.
Синтаксис
use std::fmt;
impl fmt::Pointer for MyType
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result
{
// запись адреса в f
}
}
Пример
Давайте выведем адрес переменной с помощью
спецификатора {:p}:
fn main()
{
let x = 5;
let ptr = &x;
println!("{:p}", ptr);
}
Результат выполнения кода:
0x7ffd5e8a3b4c
Пример
Давайте выведем адрес строкового литерала через сырой указатель:
fn main()
{
let s = "abcde";
let ptr = s.as_ptr();
println!("{:p}", ptr);
}
Результат выполнения кода:
0x55a1f2c3d040
Пример
Давайте реализуем трейт Pointer
для собственной структуры:
use std::fmt;
struct MyStruct
{
value: i32,
}
impl fmt::Pointer for MyStruct
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result
{
let ptr = self as *const MyStruct;
fmt::Pointer::fmt(&ptr, f)
}
}
fn main()
{
let s = MyStruct { value: 10 };
println!("{:p}", &s);
}
Результат выполнения кода:
0x7ffc9a1b2c30