Scala arity-1调用后接arity-0调用的推荐样式

Scala arity-1调用后接arity-0调用的推荐样式,scala,Scala,鉴于官方的Scala风格指南 建议对arity-1调用使用中缀表示法,对arity-0调用使用点表示法。对于arity-1调用后接arity-0调用,建议使用什么样式 例如,这是推荐的方式吗 (bytes map (_.toChar)).mkString 我不知道这本指南是谁写的,但他显然有偏见,我建议不要遵循这本指南。中缀符号有很多陷阱,作者没有提到,它的好处至少是值得怀疑的。作者使用的论点也同样值得怀疑 作者认为,下面的代码使它看起来像是对函数(u.toUpperCase)调用的方法过滤

鉴于官方的Scala风格指南

建议对arity-1调用使用中缀表示法,对arity-0调用使用点表示法。对于arity-1调用后接arity-0调用,建议使用什么样式

例如,这是推荐的方式吗

(bytes map (_.toChar)).mkString

我不知道这本指南是谁写的,但他显然有偏见,我建议不要遵循这本指南。中缀符号有很多陷阱,作者没有提到,它的好处至少是值得怀疑的。作者使用的论点也同样值得怀疑

作者认为,下面的代码使它看起来像是对函数
(u.toUpperCase)
调用的方法
过滤器

但是没有人会这样格式化代码。以下是标准实践,它们都不会对此类行为产生歧义:

names.map(_.toUpperCase).filter(_.length > 5)

names.map( _.toUpperCase ).filter( _.length > 5 )
中缀符号的陷阱
  • 无参数方法

  • 无参数方法,因为它们从下一行获取术语

  • 。你要么要介绍一些,要么就很糟糕。另一个选择是切换回“点”符号,并以一个符号结束

    所有这些选项都不能称为增加可读性

  • 它繁殖

  • 最后,它为你的意图增加了一层模糊。也就是说,读者在真正理解代码之前,必须分析编译器将如何推断点和大括号

  • 结论 我所见过的关于这种符号的唯一论点是它增加了可读性。虽然这个论点本身是有问题的,但我发现它很难反对这种符号的任何上述缺点,因为它常常降低可读性


    最一致、最安全的标准是只对操作员使用中缀符号,即名称为
    +
    *
    >=

    的方法。我不知道这本指南是谁写的,但他显然似乎有偏见,我建议不要遵循这本指南。中缀符号有很多陷阱,作者没有提到,它的好处至少是值得怀疑的。作者使用的论点也同样值得怀疑

    作者认为,下面的代码使它看起来像是对函数
    (u.toUpperCase)
    调用的方法
    过滤器

    但是没有人会这样格式化代码。以下是标准实践,它们都不会对此类行为产生歧义:

    names.map(_.toUpperCase).filter(_.length > 5)
    
    names.map( _.toUpperCase ).filter( _.length > 5 )
    
    中缀符号的陷阱
  • 无参数方法

  • 无参数方法,因为它们从下一行获取术语

  • 。你要么要介绍一些,要么就很糟糕。另一个选择是切换回“点”符号,并以一个符号结束

    所有这些选项都不能称为增加可读性

  • 它繁殖

  • 最后,它为你的意图增加了一层模糊。也就是说,读者在真正理解代码之前,必须分析编译器将如何推断点和大括号

  • 结论 我所见过的关于这种符号的唯一论点是它增加了可读性。虽然这个论点本身是有问题的,但我发现它很难反对这种符号的任何上述缺点,因为它常常降低可读性


    最一致和最安全的标准是仅对运算符使用中缀符号,即名称为
    +
    *
    >=

    的方法。样式指南的摘要基本上是:只要简单明了,就使用无点样式。否则,不要。在这种情况下,您的选项是

    bytes.map(_.toChar).mkString
    (bytes map (_.toChar)).mkString
    
    而前者在我看来更简单更清晰,所以它赢了

    真正的长链在无点表示法中也不是很清楚

    foo bar baz qux quux bippy
    
    再说一遍

    foo.bar(baz).qux(quux).bippy
    
    哦,好的


    要务实。无点风格可以干净优雅。好的编码风格通常会使您编写的代码看起来很好,而且没有点。但是语法的要点是要清楚并避免错误,所以使用更好的方法来达到目的。

    样式指南的总结基本上是:只要简单明了,就使用无点样式。否则,不要。在这种情况下,您的选项是

    bytes.map(_.toChar).mkString
    (bytes map (_.toChar)).mkString
    
    而前者在我看来更简单更清晰,所以它赢了

    真正的长链在无点表示法中也不是很清楚

    foo bar baz qux quux bippy
    
    再说一遍

    foo.bar(baz).qux(quux).bippy
    
    哦,好的


    要务实。无点风格可以干净优雅。好的编码风格通常会使您编写的代码看起来很好,而且没有点。但是语法的要点是要清楚并避免错误,所以使用更好的方法来实现目标。

    我完全不同意你的选择。我发现不带“.”的
    map
    和不带“.”的
    filter
    更具可读性。请告诉我这个“标准”在哪里?@wheaties这种可读性是以不一致性和潜在错误为代价的,我在回答的更新中描述了这一点。我提到的标准是我在Scala中处理的大多数代码中看到的标准。在大多数情况下,基本Scala库也遵循它。这很好,但我仍然不同意。这就是观点的有趣之处,不是吗P@wheaties嗯,我已经提出了论点,所以这不仅仅是一个观点。如果你提出了一些相反的论点,这会很有帮助,因为你不同意。Con 1是错误的,如果你用中缀运算符终止一行,你可以在下一行继续表达式。它在REPL中工作不好,但在编译代码或使用
    :paste
    时没有问题。我完全不同意您的选择。我发现不带“.”的
    map
    和不带“.”的
    filter
    更具可读性。请让我看看这个“立场”