Closed
Description
Currently multiple assignemnt is supported at declaration like this
let (critPos, period) =
if critPos1 > critPos2 {
(critPos1, period1)
} else {
(critPos2, period2)
};
I think it would be nice to be able do something like this:
// "improved" version of maximal_suffix in src/libcore/str.rs
fn maximal_suffix(arr: &[u8], reversed: bool) -> (uint, uint) {
let mut left = -1; // Corresponds to i in the paper
let mut right = 0; // Corresponds to j in the paper
let mut offset = 1; // Corresponds to k in the paper
let mut period = 1; // Corresponds to p in the paper
while right + offset < arr.len() {
let (a, b) =
if reversed {
(arr[left + offset], arr[right + offset])
} else {
(arr[right + offset], arr[left + offset])
};
// THIS IS THE IMPORTANT PART
(left, right, offset, period) =
if a < b {
// Suffix is smaller, period is entire prefix so far.
(left, right + offset, 1, right - left)
} else if a == b {
// Advance through repetition of the current period.
if offset == period {
(left, right + offset, 1, period)
} else {
(left, right, offset + 1, period)
}
} else {
// Suffix is larger, start over from current location.
(right, right + 1, 1, 1)
};
}
(left + 1, period)
}
Currently something similar is at the moment only possible with a small workaround:
fn maximal_suffix(arr: &[u8], reversed: bool) -> (uint, uint) {
let mut left = -1; // Corresponds to i in the paper
let mut right = 0; // Corresponds to j in the paper
let mut offset = 1; // Corresponds to k in the paper
let mut period = 1; // Corresponds to p in the paper
while right + offset < arr.len() {
let (a, b) =
if reversed {
(arr[left + offset], arr[right + offset])
} else {
(arr[right + offset], arr[left + offset])
};
// HERE I NEED TO INTRODUCE TEMPORARY VARIABLES
let (left_temp, right_temp, offset_temp, period_temp) =
if a < b {
// Suffix is smaller, period is entire prefix so far.
(left, right + offset, 1, right - left)
} else if a == b {
// Advance through repetition of the current period.
if offset == period {
(left, right + offset, 1, period)
} else {
(left, right, offset + 1, period)
}
} else {
// Suffix is larger, start over from current location.
(right, right + 1, 1, 1)
};
// AND NOW I CAN PUT THE VALUES BACK IN THE REAL VARIABLES
left = left_temp;
right = right_temp;
offset = offset_temp;
period = period_temp;
}
(left + 1, period)
}
Metadata
Metadata
Assignees
Labels
No labels