鉴于斯卡拉官方风格指南
http://docs.scala-lang.org/style/method-invocation.html
建议为arity-0调用使用中缀表示法,为arity-0调用使用点表示法,arity-1调用后跟arity-0调用的推荐样式是什么?
例如,这是推荐的方法吗?
(bytes map (_.toChar)).mkString
答案 0 :(得分:3)
样式指南的摘要基本上是:只要简单明了,就使用无点样式。否则,不要。在这种情况下,您的选项是
bytes.map(_.toChar).mkString
(bytes map (_.toChar)).mkString
前者看起来更简单,更清晰,所以它赢了。
真正的长链在无点符号中也不是很清楚
foo bar baz qux quux bippy
再说些什么?
foo.bar(baz).qux(quux).bippy
哦,好的。
务实。无点风格可以干净优雅。良好的编码风格通常会导致您编写看起来不错的代码。但语法的要点是要清楚并避免错误,因此请使用更好的目标来实现目标。
答案 1 :(得分:2)
我不知道是谁写了这本指南,但他看起来肯定有偏见,我建议不要遵循本指南。 Infix符号有很多陷阱,作者没有提及,其好处至少是值得怀疑的。作者使用的论点也不容置疑。
作者争辩说,以下代码使得它看起来像是在函数filter
上调用(_.toUpperCase)
的方法:
names.map (_.toUpperCase).filter (_.length > 5)
但没有人像那样格式化代码。以下是标准做法,它们都没有引起歧义:
names.map(_.toUpperCase).filter(_.length > 5)
names.map( _.toUpperCase ).filter( _.length > 5 )
无参数方法cannot be used in the end of a method calls chain,因为它们从下一行获取术语。
It does not allow splitting to multiple lines。您要么必须引入一些lispy bracketing,要么引入一些place the parameters on the next line。另一个选择是切换回" dot"符号并以inconsistent style结束。
所有这些选项很难被称为提高可读性。
最后,它增加了一层你意图的混淆。即,读者必须分析编译器在实际理解代码之前如何推断点和括号。
我曾经遇到的这种符号的唯一论据是它增加了可读性。虽然这个论点本身有问题,但我发现它几乎不能抵抗这种符号的任何上述缺点,因为它通常会降低可读性。
最一致和安全的标准是仅对运算符使用中缀表示法,即名称为+
,*
,>>=
的方法。