当构建一个嵌套对象(它将列表作为其输入,使用::构建列表)时,自动格式会产生误导:
val sentimentExpectedSchema = StructType(
StructField("metadata", StructType(
StructField("type", StringType, nullable = false) ::
StructField("job_run_time", LongType, nullable = false) ::
StructField("version", LongType, nullable = false) :: Nil
)) :: Nil
)第一印象是,job_run_time 嵌套在 type**,中,这不是真的。**
我希望使用以下格式规则:
val sentimentExpectedSchema = StructType(
StructField("metadata", StructType(
StructField("type", StringType, nullable = false) ::
StructField("job_run_time", LongType, nullable = false) ::
StructField("version", LongType, nullable = false) :: Nil
)) :: Nil
)通过这种方式,很明显,job_run_time 和 type 处于相同的嵌套级别。
此外,如果一个人“正常地”构建Array/List,那么它将被正确地格式化:
val sentimentExpectedSchema = StructType(Array(
StructField("metadata", StructType(Array(
StructField("type", StringType, nullable = false),
StructField("job_run_time", LongType, nullable = false),
StructField("version", LongType, nullable = false)
)))
))是否有一种方法可以自定义我的::配置,以正确格式化使用生成的列表,因为它使用 Array()/List()**?**进行格式设置
发布于 2022-06-20 12:14:09
我怀疑您是否总是能够在:: Nil上强制使用新行,并且始终将所有的first :: second :: third :: Nil都对齐到同一列-- ::只是infix,除了以:结尾的方法在infix表示法中具有相反的顺序之外,从语言的角度来看,这并没有什么特别之处。它总是以缩进的方式缩进,就像它是x.call(y).call(z)一样,第一个元素的缩进比下面的链少一个。
但是,您可以尝试将标量添加到您的项目中,并尝试各种配置选项,以确定哪个配置选项足够明确。
配置示例可以如下所示:
// put into .scalafmt.conf in the root of your project
version = 2.6.3
align = most
trailingCommas = preserve
maxColumn = 120
newlines.afterInfix = many,keep
newlines.afterInfixBreakOnNested = true尝试一些选项,看看哪一个最适合你。使用我在当前项目中使用的格式:
val sentimentExpectedSchema = StructType(
StructField(
"metadata",
StructType(
StructField("type", StringType, nullable = false) ::
StructField("job_run_time", LongType, nullable = false) ::
StructField("version", LongType, nullable = false) :: Nil
)
) :: Nil
)这应该足以使人产生job_run_time嵌套到type的错误印象。至少对于我和其他习惯使用这种样式的人来说-- ::链比包含它们的StructType嵌套得更深,而且每一行都足够短,可以看到它以::结尾。如果看到这个::太长了,它就会被分解,嵌套元素的缩进会更多。
(作为奖励,此配置将由IntelliJ自动导入,因此参与项目的每个人都将使用相同的设置。您还可以在CI或sbt插件编译期间强制检查此格式)。
如果这仍然不能满足您的需要,那么只需接受这样一个事实:::链只是方法链,永远不会有与varargs相同的格式,如果您使用scalafmt或IntelliJ,那么只需使用List(x, y, z)。如果他们这样做的话,实际上是错误的,因为这基本上是一个多行表达式,它产生一个单一的值,它从哪里开始(缩进较少的行)和结束位置(最后一个更缩进的行)应该是显而易见的。如果"job_run_time"确实嵌套在"type"中,那么"type"将有一些与StructField对齐的结束括号,而单个缩进则意味着嵌套。但是没有一个,所以它意味着这些只是一个表达式的方法调用序列。
我从来没有见过a :: b :: c :: Nil在任何实际的prod代码库中大量使用List(a, b, c)来构造值,因为List(a, b, c)总是更短。只是有时使用::而不是+:作为前置操作(val newList = newHead :: oldList)是有意义的。显然,它在模式匹配(case a :: b :: c :: Nil =>)中也是有意义的.
在使用::构造值时,我可以想到的唯一真正的实际用例是使用无形状("x" :: 2 :: 'c' :: HNil)构建HList,因为您不能用varargs构建异构列表类型。
DR--只需使用List或习惯标准格式化程序所做的事情。
https://stackoverflow.com/questions/72684974
复制相似问题