A trait for any slice, with item as an associated type.
use slice_trait::*; let a: &[i32] = [1, 2, 3].as_slice(); fn first<'a, S: Slice + ?Sized>(slice: &'a S) -> Option<&'a S::Item> where S::Item: Copy, { slice.as_slice().first() } assert_eq!(first(a), Some(&1));