我正在学习Scala,想知道为什么...
val capacity : Int
替代
val Int capacity.
有没有特殊的原因选择这样做?如果没有,那么我认为离开Java的声明方式不是一个好的选择。这会使从Java到Scala的过渡更加容易(虽然不会太多,但也有一点)。
我正在学习Scala,想知道为什么...
val capacity : Int
替代
val Int capacity.
有没有特殊的原因选择这样做?如果没有,那么我认为离开Java的声明方式不是一个好的选择。这会使从Java到Scala的过渡更加容易(虽然不会太多,但也有一点)。
大多数情况下,您可以省略Int部分。Scala比Java具有更整洁的类型推断系统。
我记得在某处读到过 Martin Odersky 本人说过这个决定也是出于提高可读性的考虑。例如,可以比较一下
val Double number = ...
val Array[(Seq[String], Map[Seq[String], Double])] something = ...
val String pattern = ...
使用
val number : Double = ...
val something : Array[(Seq[String], Map[Seq[String], Double])] = ...
val pattern : String = ...
大多数情况下,你需要快速地(视觉上)找到引用/方法的名称,而不是类型。
x: T是逻辑学和许多编程语言中类型的标准符号。 C及其后代,包括Java在内,偏离了这一点。但C的类型符号真的很糟糕(尝试写出一些中等复杂的高阶函数(如map)的类型)。
此外,使用这种符号可以轻松省略类型(如Wysawyg已经写过),或在表达式中添加一个类型。
Wysawyg的声明如下:
val capacity = 2
val
来完成此操作。trait Foo {
def capacity = 2 // Allow child classes to override and decide the value later
}
// Force instances of Bar to set the value
class Bar( override val capacity : Int ) extends Foo
// Have Bat determine it on the fly
trait Bat extends Foo {
def onlyAThird : Int
override def capacity = onlyAThird * 3
}
我试图将这个作为评论插入,但是,没有格式。
(我尝试将此作为注释插入,但遗憾的是,没有格式。)def
?此外:这里似乎将 def
解释为“默认值”。 - user unknowndef
是关于评估时间的。如果我们说 val capacity = 2
,你不能让 Bat
扩展 Foo
并使用一个可以动态确定容量的函数。 - Tristan Juricekdef
,以使其可以被方法覆盖。val
只能被另一个 val
覆盖。 - user unknown我认为丹尼尔想到了类似的事情:
val a = 7
val b: Int = 8
var x = "Foo"
var y: String = "Bar"
def sum (a: Int, b: Int) = a + b
def mul (a: Int, b: Int): Int = a * b
类型通常可以推断出来。