Scala:def实际上做了什么?

时间:2016-08-10 01:44:51

标签: scala

在Scala中, def 定义了一个函数,但我不理解下面的代码。 实施例


require: 'ngModel',
link: function(scope, element, attrs, ctrls)

什么是定义? v是变量或函数还是其他任何东西?

2 个答案:

答案 0 :(得分:5)

它是一个总是在Java中返回10.的函数,等效于

public int v() { return 10; }
这可能看起来毫无意义,但差异是真实的,有时候非常有用。例如,假设我定义了一个这样的特征:

trait Wrench {
  val size = 14 //millimeters, the default, most common size
}

如果我需要不同尺寸的扳手,我可以改善特性

val bigWrench = new Wrench {
  override val size = 21
}

但如果我想要一把活动扳手怎么办?

// mutable! not thread safe!
class AdjustableWrench extends Wrench {
  var adjustment = 0

  override val size = 14 + (3 * adjustment) // oops!

  def adjust( turns : Int ) : Unit = {
    adjustment += turns
  }
}

这不会奏效! size永远是14岁!

如果我最初将我的特质定义为

trait Wrench {
  def size = 14 //millimeters, the default, most common size
}

我能够完全按照上面的说法定义bigWrench,因为val可以覆盖def。但现在我也可以写一个功能可调的扳手:

// mutable! not thread safe!
class AdjustableWrench extends Wrench {
  var adjustment = 0

  override def size = 14 + (3 * adjustment) // this works

  def adjust( turns : Int ) : Unit = {
    adjustment += turns
  }
}

最初将size定义为def,而不是基本特征中的val,即使看起来很愚蠢,我保留了使用def覆盖的灵活性或val。定义具有非常简单的默认值的基本特征是很常见的,但是实现可能想要做更复杂的事情。所以像

这样的陈述
def v = 10

并不罕见。

让你更好地了解这些差异,比较这两个:

def vDef = {
  println("vDef")
  10
}

val vVal = {
  println("vVal")
  10
}

vDefvVal只要您访问它们,就会评估为10。但每次访问vDef时,您都会看到副作用,打印出vDef。无论您何时访问vVal,您都会看到vVal仅打印一次。

答案 1 :(得分:1)

v是一个始终返回10的函数。 Java中的等效代码是:

public int v() {
  return 10;
}

另请参阅“Scala编程”一书中的2nd chapter