标识符中下划线的Scala样式指南

Jes*_*ose 10 scala

我已经从许多其他语言中接受了下划线与标识符中的字母表一样多的自由度.因此_vv_.此外,建议使用尾随下划线以避免使用保留关键字(class_,case_)模糊不清.

val abc_=0
<console>:1: error: '=' expected but integer literal found.
       val abc_=0
Run Code Online (Sandbox Code Playgroud)

下划线是Scala打字系统的重要组成部分,在标识符中使用它们的推荐方法是什么,这样解析器和人类都可以满意?带下划线的标识符带来的所有可能的歧义是什么?

领先的空白似乎增加了混乱_class而不是class_.


相关问题:

Rex*_*err 16

尾随下划线是一个坏主意,因为x_+它们本身就是有效的变量名.根本不要使用尾随下划线.

领先的下划线不是一个想法,但它仍然很难在视觉上解析像_myfunc _.有一些约定使私有成员持有相同名称的构造函数参数_:class X(x: Int) { private var _x = x }.我的建议是不要这样做.你要求混淆.对内部变量使用myXtheXxLocalxi其他东西.不过,如果你做的跟去_x,你就会有很好的公司; 人们会倾向于知道你的意思.

名称中的下划线未被广泛使用,因为驼峰是标准.我做的例外是我在隐式defs中使用了不希望手动使用的下划线,而是说明转换发生的原因:例如,tuple2_can_expand可以添加一个expand方法将a转换Tuple2为a Tuple3.


Ale*_*nov 6

标识符中只有一个地方需要下划线:在字母数字字符和其他字符之间.事实上,这正是你的情况发生的事情:解析器认为你在​​声明val abc_=并且没有=它!最常见的用途是"setter"方法:

def prop: String // or some other type
def prop_=(v: String)
Run Code Online (Sandbox Code Playgroud)

我也看到过predicate_?而不是更像Java isPredicate.

keyword_不经常使用,但如果你使用它们,不要吝啬空白.写,例如,val abc_ = 0.但就此而言,val abc = 0更具可读性val abc=0,所以无论如何你都应该有空白.正如Rex Kerr所说,_privateVariable可以接受,但不建议练习.

  • @EdStaub主要是因为你仍然可以编写像`x + y`或`x = y`这样的东西,而不是解析器认为这是一个单一的标识符,我想. (2认同)