如何建立一个有效的运算符+ =

时间:2014-06-03 18:50:53

标签: dart

看起来 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);
  }
}

3 个答案:

答案 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