2011-05-22 48 views
35

可能重复:
Any reason for having “val capacity : Int” instead of “val Int Capacity” in Scala为什么Scala选择变量名后的类型?

在Scala中变量的声明像:

var stockPrice: Double = 100. 

凡型(双)如下所述标识符(stockPrice)。传统上,在诸如C,Java,C#等命令式语言中,类型名称位于标识符之前。

double stock_price = 100.0; 

它纯粹是一种味道的问题,还是最终有类型名称帮助编译器以任何方式?去也有相同的风格。

+0

C,Java和C#都来自C.Pascal,例如,使用与Scala相同的样式。 – 2011-05-22 02:07:03

+0

不知道关于帕斯卡。谢谢。 – Rohit 2011-05-22 02:22:57

+4

我不确定要合并的意图关闭这个问题。这个人更有可能出现在搜索中,除非搜索者足够幸运,以至于他们碰巧在询问一个名为'capacity'的变量。 – 2011-05-22 11:26:11

回答

51

除了支持类型推断,这有一个人体工程学的优势了。

对于任何给定的变量名+型,有机会,名称是信息的比较重要的一块。将它移动到左侧会更显眼,并且一旦习惯风格,代码更具可读性。

人机工程学益处:

  • 随着valvardef成员名称之前,而不是它们的类型,它们都整齐地列排队。
  • 如果您更改成员的只是类型,或者完全赞成推断放弃它,然后细粒度差异工具将清楚地表明,名字是没有改变的
  • 同样,VAL之间变化的/ var/DEF是的diff
  • 推断,应考虑在Scala中默认行为是很清楚,你只需要在某些特定的场景类型规格,即使在当时它主要用于编译器完成。因此,把它们放在声明的开头就强调了错误的东西。
  • “名称:类型”而不是“类型名称”更符合大多数程序员实际考虑声明的方式,这更自然。
  • 针对指针和数组的不同C/C++和Java约定(例如,*是以下名称的前缀,而不是C/C++中前一种类型的后缀,或者[]是名称和类型中的有效后缀Java)对新手或语言转换仍然感到困惑,并且在单行声明多个变量时会导致一些非常真实的错误。斯卡拉在这里没有留下任何疑问和困惑的余地。
+9

我认为看到像Eclipse这样的Java IDE也首先显示名字也很有趣。不在源代码中,但例如在代码大纲中。 – 2011-05-22 10:27:31

+0

@Mirko - 非常真实... – 2011-05-22 11:01:57

15

这事后,以便它可以为类型推断被删除:

var stockPrice: Double = 100.0 
var stockPrice = 100.0 

然而,真实的命令式语言,通常有类型的第一位。例如,帕斯卡尔没有。现在

,C这样做,和C++,Java和C#是基于C的语法,所以他们自然这样做的太多,但有绝对无关,与命令式语言。

+0

你能否解释一下你的意思是“删除类型推断”?谢谢。 – Rohit 2011-05-22 02:17:44

+0

@Rohit看看这个例子,类型被删除,以便它可以被推断出来。 – 2011-05-22 02:40:43

+3

我不认为特别是类型定位可以将它们排除在外。 – Raphael 2011-05-22 09:00:58

4

应当指出的是,即使C没有“传统”定义变量名前的类型,但确实允许声明应交错。

int foo[]; 

其中foo的类型是之前和之后它宣布,词法。

除此之外,我猜这是一个没有差异的区别。编译器开发人员当然不会在意这种或那种方式。

+0

+1只是因为这是关于C语法的非常独特的观察。让我希望我在大学读编译原理或读龙书... – 2011-05-22 08:44:16

62

凯文说得没错。主要观察的是,“类型名称”语法的伟大工程只要类型是短关键字,如INT浮动

int x = 1 
float d = 0.0 

对于一个价格,你得到两条信息:“一个新的定义从这里开始“,”这里是定义的(结果)类型“。但是我们现在已经过去了简单原始类型的领域。如果你写

HashMap<Shape, Pair<String, String>> shapeInfo = makeInfo() 

你定义(名称)的最重要的部分是埋在类型表达式后面。与

val shapeInfo: HashMap[Shape, (String, String)] = makeInfo() 

比较它说清楚

  • 我们在这里定义的值,而不是一个变量或方法(VAL)
  • 的我们定义的东西的名字是shapeInfo
  • 如果你关心关于它,这里是类型(HashMap [...])
+3

感谢您的信任投票:) – 2011-05-22 11:05:10

相关问题