scala - 创建一个通常返回一个或两个参数的方法
问题描述
我有一个方法
def foo(num: Int): String
我在代码中的某些地方调用了一些,一切都很好。
最近,我遇到了一种情况,我需要调用相同的方法,但是使用一些参数 int 值,我需要返回2 个字符串,而不仅仅是一个。我目前的实现方式是:
def foo(num: Int): List[String]
每次调用foo
并获取1 个字符串时,我将获取列表的头部,每次调用并返回 2 个字符串时,我将获取 [0, 1] 中的元素(我知道当我调用foo(10)
,我得到 2 个字符串,其余的 - 只有一个)。
是否有更惯用的 scala/功能?
解决方案
Scala 2.13引入了基于文字的单例类型,所以实际上你可以做这样疯狂的事情:
def foo(num: 10): (String, String) = ("Hello", "World")
def foo(num: Int): String = s"Hello $num"
val (left, right) = foo(10)
val single = foo(2)
它会编译和工作。
当然,如果您愿意,您可以返回一个列表而不是10案例的元组。
它也应该适用于类型级别的scala(甚至在2.13之前)。
使用2.13之前的常规Lightbend Scala ,您仍然可以这样做,但它要笨重得多。有必要使用一个额外的技巧,涉及使用称为Witness的类型,但幸运的是,它是由shapeless提供的:
import shapeless.Witness
import shapeless.syntax.singleton._
def foo(num: Witness.`10`.T): (String, String) = ("Hello", "World")
def foo(num: Int): String = s"Hello $num"
val (left, right) = foo(10)
val single = foo(2)
当然,有必要添加shapeless作为依赖项:
libraryDependencies += "com.chuusai" %% "shapeless" % "2.3.3"
您可以使用的另一种方法是为您的结果使用某种特殊容器。我会推荐元组:(String, Option[String])
. 如果你返回“常规”结果,你会返回(String, None)
,如果是10,你可以返回(String, Some[String])
。
推荐阅读
- performance - Kotlin 中的空方法是否有性能成本?
- angular - 在 Angular 6 中,滚动如何突出显示导航“li”项
- javascript - Semantic UI React Dropdown Search - 在关闭或输入时访问自动完成建议
- xcode - 在 xcode 服务器机器人上运行时,测试配置是否应该在测试结果中显示两次?
- machine-learning - 使用 sigmoid 函数的输出作为胜率预测是否合理?
- python - 如何在pyspark中使用foldleft?
- rss - Rundeck:如何成功启用 RSS 提要?
- anylogic - 有没有办法通过数据库中的时间戳触发 Anylogic 中的事件
- mysql - Mysql日期条件显示不正确的结果
- git - 如果未安装,请安装 GIT 并克隆