2009-12-12 29 views
8

我读Scala和我想知道的,而不是 “VAL诠释能力” ...
为什么任何理由为:在斯卡拉

val capacity : Int 

,而不是

val Int capacity. 
“VAL能力诠释”

为什么选择这个任何理由。如果不是的话,在我看来,这似乎不是一个很好的选择,可以摆脱Java的声明方式。本来会让从Java到Scala的过渡变得更容易(不是太多,而是一点点)

回答

20

因为大部分时间你都可以离开Int部分。与Java相比,Scala有一个更简洁的类型推断系统。

+0

如果你添加一个带有和不带有类型的例子,它会使原因更加明显。 – 2009-12-12 03:12:56

+1

取决于。有时当右手站点很复杂时(特别是在构建API时),应该在编译时捕获许多错误。 – Raphael 2011-03-17 12:00:12

8

x:T是逻辑和许多编程语言中的类型的标准表示法。 C及其后代,其中Java与此背道而驰。但是C的类型符号确实很糟糕(试着写下一些中等复杂的高阶函数,比如map)。另外,使用这种表示法很容易省略类型(如Wysawyg已经写过的),或者在表达式中添加一个类型。

2

下面是一个例子来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 
} 

(我试图插入这是一个评论,但很可惜,没有格式。)

+0

为什么你使用'def'作为字面常量?此外:顺便说一句,'def'在这里似乎被解释为'default'。 – 2011-03-17 09:00:12

+1

啊,“def”大约是评估时间。如果我们说'val capacity = 2',你不能让'Bat'扩展'Foo'来确定飞行中的容量。 – 2011-03-17 21:25:38

+0

我想我现在明白了。你可以将它定义为'def',以便通过方法覆盖它。一个val只能被另一个val覆盖。 – 2011-03-17 23:32:04

2

编程在斯卡拉它说技术原因语法是它使类型推理更容易。

+4

单独放置类型如何使类型推断更容易?您可以将两者转换为完全相同的AST。 – Raphael 2011-03-17 12:06:23

+0

可能是“人类读者”。 :-) – soc 2012-06-15 11:52:47

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 

类型通常可以推断出。

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 = ... 

大多数时候,你需要找到名称引用时间/注资方式快速(视觉),而不是类型。