在Scala中,为什么要使用“val capacity:Int”而不是“val Int Capacity”?

7

我正在学习Scala,想知道为什么...



val capacity : Int 

替代

val Int capacity.

有没有特殊的原因选择这样做?如果没有,那么我认为离开Java的声明方式不是一个好的选择。这会使从Java到Scala的过渡更加容易(虽然不会太多,但也有一点)。

6个回答

20

大多数情况下,您可以省略Int部分。Scala比Java具有更整洁的类型推断系统。


如果您添加一个带有类型和不带类型的示例,将更明显地说明原因。 - Daniel C. Sobral
1
取决于情况。有时候当右侧代码很复杂(特别是在构建API时),你应该注释类型,因为它可以在编译时捕获许多错误。 - Raphael

10

我记得在某处读到过 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 = ...

大多数情况下,你需要快速地(视觉上)找到引用/方法的名称,而不是类型。


8

x: T是逻辑学和许多编程语言中类型的标准符号。 C及其后代,包括Java在内,偏离了这一点。但C的类型符号真的很糟糕(尝试写出一些中等复杂的高阶函数(如map)的类型)。

此外,使用这种符号可以轻松省略类型(如Wysawyg已经写过),或在表达式中添加一个类型。


2
这是一个关于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 unknown
1
啊,def 是关于评估时间的。如果我们说 val capacity = 2,你不能让 Bat 扩展 Foo 并使用一个可以动态确定容量的函数。 - Tristan Juricek
我想我现在明白了。你只需将其定义为 def,以使其可以被方法覆盖。val 只能被另一个 val 覆盖。 - user unknown

2
在《Scala编程》一书中,提到这种语法的技术原因在于它可以更轻松地进行类型推断。

5
仅通过类型的放置,如何使类型推断更容易?您可以将两者转换为完全相同的 AST。 - Raphael

0

我认为丹尼尔想到了类似的事情:

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

类型通常可以推断出来。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接