为什么Scalaselectvariables名后的types?

可能重复:
在Scala中有“val容量:Int”而不是“val Int容量”的任何理由

在Scala中,variables声明如下:

var stockPrice: Double = 100. 

types(Double)在标识符(stockPrice)之后。 传统上使用命令式语言,如C,Java,C#,types名称在标识符之前。

 double stock_price = 100.0; 

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

以及支持types推理,这也有一个人体工程学的好处。

对于任何给定的variables名称+types,机会是这个名字是更重要的信息。 将它移动到左侧会使其更加突出,并且一旦习惯风格,代码更具可读性。

其他人体工程学的好处:

  • valvardef之前的成员名称,而不是他们的types,他们都整齐排列在一列。
  • 如果你只改变一个成员的types,或者完全放弃推断,那么细化的diff工具将清楚地显示这个名字是不变的
  • 同样,在一个val / var / def之间的变化在diff中是非常明显的
  • 推理应该被认为是Scala中的默认行为,在某些特定的情况下,你只需要types规范,即使这样做大部分都是为编译器完成的。 所以把它们放在声明的开头就强调了错误的东西。
  • “名称:types”而不是“types名称”更符合大多数程序员实际上对一个声明的想法,这是更自然的。
  • 指针和数组的不同C / C ++和Java约定(例如, *是C / C ++中前缀types的前缀,而不是Java中名称和types的后缀)对新手或语言转换仍然感到困惑,并且在一行中声明多个variables时会导致一些非常实际的错误。 斯卡拉在这里留下任何疑问和困惑的余地。

凯文说得对。 主要的观察是,只要types是简短的关键字,例如intfloat ,“types名称”语法就可以工作得很好:

 int x = 1 float d = 0.0 

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

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

你定义的最重要的部分(名字)被埋在了typesexpression式的后面。 与之比较

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

它说得很清楚

  • 我们在这里定义一个值,而不是一个variables或方法(val)
  • 我们定义的东西的名字是shapeInfo
  • 如果你关心它,这里是types(HashMap […])

之后就可以将它从types推断中删除:

 var stockPrice: Double = 100.0 var stockPrice = 100.0 

然而,命令式语言传统上首先是types的。 例如,Pascal没有。

现在,C做到了,C ++,Java和C#都是基于C的语法,所以自然也是这样做的,但是这与命令式语言完全没有关系。

应该指出的是,即使C不“传统”地定义variables名称之前的types,但确实允许声明是交错的。

 int foo[]; 

其中foo的types是在它之前和之后声明的。

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