26.PhantomData幽灵数据.rs
生活随笔
收集整理的這篇文章主要介紹了
26.PhantomData幽灵数据.rs
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
/*
它在標準庫中的定義如下:
#[lang = "phantom_data"]
#[stable(feature = "rust1", since = "1.0.0")]
pub struct PhantomData<T: ?Sized>;
可以到它只是一個不占用任何空間的單元結構體,#[lang = "phantom_data"], 也表明了它是一個語言項,供 Rust 編譯器本身使用。https://blog.csdn.net/wowotuo/article/details/93138295
https://learnku.com/docs/nomicon/2018/310-phantom-data/4721
https://www.yuque.com/zmant/blog/vi9k0p*/use std::marker::PhantomData;
use std::mem;// struct Slice<'a, T> {
// start: *const T,
// end: *const T,
// }struct Slice<'a, T: 'a> {start: *const T,end: *const T,phantom: PhantomData<&'a T>,
}fn borrow_vec<'a, T>(vec: &'a Vec<T>) -> Slice<'a, T> {let ptr = vec.as_ptr();Slice {start: ptr,end: unsafe { ptr.add(vec.len()) },phantom: PhantomData,}
}/*
pub struct Context<'a> {waker: &'a Waker,_marker: PhantomData<fn(&'a ()) -> &'a ()>,
}impl<'a> Context<'a> {/// Create a new `Context` from a `&Waker`.#[inline]pub fn from_waker(waker: &'a Waker) -> Self {Context {waker,_marker: PhantomData,}}
}
*/// 還可用于對未使用的參數類型身上,比如下面的代碼中就存在一個無界的類型參數,是編譯不過的:
// struct UnUsedSomeType<T, E> {
// value: T,
// }//這種未使用的參數類型的情況可能在與其他語言交互的時候可能會遇到,正確做法同樣是需要使用 PhantomData<E> 標記?下。
struct UnUsedSomeType<T, E> {value: T,_mark: PhantomData<E>,
}//---------------------------------------------------
struct MyCell<T> {value: T,
}impl<T: Copy> MyCell<T> {fn new(value: T) -> Self {MyCell { value }}fn get(&self) -> T {self.value}fn set(&self, value: T) {unsafe {std::ptr::write(&self.value as *const _ as *mut _, value);}}
}fn main() {let val = String::from("hello");let cell = MyCell::new(&val);println!("cell value={}", cell.get());let val2 = String::from("world");println!("---------------------------------------------------------------");//但如果我們按下?的?式使?,代碼還是可以正常編譯,但是運?起來之后就發現結果是未定義的。let val = String::from("hello"); // 'a: line2 ~ line9let cell = MyCell::new( &val ); // 'b: line3 ~ line9{let val2 = String::from("hi"); // 'c: line5 ~ line7cell.set( &val2 ); // 這里期待 cell 的類型是 MyCell<&'c String>}println!("cell value={}", cell.get());
}
?
總結
以上是生活随笔為你收集整理的26.PhantomData幽灵数据.rs的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 25.智能指针.rs
- 下一篇: 27.泛型generics.rs