Ich habe zwei &str
auf demselben String zeigt, und ich brauche das Byte zu wissen, zwischen ihnen gegenüber:Wie das Byte erhalten Versatz zwischen `& str`
fn main() {
let foo = " bar";
assert_eq!(offset(foo, foo.trim()), Some(2));
let bar = "baz\nquz";
let mut lines = bar.lines();
assert_eq!(offset(bar, lines.next().unwrap()), Some(0));
assert_eq!(offset(bar, lines.next().unwrap()), Some(4));
assert_eq!(offset(foo, bar), None); // not a sub-string
let quz = "quz".to_owned();
assert_eq!(offset(bar, &quz), None); // not the same string, could also return `Some(4)`, I don't care
}
Diese im Grunde die gleichen wie str::find
ist , aber da die zweite Scheibe eine Unterscheibe der ersten ist, hätte ich etwas schneller gehofft. Auch str::find
funktioniert nicht im lines()
Fall, wenn mehrere Zeilen identisch sind.
Ich dachte, ich könnte nur einige Zeigerarithmetik verwenden, um das mit etwas wie foo.trim().as_ptr() - foo.as_ptr()
zu tun, aber es stellt sich heraus, dass Sub
nicht auf unformatierten Zeigern implementiert ist.
Könnte ein 'isize' hier verwendet werden sollen, da' .Offset (...) 'erwartet ein' isize' Argument sowieso; Es wird Sie vor Problemen bewahren, wenn 'b' kleiner als' a' ist. –
@MatthieuM. Ich denke nicht, dass "Offset" * hier verwendet werden sollte. Außerdem möchte OP das gleiche wie "str :: find" zurückgeben, was "Option" wäre. –
Shepmaster