std综合体设计背后的原因是什么?
这意味着我可以有std综合体设计背后的原因是什么?,d,phobos,D,Phobos,这意味着我可以有复杂!(不可变浮点),但我永远不能对另一个复杂实例使用它的opBinary函数!(不可变浮点)。那么,为什么std.complex是以这种方式实现的呢 这是opBinary。它调用opOpAssign,这将不适用于不可变的,因此出现错误 unittest { immutable float a = 1.1, b = 1.2; auto c1 = complex(a,b); auto r1 = c1 + c1; // error, not mutable } 我得
复杂!(不可变浮点)
,但我永远不能对另一个复杂实例使用它的opBinary
函数!(不可变浮点)
。那么,为什么std.complex是以这种方式实现的呢
这是opBinary
。它调用opOpAssign
,这将不适用于不可变的
,因此出现错误
unittest
{
immutable float a = 1.1, b = 1.2;
auto c1 = complex(a,b);
auto r1 = c1 + c1; // error, not mutable
}
我得说这是一只虫子。当然,如果它不是一个bug,那就是一个糟糕的设计。但是看看
opOpAssign
的代码,以及其中有多少代码,我猜他们是在试图避免代码重复,而忘记了考虑到他们所做的不会与不可变的
一起工作。我建议您。在这一点上,直接使用opbinary并执行一个整体的自动oppassign(string op,R)(rz){return(this=this.opbinary!(op)(z));}
将解决所有这些问题。似乎创建不可变BigInt
也是不可能的。那也是一只虫子吗?@Arlen不知道。这当然值得一个增强请求。但是让用户定义的类型与不可变的
一起工作通常需要额外的工作,如果定义类型的人没有专门为它编码,那么它很有可能不工作。我的猜测是Don在写BitInt
时没有想到不可变的
,但我不知道。
Complex!(CommonType!(T,R)) opBinary(string op, R)(Complex!R z) const
{
alias typeof(return) C;
auto w = C(this.re, this.im);
return w.opOpAssign!(op)(z);
}