我读Scala和我想知道的,而不是 “VAL诠释能力” ...
为什么任何理由为:在斯卡拉
val capacity : Int
,而不是
val Int capacity.
“VAL能力诠释”
为什么选择这个任何理由。如果不是的话,在我看来,这似乎不是一个很好的选择,可以摆脱Java的声明方式。本来会让从Java到Scala的过渡变得更容易(不是太多,而是一点点)
我读Scala和我想知道的,而不是 “VAL诠释能力” ...
为什么任何理由为:在斯卡拉
val capacity : Int
,而不是
val Int capacity.
“VAL能力诠释”
为什么选择这个任何理由。如果不是的话,在我看来,这似乎不是一个很好的选择,可以摆脱Java的声明方式。本来会让从Java到Scala的过渡变得更容易(不是太多,而是一点点)
因为大部分时间你都可以离开Int部分。与Java相比,Scala有一个更简洁的类型推断系统。
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'在这里似乎被解释为'default'。 – 2011-03-17 09:00:12
啊,“def”大约是评估时间。如果我们说'val capacity = 2',你不能让'Bat'扩展'Foo'来确定飞行中的容量。 – 2011-03-17 21:25:38
我想我现在明白了。你可以将它定义为'def',以便通过方法覆盖它。一个val只能被另一个val覆盖。 – 2011-03-17 23:32:04
我认为丹尼尔想到了这样的事情:
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
类型通常可以推断出。
我想我读了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 = ...
大多数时候,你需要找到名称引用时间/注资方式快速(视觉),而不是类型。
如果你添加一个带有和不带有类型的例子,它会使原因更加明显。 – 2009-12-12 03:12:56
取决于。有时当右手站点很复杂时(特别是在构建API时),应该在编译时捕获许多错误。 – Raphael 2011-03-17 12:00:12