我正在学习D并正在采取婴儿步骤,所以请耐心等待。
我正在读这本名为“D编程语言”的书。我正在使用D-IDE代码。我目前正在编写一个程序,如果该书还没有单词,它应该在它的词汇表(词典)中添加单词。
问题是,本书提供的代码无效,而不仅仅是继续阅读结果应该是什么等等。我想尝试解决它。当然是我对D这么新的问题。
代码如下:
import std.stdio, std.string;
void main() {
uint[string] dictionary;
foreach(line; stdin.byLine()) {
// Break sentence into words
// Add each word in the sentence to the vocabulary
foreach(word; splitter(strip(line))) {
if(word in dictionary) continue; // Nothing to do
auto newID = dictionary.length;
dictionary[word] = newID;
writeln(newID, '\t', word);
}
}
}
IDE说Error: undefined identifier splitter
,因为我对Java很有经验,我猜错误意味着该方法不存在,并且因此尝试将其作为变量处理,但是不存在无论是。所以我尝试将其改为“拆分”。这会在字典中产生另一个错误:Error: associative arrays can only be assigned values with immutable keys, not char[]
所以我真的不知道如何解决这个问题并让它发挥作用。当书本中应该教你的代码时,令人沮丧的是不行。我正在使用dmd2。
答案 0 :(得分:10)
您想要的拆分器位于std.algorithm.iteration
模块(之前为std.array
,但在2016年移动)。将它添加到您的导入中,它应该消失。
另一件事是字典[word]。那将是字典[word.idup]而不是。
原因是stdin.byLine引入的行位于临时缓冲区中(通过避免内存分配来获得最大性能)。当你得到下一行时,它将覆盖前一行。
你不希望在AA中:键会让所有人感到困惑。 .idup制作一个永不改变的副本。
(这本书没有idup的原因可能是因为那里的代码用来编译,但它确实没有用,因此被认为是一个bug。)