사람들이 포인터와 물건을 가지고 제기 한 문제를 고려해 볼 때, 가장 좋은 방법은, IMHO,이 작업을 수행하는 것은 :
fn index_of_unchecked<T>(slice: &[T], item: &T) -> usize {
if ::std::mem::size_of::<T>() == 0 {
return 0; // do what you will with this case
}
(item as *const _ as usize - slice.as_ptr() as usize)
/std::mem::size_of::<T>()
}
// note: for zero sized types here, you
// return Some(0) if item as *const T == slice.as_ptr()
// and None otherwise
fn index_of<T>(slice: &[T], item: &T) -> Option<usize> {
let ptr = item as *const T;
if
slice.as_ptr() < ptr &&
slice.as_ptr().offset(slice.len()) > ptr
{
Some(index_of_unchecked(slice, item))
} else {
None
}
}
당신이 방법을 원하는 경우, 비록 :
trait IndexOfExt<T> {
fn index_of_unchecked(&self, item: &T) -> usize;
fn index_of(&self, item: &T) -> Option<usize>;
}
impl<T> IndexOfExt<T> for [T] {
fn index_of_unchecked(&self, item: &T) -> usize {
// ...
}
fn index_of(&self, item: &T) -> Option<usize> {
// ...
}
}
을 한 다음에 모든 유형이 Deref
들이 방법을 사용할 수 있습니다 [T]
이것은 [[& str] 사이의 바이트 오프셋을 얻는 방법]과 유사합니다 (https://stackoverflow.com/questions/38268529/how-to-get-the-byte-offset-between-str) * 대답은 "단지'usize'로 변환됩니다." – mcarton