首页 > 解决方案 > 创建一个通常返回一个或两个参数的方法

问题描述

我有一个方法

def foo(num: Int): String

我在代码中的某些地方调用了一些,一切都很好。
最近,我遇到了一种情况,我需要调用相同的方法,但是使用一些参数 int 值,我需要返回2 个字符串,而不仅仅是一个。我目前的实现方式是:

def foo(num: Int): List[String]

每次调用foo并获取1 个字符串时,我将获取列表的头部,每次调用并返回 2 个字符串时,我将获取 [0, 1] 中的元素(我知道当我调用foo(10),我得到 2 个字符串,其余的 - 只有一个)。

是否有更惯用的 scala/功能?

标签: scalafunctional-programming

解决方案


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])


推荐阅读