变量转储器模板函数不考虑范围
Variable dumpper template function doesn't respect scope
我有一个方便的 dump
函数(从互联网复制,很可能来自 https://forum.dlang.org/),我用它来研究变量。
我只是注意到它在所有情况下都不考虑范围(见下文)。为什么以及如何修复它以获得预期的结果?还是该功能存在根本性缺陷? dump
在我学D的时候很有价值
我在 Linux.
上使用 DMD64 D 编译器 v2.083.0
使用 -debug
编译时的预期结果:
(immutable(int) x = 1)
(immutable(immutable(char)[]) x = A)
(immutable(double) x = 1.1)
却得到了:
(immutable(int) x = 1)
(immutable(int) x = 1)
(immutable(double) x = 1.1)
代码:
void dump(alias variable)()
{
import std.stdio : writefln;
writefln("(%s %s = %s)",
typeid(typeof(variable)),
variable.stringof,
variable);
}
void main()
{
{
immutable x = 1; debug dump!x;
}
{
immutable x = "A"; debug dump!x;
}
{
void f() { immutable x = 1.1; debug dump!x; }
f();
}
}
看起来你 运行 遇到了这个编译器错误:
https://issues.dlang.org/show_bug.cgi?id=13617
function-local symbols do not have unique names and conflict with symbols in sibling scopes
从错误报告中派生的一个最小示例来说明问题:
bool isInt(alias x)() { return is(typeof(x) == int); }
void main() {
{ int a; static assert(isInt!a); }
{ float a; static assert(isInt!a); } // passes unexpectly (compiler bug)
}
上面的代码编译不正确,即使是第二个 static assert
也应该编译失败。
我有一个方便的 dump
函数(从互联网复制,很可能来自 https://forum.dlang.org/),我用它来研究变量。
我只是注意到它在所有情况下都不考虑范围(见下文)。为什么以及如何修复它以获得预期的结果?还是该功能存在根本性缺陷? dump
在我学D的时候很有价值
我在 Linux.
上使用 DMD64 D 编译器 v2.083.0使用 -debug
编译时的预期结果:
(immutable(int) x = 1)
(immutable(immutable(char)[]) x = A)
(immutable(double) x = 1.1)
却得到了:
(immutable(int) x = 1)
(immutable(int) x = 1)
(immutable(double) x = 1.1)
代码:
void dump(alias variable)()
{
import std.stdio : writefln;
writefln("(%s %s = %s)",
typeid(typeof(variable)),
variable.stringof,
variable);
}
void main()
{
{
immutable x = 1; debug dump!x;
}
{
immutable x = "A"; debug dump!x;
}
{
void f() { immutable x = 1.1; debug dump!x; }
f();
}
}
看起来你 运行 遇到了这个编译器错误:
https://issues.dlang.org/show_bug.cgi?id=13617
function-local symbols do not have unique names and conflict with symbols in sibling scopes
从错误报告中派生的一个最小示例来说明问题:
bool isInt(alias x)() { return is(typeof(x) == int); }
void main() {
{ int a; static assert(isInt!a); }
{ float a; static assert(isInt!a); } // passes unexpectly (compiler bug)
}
上面的代码编译不正确,即使是第二个 static assert
也应该编译失败。