sách gpt4 ai đã đi

d - biểu thị một giá trị tùy chọn trong D

In lại 作者:行者123 更新时间:2023-12-04 11:26:51 27 4
mua khóa gpt4 Nike

我即将编写一个解析器,将文本文件逐行读取到不同类型的结构中,并将这些结构提供给回调(观察者或访问者 - 尚不确定)。

文本文件包含 MT-940 数据 - SWIFT 银行对帐单。

这些行由一个指定类型和一些字段的标记组成 - 例如一个日期 - 应该将其解析为我的消息的类型安全成员。其中一些字段是可选的 - 所以我的问题是:如何在 D 中表示可选值。

C++ 提供了我的东西,比如你可能知道的 boost::optional。

我目前通过自己实现一个 Optional(T) 来解决这个问题(请参阅本文末尾的代码)。它是一个结构,其中包含一个可能为 null 的 ValueHolder 实例——这标志着没有赋值的情况。如有必要,我重写了 copy-c'tor 和赋值运算符以创建 ValueHolder 的深拷贝。

这是要走的路吗?还有其他更简单的选项我看不到吗?

这是我的代码 - 功能不一定完整:

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)
ngoài
{
if (rhs.m_value !is null)
{
assert(rhs.m_value != m_value);
}
khác
{
assert(m_value is null);
}
}
thân hình
{
m_value = null;

if (rhs)
{
m_value = new ValueHolder(rhs.m_value.value);
}

return this;
}

ref Optional!(T) opAssign(T value)
ngoài
{
assert(hasValue());
assert(m_value.value == value);
}
thân hình
{
if (m_value is null)
{
m_value = new ValueHolder(value);
}
khác
{
m_value.value = value;
}

return this;
}

this(Optional!(T) rhs)
ngoài
{
if (rhs.m_value !is null)
{
assert(rhs.m_value != m_value);
}
khác
{
assert(m_value is null);
}
}
thân hình
{
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
TRONG
{
assert(s == "*");
assert(m_value !is null);
}
thân hình
{
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);
}

1 Câu trả lời

对于可选值,D 标准库提供了结构模板 Nullable在模块 std.typecons .

关于d - 表示 D 中的可选值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25126559/

27 4 0
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com