gpt4 book ai didi

d - string 和 std.file 的意外行为

转载 作者:行者123 更新时间:2023-12-01 23:55:14 25 4
gpt4 key购买 nike

我有以下代码块,可以在 DMD v2.063.2 上干净地编译

import std.stdio;
import std.string;
import std.file;

void main(string[] args)
{
auto file = File("a_file.txt", "rb");

string line;
string source;

while ((line = file.readln()) !is null)
{
source.append(line);
}

writeln("--- source: ---");
writeln(source);
writeln("---------------");
}

但是,每次运行都会出现这个错误:

std.file.FileException@std/file.d(386): : No such file or directory
----------------
5 test 0x000000010b955c9e void std.file.writeImpl(const(char[]), const(void[]), const(uint)) + 142
6 test 0x000000010b955c08 void std.file.append(const(char[]), const(void[])) + 56
7 test 0x000000010b92787e _Dmain + 174
8 test 0x000000010b94330d extern (C) int rt.dmain2._d_run_main(int, char**, extern (C) int function(char[][])*).void runMain() + 33
9 test 0x000000010b942e59 extern (C) int rt.dmain2._d_run_main(int, char**, extern (C) int function(char[][])*).void tryExec(scope void delegate()) + 45
10 test 0x000000010b943359 extern (C) int rt.dmain2._d_run_main(int, char**, extern (C) int function(char[][])*).void runAll() + 61
11 test 0x000000010b942e59 extern (C) int rt.dmain2._d_run_main(int, char**, extern (C) int function(char[][])*).void tryExec(scope void delegate()) + 45
12 test 0x000000010b942e0d _d_run_main + 457
13 test 0x000000010b942c3c main + 20
14 libdyld.dylib 0x00007fff9a7de5fd start + 1
15 ??? 0x0000000000000001 0x0 + 1
----------------

我对错误感到困惑,因为该文件存在并且显然正在打开。错误消息完全具有误导性。我已经设法将错误查明到 while() 循环主体中的 source.append(line); 行。

偶然看了一下string类型的文档,发现它没有append方法。然后,查看 std.file 的文档,我发现有一个全局的 append 函数。错误消息有点有意义。

所以看起来编译器以某种方式设法在 source 字符串对象上调用 std.file.append(正如我们可以在异常调用堆栈中观察到的那样),从而导致这个非常棘手的错误。这怎么可能?谁能阐明这个问题?

如果我在这里遗漏了一些语言的基本要点,请原谅我,我是初学者,但这似乎完全打破了类型安全的想法,不是吗?

最佳答案

您看到的是 UFCS在行动中。您可能没有预料到它,但我不明白它是如何破坏类型安全的。不过,异常消息可能会提及无法找到的文件。像“没有这样的文件或目录:filename.ext”。

关于d - string 和 std.file 的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24109863/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com