Book中的代码不起作用

Omn*_*Owl 6 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

IDE说Error: undefined identifier splitter,因为我对Java很有经验,我猜错误意味着该方法不存在,并且因此尝试将其作为变量处理,但这也不存在.所以我尝试将其改为"拆分".这会在字典中产生另一个错误:Error: associative arrays can only be assigned values with immutable keys, not char[]

所以我真的不知道如何解决这个问题并让它发挥作用.当书本中应该教你的代码时,令人沮丧的是不行.我正在使用dmd2.

Ada*_*ppe 10

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

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

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

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

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

  • 有两种方法可以做到这一点:最简单的方法就是回归; 而不是休息.或者你可以打破外部循环,这意味着在其上放置一个标签:outer_loop:foreach(line; stdin.byLine)up up然后break outer_loop; 当你想退出时(这类似于Java功能). (2认同)
  • 但是你的第一次休息不起作用的原因只是你在两个循环中.所以在单词循环中打破仍然会让你进入行循环. (2认同)