创建一个通常返回一个或两个参数的方法

Dav*_* B. 5 functional-programming scala

我有办法

def foo(num: Int): String
Run Code Online (Sandbox Code Playgroud)

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

def foo(num: Int): List[String]
Run Code Online (Sandbox Code Playgroud)

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

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

Krz*_*sik 12

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)
Run Code Online (Sandbox Code Playgroud)

它将编译和工作

当然,如果需要,您可以返回列表而不是元组(对于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)
Run Code Online (Sandbox Code Playgroud)

当然,有必要添加shapeless作为依赖项:

libraryDependencies += "com.chuusai" %% "shapeless" % "2.3.3"
Run Code Online (Sandbox Code Playgroud)

您可以使用的另一种方法是使用某种特殊的容器来获得结果。我会推荐元组:(String, Option[String])。如果您要返回“常规”结果,则应返回(String, None),如果是10则可以返回(String, Some[String])