所以,我正在构建一种脚本语言,我的目标之一是方便的字符串操作。我在 C++ 中尝试了一些想法。
- 字符串作为字节序列和返回包含代码点索引的向量的自由函数。
- 一个包装类,它结合了一个字符串和一个包含索引的向量。
两种想法都有问题,问题是,我应该返回什么。它不能是一个字符,如果它是一个字符串,那将是浪费空间。
我最终围绕一个正好 4 个字节的 char 数组创建了一个包装类:一个在内存中正好有 4 个字节的字符串,不多也不少。
在创建这个类之后,我很想将它包装std::vector
在另一个类中并从那里构建,从而制作一个字符串类型的代码点。我不知道这是否是一个好方法,它最终会更方便,但最终会浪费更多空间。
因此,在发布一些代码之前,这里有一个更有条理的想法列表。
- 我的字符类型不是字节,也不是字素,而是代码点。我把它命名为一个符文,就像 Go 语言中的符文一样。
- 一个字符串作为一系列分解的符文,从而对 O1 进行索引和切片。
- 因为 rune 现在是一个类而不是原始类型,所以可以使用检测 unicode 空格的方法对其进行扩展:
mysring[0].is_whitespace()
- 我仍然不知道如何处理字素。
奇怪的事实!我构建 rune 类原型的方式的一个奇怪之处在于它总是以 UTF8 打印。因为我的 rune 不是 int32,而是一个 4 字节的字符串,所以最终会有一些有趣的属性。
我的代码:
class rune {
char data[4] {};
public:
rune(char c) {
data[0] = c;
}
// This constructor needs a string, a position and an offset!
rune(std::string const & s, size_t p, size_t n) {
for (size_t i = 0; i < n; ++i) {
data[i] = s[p + i];
}
}
void swap(rune & other) {
rune t = *this;
*this = other;
other = t;
}
// Output as UTF8!
friend std::ostream & operator <<(std::ostream & output, rune input) {
for (size_t i = 0; i < 4; ++i) {
if (input.data[i] == '\0') {
return output;
}
output << input.data[i];
}
return output;
}
};
错误处理思路:
我不喜欢在 C++ 中使用异常。我的想法是,如果构造函数失败,则将 rune 初始化为 4 '\0'
,然后显式重载 bool 运算符以在运行的第一个字节恰好是 时返回 false '\0'
。简单易用。
那么,想法?意见?不同的方法?
就算我的符文串很多,至少我还有符文类型。小而快复制。:)