【发布时间】:2011-10-01 10:39:04
【问题描述】:
是否有任何类型安全的方法可以在 D 中创建 string,使用仅在运行时可用的信息,而不分配内存?
我可能想做的一个简单例子:
void renderText(string text) { ... }
void renderScore(int score)
{
char[16] text;
int n = sprintf(text.ptr, "Score: %d", score);
renderText(text[0..n]); // ERROR
}
使用这个,你会得到一个错误,因为text 的切片不是不可变的,因此不是string(即immutable(char)[])
我只能想到三种解决方法:
- 将切片转换为
string。它有效,但很丑。 - 使用切片分配一个新字符串。这可行,但我宁愿不必分配内存。
- 将
renderText更改为const(char)[]。这在这里有效,但是 (a) 它很难看,并且 (b) Phobos 中的许多功能需要string,所以如果我想以相同的方式使用它们,那么这不起作用。
这些都不是特别好的。我错过了什么吗?其他人如何解决这个问题?
【问题讨论】:
-
异端邪说!使用
snprintf! :D -
我认为#3 实际上是正确的解决方案。 string--> immutable(char)[] 表示数据不能更改(只要它仍然在某处引用,否则允许 GC 收集它,AFAIK)。我认为您永远无法为堆栈分配的数据做出这样的保证。但除非 renderText 确实需要在某处存储文本,否则它应该使用 const(char)[]。由于 immutable 比 const 更强大,因此它只应在必要时使用。我同意,但是 phobos 中的许多函数不必要地使用字符串而不是 const(char)[],这应该在 phobos 中修复。
标签: string memory-management immutability d