为什么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,机会是这个名字是更重要的信息。 将它移动到左侧会使其更加突出,并且一旦习惯风格,代码更具可读性。
其他人体工程学的好处:
- 在
val
,var
或def
之前的成员名称,而不是他们的types,他们都整齐排列在一列。 - 如果你只改变一个成员的types,或者完全放弃推断,那么细化的diff工具将清楚地显示这个名字是不变的
- 同样,在一个val / var / def之间的变化在diff中是非常明显的
- 推理应该被认为是Scala中的默认行为,在某些特定的情况下,你只需要types规范,即使这样做大部分都是为编译器完成的。 所以把它们放在声明的开头就强调了错误的东西。
- “名称:types”而不是“types名称”更符合大多数程序员实际上对一个声明的想法,这是更自然的。
- 指针和数组的不同C / C ++和Java约定(例如,
*
是C / C ++中前缀types的前缀,而不是Java中名称和types的后缀)对新手或语言转换仍然感到困惑,并且在一行中声明多个variables时会导致一些非常实际的错误。 斯卡拉在这里留下任何疑问和困惑的余地。
凯文说得对。 主要的观察是,只要types是简短的关键字,例如int或float ,“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是在它之前和之后声明的。
除此之外,我猜这是一个没有区别的区别。 编译器开发人员当然不会在乎这种或那种方式。