2017-02-07 26 views
3

Я использую mysql-native, которые возвращают Variant данные типа. Мне нужно, чтобы преобразовать его в стандартные типы, как int, string и т.д.Каков правильный способ преобразования Variant в правильный тип?

D имеют std.conv, но std.variant также методы конкретности.

Я не могу понять, какая разница между: get, coerce, toString и to (от std.conv).

Также звучит очень странно, что convertsTo возвращается bool. По его имени я ожидал, что он должен сделать конвенцию. IMHO isConvertable - более подходящее имя для него.

ответ

4

Есть три способа, чтобы получить значение из Variant типа:

  • Variant.peek!T: Если значение в настоящее время удерживается Variant объекта типа T, то указатель на это значение возвращается. Если он держит значение другого типа, он вместо этого возвращает значение null.

    Variant v = "42"; 
    string* ptr = v.peek!string; 
    assert(ptr !is null && *ptr == "42"); 
    
  • Variant.get!T: Если значение в настоящее время удерживается Variant объекта типа T, возвращает значение этого. В противном случае бросается VariantException.

    Variant v = "42"; 
    assertThrown!VariantException(v.get!int); 
    assertNotThrown!VariantException(v.get!string); 
    
  • Variant.coerce!T: Возвращает значение удерживаемого Variant объекта, явно convertedto типа T. Если значение не может быть преобразовано в тип T, то бросается Exception.

    Variant v = "42"; 
    string s = v.coerce!string; 
    assert(s == "42"); 
    int i = v.coerce!int; 
    assert(i == 42); 
    
+1

Не могли бы вы добавить пример из реальной жизни. Насколько я понимаю основную проблему, если переменная может явно привести к правильному типу данных? –