Scala在名称中加下划线

Scala在名称中加下划线,scala,Scala,我已经阅读了多个样式指南和其他参考资料,指出在方法/变量/其他名称中使用下划线是个坏主意 这背后的技术原因是什么 例如,我非常习惯于使用x预结束helper函数。还有一些功能应该是私有的,我想公开,这样我就可以通过REPL访问它们。其他命名约定,如使用“helper”后缀似乎很麻烦 任何想法都将不胜感激 我认为这些规范只是在名称中使用下划线 如果不是这样,你应该用什么(理智的)方式写下面的内容 object getterSetter { var _variable: Option[Dou

我已经阅读了多个样式指南和其他参考资料,指出在方法/变量/其他名称中使用下划线是个坏主意

这背后的技术原因是什么

例如,我非常习惯于使用x预结束helper函数。还有一些功能应该是私有的,我想公开,这样我就可以通过REPL访问它们。其他命名约定,如使用“helper”后缀似乎很麻烦


任何想法都将不胜感激

我认为这些规范只是在名称中使用下划线

如果不是这样,你应该用什么(理智的)方式写下面的内容

object getterSetter {
    var _variable: Option[Double] = None
    def variable = _variable
    def variable_=(newVal: Double) { _variable = Some(newVal) }
}

我认为之所以使用
camelCase
而不是
embedded_下划线
,原因很简单,因为java使用了它,在使用java库时,一致性只能保持这样。

我只知道我在名称中避免使用下划线的原因:它们是Scala语法的一个重要部分,随处可见。当然,您可以将它们命名,但根据我的经验,它往往会减慢人类解析器的速度


但我必须承认,如果我希望公共方法使用非下划线名称,我确实偶尔会在可变对象中使用下划线前缀作为私有变量。如果我们能像Haskell那样使用素数(foo'),那就太好了,但我认为这在词汇上是很困难的。

通配符操作符
\uu
在Scala中被大量使用。因此:

xs map (_.x)  // Call the x method of every element
xs map (_x)   // Pass every element through the _x method
这令人困惑。您必须非常仔细地查看下划线是否有前缀

但是,内部下划线更难混淆:

xs map (my_method)  // No similar form where _ stands for the list element

因此,这些问题较少,但在寻找闭包时,下划线仍然有点引人注目。这可能是他们感到沮丧的原因,但老实说,我一直在使用他们,特别是在隐式def和内部变量这样的东西中,它们在接口中不会有太多或任何暴露。

除了
在语言中被广泛使用,不仅作为通配符,而且作为公共API的一部分,如元组(
someTuple.\u 1
等)在某些情况下,编译器也会对其进行特殊解释。例如,在setters中,必须以
作为后缀,或在一元运算符中,必须以
一元
作为前缀


所有这些都使得人们很容易无意中使用“特殊名称”,或者当有人使用与“特殊名称”相似但不完全相同的名称时,误解“普通名称”。不管它是偶然发生的还是由于缺乏知识,但当它发生时,你可能会花几个小时寻找一个bug。所以不要使用它们,除非你真的需要。DSL始终是一个例外。

在前面加下划线是一种惯例;你还得把它声明为私人的。此外,您可以使用
variableHidden
或任何其他东西来代替
\u variable
。哦,您是对的。一定是搞错了。但是
变量隐藏
?说真的吗?我也使用了
\u变量
,但雷克斯·克尔答案中的论点很有趣。@Alexey:不完全是。这是一个非常复杂的例子:你有一个
xs:Seq[T:{def x:U}]
。要发生错误,您需要一个
\ux:{def apply(y:T):U}
。如果这三个约束中的任何一个不存在,它就不会编译。它必须准确命名为
\ux
,必须可以使用单个
T
参数调用,该参数必须返回
U
。“飞羊”——你不太可能有这样的名字冲突;关键是,当您快速阅读一些熟悉的代码时,您无法立即知道是本地代码中的私有方法还是集合元素中的公共方法在起作用。当然,你们可以很快地计算出来,但若你们能从远处的形状辨别出来,你们可以更快地计算出来。