Scala在名字中强调了一下

时间:2011-09-01 23:43:09

标签: scala

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

这背后的技术原因是什么?

我非常习惯于使用_前置辅助函数。还有一些我应该公开的私有函数,所以我可以通过REPL访问它们。其他命名约定,比如使用“helper”后缀似乎很麻烦。

任何想法都将不胜感激!

4 个答案:

答案 0 :(得分:14)

通配符运算符_在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

因此这些问题较少,但当人们正在寻找闭包时,下划线仍然会引起注意。这可能是他们气馁的原因,但说实话,我一直都在使用它们,特别是在隐式defs和内部变量之类的东西中,它们在界面中没有太多或任何曝光。

答案 1 :(得分:5)

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

但我必须承认,我偶尔会在可变对象中使用下划线前缀作为私有变量,如果我想要公开方法的非下划线名称。如果我们可以像Haskell那样使用素数(foo')会很好,但我认为这在词汇上很难。

答案 2 :(得分:2)

除了_在整个语言中使用的someTuple._1不仅仅是一个通配符,还作为公元API的一部分,如元组(_=等),它也被编译器特别解释一些案例。例如, setters ,必须以unary_一元运算符为后缀,必须以{{1}}为前缀。

当有人使用类似但与“特殊名称”不完全相同的东西时,所有这一切都很容易意外地使用“特殊名称”或误解“普通名称”。如果它是偶然发生或由于缺乏知识而无关紧要,但是当它发生时你可能会花费几个小时寻找一个bug。所以除非你真的需要,否则不要使用它们。 DSL一直是个例外。

答案 3 :(得分:1)

我认为这些规格只是在名称中强调

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

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

我认为camelCase而不是embedded_underscores的原因只是java使用它而且当使用java库时,一致性只能保持这样。