converting Arabic and Roman numerals의 작업에 대해 rosettacode.org에 다음 코드를 게시했습니다.D2 : std.algorithm.indexOf가 더 이상 작동하지 않음
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;
}
이전에는 잘 작동했지만 이전에는 컴파일러 오류가 발생했습니다. 설명서 같이 IndexOf에 따르면
는 사용되지 않으며 countUntil는 대신에 사용되어야하지만, 나에게 같은 오류를 제공합니다.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
입니다. 불변의 콜렉션에있는 요소의 색인을 얻는 방법이 있습니까? 아니면 배열을 캡슐화하고 비공개로 만들고 접근자를 만들고 내 자신의 indexOf를 굴려야합니까? – fwend
@fwend : 지금 당장 가장 쉬운 방법은 머리를 변경할 수 있도록 변환하는 것입니다. 예를 들면 :'immutable (string) [] headMutable = symbols;','symbols' 대신에'headMutable'을 사용하여 할 일을하십시오. – dsimcha
이 문제를 해결할 제안이 있습니까? 불변의 배열로'indexOf'를 사용할 수없는 것은 꽤 큰 문제입니다. –