在D中表示可选值
我将要编写一个解析器,将文本文件逐行读取到不同类型的结构中,并将这些结构交给回调函数(观测者或访问者-还不确定) 文本文件包含MT-940数据-SWIFT银行对账单 这些行由一个指定类型的标记和一些字段(例如日期)组成,这些字段应解析为我的消息的类型安全成员。其中一些字段是可选的——所以我的问题是:如何在D中表示可选值 C++提供了boost::optional之类的东西,您可能知道 我目前通过自己实现一个可选的(T)来解决这个问题(参见本文末尾的代码)。它是一个结构,其中包含一个ValueHolder实例,该实例可能为null,这表示没有赋值的情况。如有必要,我重写了抄送人和转让操作员的副本,以创建价值持有人的深度副本 这是路吗?还有其他更简单的选择吗 这是我的代码-功能不一定完整:在D中表示可选值,d,phobos,D,Phobos,我将要编写一个解析器,将文本文件逐行读取到不同类型的结构中,并将这些结构交给回调函数(观测者或访问者-还不确定) 文本文件包含MT-940数据-SWIFT银行对账单 这些行由一个指定类型的标记和一些字段(例如日期)组成,这些字段应解析为我的消息的类型安全成员。其中一些字段是可选的——所以我的问题是:如何在D中表示可选值 C++提供了boost::optional之类的东西,您可能知道 我目前通过自己实现一个可选的(T)来解决这个问题(参见本文末尾的代码)。它是一个结构,其中包含一个ValueHo
struct Optional(T)
{
class ValueHolder
{
T value;
this(T v)
{
value = v;
}
}
private ValueHolder m_value;
/* Construction without value / with value */
this(T value)
{
m_value = new ValueHolder(value);
}
/* Copy construction / assignment */
ref Optional!(T) opAssign(Optional!(T) rhs)
out
{
if (rhs.m_value !is null)
{
assert(rhs.m_value != m_value);
}
else
{
assert(m_value is null);
}
}
body
{
m_value = null;
if (rhs)
{
m_value = new ValueHolder(rhs.m_value.value);
}
return this;
}
ref Optional!(T) opAssign(T value)
out
{
assert(hasValue());
assert(m_value.value == value);
}
body
{
if (m_value is null)
{
m_value = new ValueHolder(value);
}
else
{
m_value.value = value;
}
return this;
}
this(Optional!(T) rhs)
out
{
if (rhs.m_value !is null)
{
assert(rhs.m_value != m_value);
}
else
{
assert(m_value is null);
}
}
body
{
if (rhs.m_value !is null)
{
m_value = new ValueHolder(rhs.m_value.value);
}
}
/* Implicit cast to bool */
bool hasValue() const
{
return m_value !is null;
}
X opCast(X: bool)()
{
return hasValue();
}
/* Value access */
T opUnary(string s)() const
in
{
assert(s == "*");
assert(m_value !is null);
}
body
{
return m_value.value;
}
}
/* Default Constructed Struct does not have a value assigned */
unittest
{
Optional!(int) x;
assert(x.hasValue() == false);
assert(!x);
}
/* Construction with value */
unittest
{
Optional!(int) x = 3;
assert(x);
assert(x.hasValue());
}
/* Assignment operator does copy the value */
unittest
{
Optional!(int) x = 3;
Optional!(int) y;
assert(x);
assert(!y);
y = x;
assert(&x != &y);
assert(x);
assert(y);
y = 12;
assert(x.m_value.value != y.m_value.value);
assert(*y == 12);
Optional!(int) z;
x = z;
assert(!x);
assert(!z);
assert(y);
}
对于可选值,D标准库在模块
std.typecons
中提供了结构模板,现在我知道了。。。很明显:)谢谢你在使用Nullable时应该小心,因为它允许隐式转换到包装类型,也就是说,如果你有一个Nullable!int ni,编译器不会阻止您执行int n=ni。如果ni为“null”,这将在运行时引发异常。@Meta它不会引发异常。它断言。但是是的,它将检查是否可以为空!当您尝试将T
用作T
时,T为“null”。感谢您的提示。。。我期待这样的事情