2012-03-11 39 views
9

我已经接受了许多其他语言的强调,它们具有与标识符中的字母一样多的自由度。因此,_vv_。此外,尾部下划线为建议使用以避免含有保留关键字的歧义(class_,case_)。标识符下划线的斯卡拉风格指南

val abc_=0 
<console>:1: error: '=' expected but integer literal found. 
     val abc_=0 

下划线是Scala的类型系统的重要组成部分,什么是推荐的方式在标识符使用它们,让解析器和人都可以是幸福?下划线标识符带来的所有可能的含糊之处是什么?

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


相关问题:

+2

查看[风格指南](http://docs.scala-lang.org/style/naming-conventions.html)。 – agilesteel 2012-03-11 15:39:02

+4

我从来没有见过'class_'的东西。我通常会看到有创意的拼写错误(例如'clazz'),或者,如果您用反引号包围它们,Scala可让您使用关键字作为标识符。 – 2012-03-11 15:55:30

+0

@SethTisue,我从Python的PEP8风格指南中得到它。我的错;认为这是一个标准。 – aitchnyu 2012-03-13 05:58:51

回答

15

尾随下划线的是一个糟糕的主意,因为类似的事情是x_+对自己有效的变量名。根本不要使用尾部下划线。

主要的下划线不是很差的想法,但它仍然很难直观地解析像_myfunc _这样的东西。有一些约定使得持有构造函数参数的私有成员始于_class X(x: Int) { private var _x = x }。我的建议是不要这样做。你在混淆。使用myXtheXxLocalxi或您的内部变量的东西。不过,如果你_x,你会有很好的公司;人们会倾向于知道你的意思。

名称中的下划线没有被广泛使用,因为骆驼案件是标准。我所做的一个例外是,我在隐式defs中使用了不需要手动使用的下划线,而是声明了转换发生的原因:例如,tuple2_can_expand可能会添加expand方法来将Tuple2转换为Tuple3

6

只有一个地方你需要下划线标识符:字母数字字符和其他。事实上,这就是你的情况:解析器认为你声明val abc_=,并且在它后面没有=!最常见的用途是“二传手”的方法:

def prop: String // or some other type 
def prop_=(v: String) 

我也看到predicate_?,而不是更多的Java类isPredicate

keyword_不经常使用,但如果您确实使用它们,请不要在空白处吝啬。写,例如,val abc_ = 0。但是对于这个问题,val abc = 0也比val abc=0更具可读性,所以你应该有空白。正如Rex Kerr所说,_privateVariable是可以接受的,但不推荐练习。

+1

你知道为什么“predicate_?”吗?而不是“谓词?”。只是好奇。 – 2012-03-11 18:51:30

+2

@EdStaub首先,您仍然可以编写诸如'x + y'或'x = y'之类的东西,而且我认为解析器不会认为这是一个标识符。 – 2012-03-11 19:21:17