我用C++编程并尝试使用不可变数据类型,作为一种学习新东西的方法,也因为我被告知使用不可变数据类型可以更容易推理代码的影响,因为你知道一次构造一个实例,它无法更改.
我经常想使用分支逻辑创建数据实例.例如:
int x = 0;
if (a)
{
x = 1;
}
else
{
if (b)
{
x = 2;
}
else
{
x = 3;
}
}
DoSomething(x);
Run Code Online (Sandbox Code Playgroud)
但是,如果我的数据类型是不可变的,那么该代码将无法编译,因为不能有复制赋值运算符:
struct Immutable
{
public:
const int x;
Immutable(const int x)
: x(x)
{}
}
Immutable x(0);
if (a)
{
x = Immutable(1); // Compiler error
...
Run Code Online (Sandbox Code Playgroud)
我可以想到两种可能的解决方案.首先,我可以使用三元运算符根据条件构造我的数据:
Immutable x = a ? Immutable(1) : (b ? Immutable(2) : Immutable(3));
Run Code Online (Sandbox Code Playgroud)
但这会很快导致复杂的语法.
或者,我可以使用std::unique_ptr:
std::unique_ptr<Immutable> x = nullptr;
if (a)
{
x = std::unique_ptr<Immutable>(new Immutable(1));
}
else
{
if (b)
{
x = std::unique_ptr<Immutable>(new Immutable(2));
}
else
{
x = std::unique_ptr<Immutable>(new Immutable(3));
}
}
DoSomething(*x);
Run Code Online (Sandbox Code Playgroud)
但在我看来,这似乎可能会否定首先使用不可变数据的好处.
最后,可能是我尝试做的事情没有意义,我应该使用可变数据类型.
使用什么技术来获得不变性的好处?
只需将参数创建为自变量.如果您提出:
int n;
if (whatever) {
n = 0;
} else {
n = 1;
}
Immutable x(n);
Run Code Online (Sandbox Code Playgroud)
如果需要在一行中初始化它(例如,在构造函数的初始化列表中),那么只需将逻辑放在一个函数中.
Immutable foo() {
int n;
if (whatever) {
n = 0;
} else {
n = 1;
}
return Immutable(n);
}
struct Thingy {
Immutable x;
Thingy() :x(foo()) {}
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
98 次 |
| 最近记录: |