日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

26.PhantomData幽灵数据.rs

發布時間:2024/4/11 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。