How to get the byte offset between `&str`

but it turns out that Sub is not implemented on raw pointers.

You can convert the pointer to a usize to do math on it:

fn main() {
    let source = "hello, world";
    let a = &source[1..];
    let b = &source[5..];
    let diff =  b.as_ptr() as usize - a.as_ptr() as usize;
    println!("{}", diff);
}

There's also the unstable method offset_from:

#![feature(ptr_offset_from)]

fn main() {
    let source = "hello, world";
    let a = &source[1..];
    let b = &source[5..];
    // I copied this unsafe code from Stack Overflow without
    // reading the text that told me how to know if this was safe
    let diff = unsafe { b.as_ptr().offset_from(a.as_ptr()) };
    println!("{}", diff);
}

Please be sure to read the documentation for this method as it describes under what circumstances it will not cause undefined behavior.

Tags:

Rust