Scala在名字中强调了一下

Pan*_*Lee 10 scala

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

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

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

任何想法将不胜感激!

Rex*_*err 14

通配符运算符_在Scala中大量使用.所以:

xs map (_.x)  // Call the x method of every element
xs map (_x)   // Pass every element through the _x method
Run Code Online (Sandbox Code Playgroud)

令人困惑.你必须非常仔细地看看是否有下划线.

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

xs map (my_method)  // No similar form where _ stands for the list element
Run Code Online (Sandbox Code Playgroud)

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

  • @flying sheep - 你不可能有那种名字碰撞; 关键在于,当您通过只是稍微熟悉的代码快速阅读时,您不会立即知道本地代码中的私有方法或集合元素上的公共方法是否正在运行.当然,你可以很快找到答案,但是如果你能从远处的形状中辨别出来的话,你可以更快地找出它. (4认同)
  • 这是一个非常构造的案例:你有一个`xs:Seq [T:{def x:U}]`.为了发生错误,你需要一个`_x:{def apply(y:T):U}`.如果不存在这三个约束中的任何一个,则不会编译.它必须完全命名为`_x`,必须可以用一个`T`参数调用,它必须返回一个`U`.我甚至都不相信. (3认同)

Lac*_*lan 5

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

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