首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用以下命令时,IntelliJ-Scala格式列表元素同一行:

使用以下命令时,IntelliJ-Scala格式列表元素同一行:
EN

Stack Overflow用户
提问于 2022-06-20 09:35:08
回答 1查看 48关注 0票数 0

当构建一个嵌套对象(它将列表作为其输入,使用::构建列表)时,自动格式会产生误导:

代码语言:javascript
复制
   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**,中,这不是真的。**

我希望使用以下格式规则:

代码语言:javascript
复制
   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,那么它将被正确地格式化:

代码语言:javascript
复制
      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()**?**进行格式设置

EN

回答 1

Stack Overflow用户

发布于 2022-06-20 12:14:09

我怀疑您是否总是能够在:: Nil上强制使用新行,并且始终将所有的first :: second :: third :: Nil都对齐到同一列-- ::只是infix,除了以:结尾的方法在infix表示法中具有相反的顺序之外,从语言的角度来看,这并没有什么特别之处。它总是以缩进的方式缩进,就像它是x.call(y).call(z)一样,第一个元素的缩进比下面的链少一个。

但是,您可以尝试将标量添加到您的项目中,并尝试各种配置选项,以确定哪个配置选项足够明确。

配置示例可以如下所示:

代码语言:javascript
复制
// 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

尝试一些选项,看看哪一个最适合你。使用我在当前项目中使用的格式:

代码语言:javascript
复制
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或习惯标准格式化程序所做的事情。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72684974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档