d - 为什么 D 的变体看起来令人困惑
问题描述
我用 D 语言做实验,发现 std.variant 很酷。
但后来我发现它令人困惑。
例如,
import std.stdio;
void main()
{
string x = "";
x ~= 'v';
writeln(x);
}
这符合预期。
但是这个,
import std.stdio;
import std.variant;
void main()
{
Variant x = "";
x ~= 'v';
writeln(x);
}
给出一个难以破译的 RUNTIME 错误。
这是为什么?
这是消息。
std.variant.VariantException@std/variant.d(1675): Variant: attempting to use incompatible types char and immutable(char)[]
----------------
??:? inout @property inout(immutable(char)[]) std.variant.VariantN!(32uL).VariantN.get!(immutable(char)[]).get() [0x106f84654]
??:? long std.variant.VariantN!(32uL).VariantN.handler!(immutable(char)[]).handler(std.variant.VariantN!(32uL).VariantN.OpID, ubyte[32]*, void*) [0x106f7559d]
??:? std.variant.VariantN!(32uL).VariantN std.variant.VariantN!(32uL).VariantN.opOpAssign!("~", char).opOpAssign(char) [0x106f84a1d]
??:? _Dmain [0x106f74d8d]
解决方案
这似乎是 std.variant.Variant 中的一个错误。这里的问题是char
并且immutable(char)
是两种不同的类型,并且Variant
不知道它们密切相关。对此有两种不同的解决方法:要么使x
保持 achar[]
而不是immutable(char)[]
(也称为string
),要么'v'
使immutable(char)
:
import std.stdio;
import std.variant;
void main()
{
Variant x = "".dup; // Duplicate the string to make it a heap-allocated, mutable string.
x ~= 'v';
writeln(x);
}
或者
import std.stdio;
import std.variant;
void main()
{
Variant x = "";
x ~= cast(immutable)'v'; // Make 'v' explicitly immutable.
writeln(x);
}
推荐阅读
- javascript - 使用 ajax 加载 2 个不同的 json 文件以使用扩展运算符组合成一个对象
- jenkins - 下游作业的用户提示
- c# - 在同一个项目(SQL Server 和 MySql)中使用具有多个数据库和提供程序的实体框架
- java - Java 中的动态 Json 到 CSV。寻找适用于任何 json 的通用代码,而不考虑 json 文件中的任何数量的节点
- angular - 在 debounceTime 之后多次调用函数
- jquery - 更新面板中的自动数字 unformatOnSubmit 选项
- python - 在 python 2 和 3 中对 python NamedTuple 进行类型检查
- python - 如何在不使用 SQLAlchemy 的情况下将 Flask 应用程序部署到 Heroku?
- javascript - 如何在 Jest 中模拟插件
- angular - 如何在使用带有保存和编辑按钮的 angular-7 材料表时添加新以在表格顶部而不是底部插入行