首页 > 解决方案 > 为什么 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]

标签: ddynamic-typing

解决方案


这似乎是 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);
}

推荐阅读