【问题标题】:order of method invocation mixed up方法调用顺序混淆
【发布时间】:2016-08-26 11:26:55
【问题描述】:

我正在尝试学习 d,所以我从 hello world 开始,并尝试对其进行一些扩展。

import std.stdio;
import core.thread;

void main(string[] args){
    writeln("Hello World!");
    Thread.sleep(dur!("seconds")(5));
    writeln("Press enter key to exit...");
    writeln(readln());
}

所以我希望我的输出如下

Hello World!
Press enter key to exit...
//input "abcd"
abcd

但是我得到了这个

//input "abcd"
Hello World!
Press enter key to exit....
abcd

睡眠功能甚至被跳过。 发生了什么?

【问题讨论】:

  • 对我来说没问题。您使用哪个版本的编译器?你如何构建和运行这段代码
  • gdc --version 表示版本 5.4.0 20160609。我在 --build-mode 中为 x86_64 单独编译

标签: linux intellij-idea d gdc


【解决方案1】:

这是一个常见问题解答,当我阅读标题时,我预计会看到一个 IDE,而你标记了它,所以耶!我找不到要链接到的旧答案,但缺少的是输出和睡眠确实发生了,它们只是被 IDE 管道缓冲,直到最后才看到。

如果您在readln 之前和/或在第一个writeln 之后添加stdout.flush();,您将看到输出 - 这会强制缓冲区在执行任何其他操作之前进入屏幕。

正常的控制台输出会自动刷新一行,但 IDE 被视为管道;该程序与另一个程序而不是与用户交谈,因此它认为它可以按数据块而不是按用户可见行进行缓冲。

【讨论】:

  • 我以为我要疯了。我希望它不是缓冲区,因为它被称为 writeln() (当你使用这个函数时,你显然想写一行。)我不知道我怎么会错过这个.
  • 是的,我们已经考虑在 writeln 调用中放入flush,但是在正常与管道或其他文件通信时,缓冲会大大提高性能,因此在大多数情况下它是正确的......它只是变得混乱,因为 IDE 看起来不像它们在库中的样子。
  • 我认为制作两个不同版本的writeln 的提议已经出现了。如果我可能会问,不这样做而是这样做的原因是什么?
  • 好吧,那里有一个内置的flush,它只是没有被调用,因为它没有意识到ide需要它......但是因为这很容易修复并且只会发生在 IDE 内部,我不认为开发人员非常担心。也就是说,他们可能愿意这样做,我不记得上次说了什么。
猜你喜欢
  • 2012-02-18
  • 2015-09-18
  • 1970-01-01
  • 1970-01-01
  • 2011-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多