直接获取价值或通过Scala中的方法获取价值?

时间:2016-10-04 09:48:14

标签: scala

如果没有参数,可以定义没有paranthesis的方法。一个特殊的用例是使用它来获取值。我应该这样做,还是直接获得价值?

所以

class Complex(real: Double, imaginary: Double) {
  def re = real
  def im = imaginary
  override def toString() =
    "" + re + (if (im < 0) "" else "+") + im + "i"
}

class Complex(real: Double, imaginary: Double) {
  val re = real
  val im = imaginary
  override def toString() =
    "" + re + (if (im < 0) "" else "+") + im + "i"
}

2 个答案:

答案 0 :(得分:2)

您可以将val放在构造函数参数前面,使其更短一些,这与您的第二段代码实际上相同:

class Complex(val re: Double, val im: Double) {
  override def toString() = "" + re + (if (im < 0) "" else "+") + im + "i"
}

请注意,def定义方法,而val定义最终成员变量。由于这两种方法的返回值是固定的,因此没有理由使它们成为方法。因此,在这种情况下,请使用val代替def

答案 1 :(得分:1)

更好:将其设为案例类:

case class Complex(re: Double, im: Double) {
   override def toString() = "%f%+fi".format(re,im)
}

这会为您提供reim成员,以及一些额外的优惠,例如copy

val a = Complex(1,2)
val realA = a.copy(im = 0)

unapply

def isImaginary(a: Complex) = a match {
   case Complex(0, _) => true
   case _ => false
}

def abs(a: Complex) = a match {
   case Complex(re, im) => re*re + im*im
}

以及equalshashCode