为什么D语言的变体看起来很混乱

4
我尝试使用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);
}

出现难以理解的运行时错误。

为什么会这样呢?

以下是错误信息。

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]

3
请考虑包含错误信息,这样我们就可以解密它。未经书写,至少对我来说更难解决 :-) - Stephane Rolland
@StephaneRolland 好的。 - ntysdd
从未做过任何D语言教程。我可能错了,但由于它是由最有影响力的C++程序员A Alexandrescu创建的,所以我用C++的思维方式阅读消息。错误消息似乎在说:“嘿,你给了我一个简单的char,但我只能使用称为“不可变字符”的常量字符数组”。 - Stephane Rolland
此外,我对您使用运算符〜=感到非常困惑。在D语言中它是什么意思?介绍页面:https://learnxinyminutes.com/docs/d/甚至没有提到这个运算符。在C++中,有一个用于否定二进制值的~...但我想知道`〜=`运算符有多有用。 - Stephane Rolland
1
@StephaneRolland 我认为“”表示字符串连接,所以“=”表示原地连接。我在某个地方读到D语言有一种Variant类型,这使它感觉像是一种“动态”语言,但当我尝试使用它时,我发现它在使用“~=”运算符时会出现问题。我尝试将char类型更改为不可变的char类型,错误确实消失了。我仍然很好奇为什么Variant类型拒绝char类型版本。 - ntysdd
1个回答

4
这似乎是在 std.variant.Variant 中的一个错误。这里的问题是,char 和 immutable(char) 是两种不同的类型,而 Variant 不知道它们之间的关系密切。有两种解决方法:要么使 x 持有一个 char[] 而不是 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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接