내가 컴파일 시간 평가
enum chars = digits ~ uppercase;
문자열이 컴파일시에 연결된됩니다 작성하는 경우? 나는 그것이 할 것이라고 추측하고있다. 문자열 리터럴이나 CTFE 함수로 바꾸면 어떤 중요한 성능 차이도 측정 할 수 없습니다 (심지어 1 억 번이라도 부릅니다). 열거 형을 const로 바꾸면 차이가 있습니다. 나는 이렇게 쓰는 것이 비효율적이라고 들었습니다. 나는 그것이 일종의 편리하다고 생각했고 나는 비효율을 보지 못했다. (BTW, 라인은 재귀 적으로 호출되는 함수에 있습니다).
전체 코드는
import std.string;
string toBase(long n, int b)
in {
assert(2 <= b && b <= 35);
} body {
static string sign;
if (n < 0) {
n *= -1;
sign = "-";
}
enum chars = digits ~ uppercase;
size_t r = cast(size_t)(n % b);
if (n == r) {
return sign ~ chars[r];
}
return toBase((n - r)/b, b) ~ chars[r];
}
편집 (다른 기본으로 숫자 시스템으로 변환) : 질문
string toBase(long n, int b)
in {
assert(2 <= b && b <= 35);
} body {
enum chars = digits ~ uppercase;
long r = n % b;
char c = chars[cast(size_t) abs(r)];
if (n == r) {
return (n < 0 ? "-" : "") ~ c;
}
return toBase((n - r)/b, b) ~ c;
}
(토큰을 재설정하는 것을 잊었을 때)'toBase (-10,10)'다음에'toBase (10,10)'이 주어지기 때문에 ('scope (exit) sign = ""; ' 같은 결과 –
오른쪽. 하하하, 처음 정적 변수를 사용합니다. 교활한. 그 범위 (출구)는 정말 유용하지 않나요? 재귀 호출이 범위 종료로 적합하지 않다는 사실에 조금 놀랐습니다. – fwend
현재 스택 프레임이 스택을 팝 할 때 scope (exit)가 실행될 때 (try ... finally와 같이 실제로 들었지만 여분의 들여 쓰기가없는 경우) 재귀는 수행하지 않습니다. –