почему вариант D кажется запутанным - PullRequest
2 голосов
/ 05 июля 2019

Я экспериментирую с языком 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]

1 Ответ

3 голосов
/ 05 июля 2019

Это похоже на ошибку в 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);
}
...