在Scala中, def 定义了一个函数,但我不理解下面的代码。 实施例
require: 'ngModel',
link: function(scope, element, attrs, ctrls)
什么是定义? v是变量或函数还是其他任何东西?
答案 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
}
vDef
和vVal
只要您访问它们,就会评估为10。但每次访问vDef时,您都会看到副作用,打印出vDef
。无论您何时访问vVal
,您都会看到vVal
仅打印一次。
答案 1 :(得分:1)