gpt4 book ai didi

scala - Scala 中带有选项值或默认参数的方法调用

转载 作者:行者123 更新时间:2023-12-04 19:01:05 26 4
gpt4 key购买 nike

我对 Scala 比较陌生,偶然发现了一个一直困扰着我的小问题。假设有一些带有默认参数的方法

def foo(v: Any = "default"): String = s"called with parameter '$v'"

和一个选项 val opt: Option[String] .
如何使用选项值(如果已定义)或默认参数调用此方法?
我的意思是尽管有明显的解决方案
val result = if (opt.isDefined)
from.here.to.foo(opt.get)
else
from.here.to.foo()

并且必须使用(可能很长)对象链键入方法两次?更不用说有多个可选/默认参数......

我能想到的就是无益的 helper
def definedOrDefault[A, B](opt: Option[A], f0: => B, f1: A => B): B =
if (opt.isDefined) f1(opt.get) else f0

但是当无法在高阶函数中提及默认参数时......就是这样。让我想起 Java 过去的糟糕日子,方法重载会产生同样的问题。

最佳答案

似乎您在一个地方使用了两个可选的值概念,即可选参数和 Option .他们不喜欢一起玩,也许只用一个更好。

如果你总是只传递 Option 的值到方法或不传递任何内容以获取默认值,也许可以考虑更改函数以接受 Option .

def foo(v: Option[String]) = {
val param = v getOrElse "default"
s"called with parameter '$param'"
}

如果您仍然想要默认参数,您可以将签名更改为
def foo(v: Option[String] = None)

但是,这种方法需要您将参数包装到 Some 中。当您进行常规通话时,例如
foo(Some("regular param"))

但是当您使用 Option 时效果很好s。您也可以轻松添加更多可选参数。

这是一个例子
def foo(v1: Option[String] = None, v2: Option[Int] = None) = {
val param1 = v1 getOrElse "default"
val param2 = v2 getOrElse 42
s"'$param1', '$param2'"
}

foo() // "default", 42

foo(v2 = Some(12)) // "default", 12

foo(Some("asd"), Some(11)) // "asd", 11

val optionFromSomewhere = Some("a")
val anotherOptionFromSomewhere = Option.empty[Int]
foo(optionFromSomewhere, anotherOptionFromSomewhere) // "a", 42

您还可以从 Any 引入隐式转换至 Option ,这会让你省略 Some ,但我不认为这是个好主意
 implicit def any2option[A](e: A): Option[A] = Some(e)

关于scala - Scala 中带有选项值或默认参数的方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37751671/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com