看起来 operator + = 不是用户定义的东西(来自Dart语言规范):
用户定义的运算符允许使用以下名称:<,>,< =,> =,==, - ,+,/,/,*,%,|,和& ,<<,>>,[] =,[],。
但是,如果您提供运算符+(...),则在调用operator + =时使用。
我的问题是,如何在不需要创建新实例的情况下影响高效的运算符+ =()?
class DividendBreakdown {
DividendBreakdown(this.qualified, this.unqualified, this.capitalGainDistribution);
bool operator==(DividendBreakdown other) =>
identical(this, other) ||
qualified == other.qualified &&
unqualified == other.unqualified &&
capitalGainDistribution == other.capitalGainDistribution;
num qualified = 0.0;
num unqualified = 0.0;
num capitalGainDistribution = 0.0;
DividendBreakdown.empty();
DividendBreakdown operator +(DividendBreakdown other) {
return new DividendBreakdown(qualified + other.qualified,
unqualified + other.unqualified,
capitalGainDistribution + other.capitalGainDistribution);
}
}
答案 0 :(得分:3)
除非你也改变了+运算符的行为,否则你不能这样做。 + =运算符和其他复合赋值运算符只是普通运算符的简写,然后是立即赋值。
无法在+运算符中提取额外信息以确定是否立即执行赋值,因此在未执行赋值的情况下,必须始终返回新实例。
相反,请使用您自己的方法:
DividendBreakdown add(DividendBreakdown other) {
//...
}
答案 1 :(得分:0)
您可以从另一个角度解决效率问题。例如,如果你有两个巨大的复杂集合,而+运算符将它们组合到新的集合中,它可能会很慢。但是,不是直接组合这些集合并创建新集合,而是可以实现特殊的集合视图,这些集合视图将代表它们的组合并执行繁重的任务,并按需提供。懒惰的风格。
答案 2 :(得分:-1)
如果您愿意,可以退回此(或其他)
class Point {
int x;
int y;
Point(this.x, this.y);
Point operator +(Point other){
this.x = x + other.x;
this.y = y + other.y;
return this;
}
String toString(){
return "Point: x: $x, y: $y";
}
}
用法:
Point p1 = new Point(1,1);
Point p2 = new Point(2,2);
print((p1+p2));
结果:点:x:3,y:3