Ich schreibe eine Zyklusmethode für eine Liste, die einen Index vorwärts oder rückwärts verschiebt. Der folgende Code wird verwendet, um rückwärts zu gehen:
%Vor% In diesem Fall ist i
vom Typ usize
, was bedeutet, dass es unsigniert ist. Wenn i
gleich 0 ist, führt dies zu einem Fehler "Versuch, mit Überlauf zu subtrahieren". Ich habe versucht, die richtigen Casting-Methoden zu verwenden, um dieses Problem zu umgehen:
Dies führt zu einem ganzzahligen Überlauf.
Ich verstehe, warum die Fehler passieren, und im Moment habe ich das Problem gelöst, indem ich überprüft habe, ob der Index gleich 0 ist, aber ich habe mich gefragt, ob es eine Möglichkeit gäbe, die Variablen auf die richtigen Typen zu übertragen .
Als DK. weist darauf hin, , Sie wollen Semantik nicht auf Ganzzahlebene umbrechen:
%Vor%Stattdessen möchten Sie mit Modulo-Logik umgehen:
%Vor% Dies funktioniert nur, wenn len
+ idx
kleiner als der maximale Wert des Typs ist - dies ist viel einfacher zu sehen mit u8
anstelle von usize
; Setzen Sie einfach idx
auf 200 und len
auf 250.
Wenn Sie nicht garantieren können, dass die Summe der beiden Werte immer kleiner als der maximale Wert ist, würde ich wahrscheinlich die "geprüfte" Familie von Operationen verwenden. Dies ist das gleiche Niveau der konditionellen Überprüfung, das Sie bereits erwähnt haben, aber es ist sauber in eine einzige Zeile eingebunden:
%Vor%Tags und Links rust integer-overflow integer-arithmetic