【问题标题】:Scala less typing with arguments of same typeScala 使用相同类型的参数减少打字
【发布时间】:2015-10-05 07:35:15
【问题描述】:

在 GoLang 中,如果一个函数接受多个相同类型的参数,您可以将其键入为:

add := func(x, y int) int {
  return x + y
}

其中xy 都是int 类型。

但我无法确定 scala 是否存在这样的速记符号。我已经尝试过,但无济于事。

> def add(x, y: Int): Int = { x + y} 

error: ':' expected but ',' found.

对于像这样的简单案例,这不是什么负担。但是对于我提出的一些案例类,这看起来非常冗长,与 scala 对冗长的立场相冲突。

是否有这样的 scala 功能或语法糖,如果有我该如何使用它?

【问题讨论】:

  • 不,scala 中没有这样的符号。但我有时会为 Int、String 等使用较短的类型别名 type I = Int 来缩短长签名,例如在为 JSON 或数据库库定义许多案例类时。
  • 我认为这样的符号在 Scala 中会有很多问题,特别是对于 lambda,由于类型推断,您不必总是指定变量的类型。
  • 就像@dmitry 已经提到的那样,没有这样的功能。一种解决方法可能是使用 List[Int] 来传递数据。但同样,它具有巨大的滥用潜力。
  • @dmitry 好吧,我认为这是一个答案。关于类型别名的好点,从没想过。
  • @Archeg 为什么会这样?你的意思是,例如,一个论点的类型是推断出来的,而另一个不是,从而导致歧义?这可能吗?

标签: scala


【解决方案1】:

在 Scala 中,以* 为类型后缀以表示该类型值的序列,例如

def add(x: Int*): Int = x.sum
add: (x: Int*)Int

等等

scala> add(1,2,3)
res0: Int = 6

现在x: Int*Int 值的序列,请考虑

def addMeta(x: Int*): Int = x.length
addMeta: (x: Int*)Int

scala> addMeta(0,1,2,3)
res1: Int = 4

【讨论】:

  • 好点和绝对非常有用的结构,但请参阅我对@ChetanBasin 的评论。
【解决方案2】:

不,scala 没有这个确切的功能。

确实,有时函数/类签名会很长,尤其是在为 spray.json 或 slick 定义案例类之类的东西时。

在这种情况下,我发现使用type 别名作为常用类型的可容忍提示。

object TypeShortcuts {
  type I = Int
  type L = Long
  type S = String
  type D = Double
  type B = Boolean
  type O[T] = Option[T]
}

import TypeShortcuts._

然后是这个讨厌的长声明:

case class Country(id: Int, currencyId: Option[Int], latin2: String, latin3: String, digital: String, names: Names, phoneCode: String)

我可以改写成更容易接受的(重要的是——简洁):

case class Country(id: I, currencyId: O[I], latin2: S, latin3: S, digital: S, names: Names, phoneCode: S)

这在一些光滑的角落里特别方便,比如:),想象一下全名版本的恐怖吧:

def applyOpt(t: (O[I], O[I], O[I], O[S], O[S], O[S], O[S], O[S], O[S], O[S], O[S], O[S], O[S], O[S], O[S], O[S])): O[BankInfo]

【讨论】:

  • 如果你觉得你需要这个,那么这可能表明你给你的类或方法提供了太多参数...
  • @Jesper 我并不总是自己选择这个,但这可能是一些外部代理的要求。只是一个简单的例子:预先存在的数据库。
  • @Jesper 类似地,处理提取和转换的数据、csv 或其他内容自然需要这种东西。即使原始数据结构良好且标准化,转换也可能产生非常多维的数据集。想想连接,或者更具体地说,非规范化数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-04
  • 1970-01-01
  • 1970-01-01
  • 2021-04-30
  • 2012-02-23
  • 1970-01-01
  • 2015-12-07
相关资源
最近更新 更多