是否有任何類型安全的方式在D中創建string
,只使用運行時可用的信息,而不分配內存?在D中創建字符串而不分配內存?
什麼,我可能想要做一個簡單的例子:因此
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 – BCS
我認爲#3實際上是正確的解決方案。字符串 - >不可變(char)[]意味着數據不能改變(只要它仍然在某處引用,否則允許GC收集它,AFAIK)。我認爲你無法爲堆棧分配的數據做出這樣的保證。但除非renderText實際上需要在某處存儲文本,否則它應該使用const(char)[]。由於不可變比const強,所以只能在必要時使用。我同意,然而,在phobos中的許多函數不必要地使用字符串而不是const(char)[],這應該在phobos中修復。 – jpf
@jpf:我同意100%。 –