Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala有Rubocop吗? 当我做Rails应用程序时,我经常使用它来帮助确保我的代码是干净的、高达标准的和可读的。_Scala - Fatal编程技术网

Scala有Rubocop吗? 当我做Rails应用程序时,我经常使用它来帮助确保我的代码是干净的、高达标准的和可读的。

Scala有Rubocop吗? 当我做Rails应用程序时,我经常使用它来帮助确保我的代码是干净的、高达标准的和可读的。,scala,Scala,我现在正在学习Scalatra,我想知道是否有一个类似于RuboCop的插件可以检查代码的样式,并在您可能正在编写“脏代码”时向您发出警告。对于经验丰富的Scala开发人员来说,这可能不需要,但对于初学者来说,这是天赐良机。在编译器选项中启用-Xlint。如果您有空闲时间,还可以打开-Xfatal warnings。在这两种情况下,您都将了解到如何编写更安全的Scala代码 一旦你完成了这个练习,设置,这是一个更加固执己见的linting工具。您可能不同意除疣器附带的所有规则——我不确定我是否同

我现在正在学习Scalatra,我想知道是否有一个类似于RuboCop的插件可以检查代码的样式,并在您可能正在编写“脏代码”时向您发出警告。对于经验丰富的Scala开发人员来说,这可能不需要,但对于初学者来说,这是天赐良机。

在编译器选项中启用
-Xlint
。如果您有空闲时间,还可以打开
-Xfatal warnings
。在这两种情况下,您都将了解到如何编写更安全的Scala代码

一旦你完成了这个练习,设置,这是一个更加固执己见的linting工具。您可能不同意除疣器附带的所有规则——我不确定我是否同意,但您也可以通过尝试遵守这些规则(以及在您不认为规则的目标实际上是疣的情况下与和公司争论)学到很多东西

还有一些面向语法和样式的工具,如(在上面的评论中提到的),可以确保您没有混合制表符和空格或其他东西(公平地说,Scalastyle没有那么肤浅)。这些东西可能有用,但我个人并不觉得它们很有趣


最后请注意,Scala的最佳静态分析工具是
scalac
本身(即使没有启用
-Xlint
)。RuboCop这样的工具有两个主要目标:鼓励您编写更惯用、可读的代码,以及尝试在运行时发生之前捕获可能在运行时发生的问题。在编译语言中(特别是具有丰富类型系统(如Scala)的编译语言),编译器本身可以在代码中的问题在运行时崩溃之前捕获它们。在编译器选项中启用
-Xlint
。如果您有空闲时间,还可以打开
-Xfatal warnings
。在这两种情况下,您都将了解到如何编写更安全的Scala代码

一旦你完成了这个练习,设置,这是一个更加固执己见的linting工具。您可能不同意除疣器附带的所有规则——我不确定我是否同意,但您也可以通过尝试遵守这些规则(以及在您不认为规则的目标实际上是疣的情况下与和公司争论)学到很多东西

还有一些面向语法和样式的工具,如(在上面的评论中提到的),可以确保您没有混合制表符和空格或其他东西(公平地说,Scalastyle没有那么肤浅)。这些东西可能有用,但我个人并不觉得它们很有趣


最后请注意,Scala的最佳静态分析工具是
scalac
本身(即使没有启用
-Xlint
)。RuboCop这样的工具有两个主要目标:鼓励您编写更惯用、可读的代码,以及尝试在运行时发生之前捕获可能在运行时发生的问题。在编译语言中(特别是具有丰富类型系统(如Scala)的编译语言),编译器本身可以做大量工作,在代码中的问题在运行时崩溃之前捕获它们。

其他已经提到的-Xlint、ScalaStyle、WartRemover等。,让我来概括一下纯粹主义和非纯粹主义

我认为被认为是“好”的东西不是通用的,它取决于用例。当然,只使用VAL而不使用VAR、使用漂亮的尾部递归编写所有内容、使用Monad都是很棒的,但是尾部递归并不总是可能的,当递归无法得到优化时,您可能会崩溃,甚至Scala的理解转换为map/flatMap/foreach,这比while循环要慢。对于RESTful WS和其他Scalatra内容,您可能不关心这一点,因为我怀疑您是否有自己的深度递归代码,而且Scala比Ruby快得多,谁会关心For construction和while循环性能。所以,我假设您在这种情况下仍然是一个纯粹主义者,这就是为什么现在是使用上述工具学习最佳实践的好时机


然而,当一个人试图从应用程序中挤出最后一点性能时,他很少是一个纯粹主义者。当您进一步了解Scala时,可以将纯粹的代码与ApacheSpark的内部代码进行比较——出于性能原因,在许多地方,它们使用while循环代替理解(或map/flatMap等)。代码有时可能看起来很糟糕,一个纯粹主义者可能会心脏病发作,但这有一个特定的原因——设计师们对Scala非常了解,他们自己也是纯粹主义者,但出于优先考虑的特定原因,他们选择了其他方式。我认为我们需要“自由宗教”——在99%的时间里做一个纯粹主义者是好事,但是当代价太高,你真的知道为什么违反规则和后果是什么时候,试着考虑其他的选择。也就是说,正如Travis所提到的,对于初学者来说,纯粹主义是好的,因为他们需要了解哪些好的实践在大多数情况下都是有效的,并且只有在情有可原的情况下,您才可以决定编写非纯粹主义代码:)

其他已经提到的代码-Xlint、ScalaStyle、WartRemover等。,让我来概括一下纯粹主义和非纯粹主义

我认为被认为是“好”的东西不是通用的,它取决于用例。当然,只使用VAL而不使用VAR、使用漂亮的尾部递归编写所有内容、使用Monad都是很棒的,但是尾部递归并不总是可能的,当递归无法得到优化时,您可能会崩溃,甚至Scala的理解转换为map/flatMap/foreach,这比while循环要慢。对于RESTful WS和其他Scalatra内容,您可能不关心这一点,因为我怀疑您是否有自己的深度递归代码,而且Scala比Ruby快得多,谁会关心呢