Book中的代码不起作用

时间:2012-12-13 23:51:54

标签: d

我正在学习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。

1 个答案:

答案 0 :(得分:10)

您想要的拆分器位于std.algorithm.iteration模块(之前为std.array,但在2016年移动)。将它添加到您的导入中,它应该消失。

另一件事是字典[word]。那将是字典[word.idup]而不是。

原因是stdin.byLine引入的行位于临时缓冲区中(通过避免内存分配来获得最大性能)。当你得到下一行时,它将覆盖前一行。

你不希望在AA中:键会让所有人感到困惑。 .idup制作一个永不改变的副本。

(这本书没有idup的原因可能是因为那里的代码用来编译,但它确实没有用,因此被认为是一个bug。)