Publiqué el siguiente código en rosettacode.org para la tarea converting Arabic and Roman numerals.D2: std.algorithm.indexOf no funciona más
import std.regex, std.array, std.algorithm;
immutable {
int[] weights = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1];
string[] symbols = ["M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX",
"V", "IV", "I"];
}
string toRoman(int n) {
auto app = appender!string;
foreach (i, w; weights) {
while (n >= w) {
app.put(symbols[i]);
n -= w;
}
if (n == 0) break;
}
return app.data;
}
int toArabic(string s) {
int arabic;
foreach (m; match(s, "CM|CD|XC|XL|IX|IV|[MDCLXVI]")) {
arabic += weights[symbols.indexOf(m.hit)];
}
return arabic;
}
Solía funcionar bien, pero ahora me sale un error del compilador.
Error: template std.algorithm.indexOf(alias pred = "a == b",R1,R2) if (is(typeof(startsWith!(pred)(haystack,needl e)))) does not match any function template declaration
De acuerdo con la documentación indexOf es obsoleto, y countUntil debe usarse en lugar, pero me da el mismo error.
Veo. ¿Hay alguna manera de obtener el índice de un elemento en una colección inmutable, o debo encapsular las matrices, hacerlas privadas, crear accesos y rodar mi propio índice? – fwend
@fwend: en este momento, la forma más fácil es convertirlo en cabezal mutable. Por ejemplo: 'inmutable (string) [] headMutable = symbols;', luego haz lo que necesites hacer con 'headMutable' en lugar de' symbols'. – dsimcha
¿Conoce alguna propuesta para solucionar esto? No poder usar 'indexOf' en una matriz inmutable es un problema bastante grande. –