【问题标题】:Code from Book doesn't work书中的代码不起作用
【发布时间】:2012-12-13 23:51:54
【问题描述】:

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

【问题讨论】:

  • 你确定这本书的名字不是The D Programming Language?该示例以及使用最近的工具编译它的问题听起来 mighty familiar...
  • 是的,就是那本书。当我拿到这本书时,我没有得到任何东西.. <.>
  • 不幸的是,自从它出版以来,有些东西发生了变化,但这本书仍然是 D 方面最好的资源之一,而且通常是一本非常好的技术书籍。

标签: d


【解决方案1】:

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

另一件事是字典[单词]。那必须是字典[word.idup]。

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

您不希望在 AA 中出现这种情况:键会变得混乱。 .idup 制作一个永不改变的副本。

(书中没有 idup 的原因可能是因为那里的代码用于编译,但它并没有真正正常工作,因此被认为是一个错误。)

【讨论】:

  • 似乎修复了它。不过有点傻。 IDE 甚至没有显示出我可以用点连接器 x.x 来表达的东西谢谢!
  • 快速提问。我做了一个 If 语句,如果单词是 exit 并且字典中已经存在该单词,则退出程序。我如何让它退出程序呢?使用 break 没有做任何事情。
  • 有两种方法可以做到这一点:最简单的方法是返回;而不是休息。或者你可以打破外循环,这意味着在它上面放一个标签: outer_loop: foreach(line; stdin.byLine) up top 然后 break outer_loop;当您想退出时(这类似于 Java 功能)。
  • 但是您的第一次中断不起作用的原因仅仅是您处于两个循环中。所以打破单词循环仍然会让你留在行循环中。
  • 对于分离器功能,std.algorithm.iteration 听起来比已被弃用的 std.array 更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多