Scala 将某些值传递给具有默认参数值的函数的最佳方法?
我有一个来自第三方库的函数,如下所示:Scala 将某些值传递给具有默认参数值的函数的最佳方法?,scala,Scala,我有一个来自第三方库的函数,如下所示: def myfunction(input:String = "some constant value") 我有一个 myinput:Option[String] 和我一起,我需要传递函数。现在,我正在这样做: myfunction(myinput.getOrElse("some constant value")) 但是我不想查看第三方库的默认值。 理想的方法是什么?我不知道这是否是最好的方法,但你可以这样做: if (myinput.isDefin
def myfunction(input:String = "some constant value")
我有一个
myinput:Option[String]
和我一起,我需要传递函数。现在,我正在这样做:
myfunction(myinput.getOrElse("some constant value"))
但是我不想查看第三方库的默认值。
理想的方法是什么?我不知道这是否是最好的方法,但你可以这样做:
if (myinput.isDefined){
myfunction(myinput.get)
}
else{
myfunction()
}
因此,如果您的myinput
包含一个值,请使用它,否则使用默认值
显然,如果您经常这样做,您应该将其外包给一个函数,以便在每次调用时只有一行。您可以尝试:
myinput.map(v => myfunction(v)).getOrElse(myfunction())
或更简洁(如巴勃罗在评论中所建议):
另一种方式是折叠。 假设myfunction返回我们得到的字符串:
val callIt: Option[String] => String = it => it.fold(myfunction())(myfunction(_))
callIt(None)
callIt(Some("abc"))
有很多方法可以实现这一点,但我最喜欢的方法是使用模式匹配。这段代码可读性也很强
myinput match {
case Some(str) => myfunction(str)
case _ => myfunction()
}
这种事情通常用
来完成。折叠:
myInput.fold(myfunction())(myfunction _)
我认为这是最好的答案。它可能更简洁,因为myfunction
只接收一个String
参数:myinput.map(myfunction).getOrElse(myfunction())
同意。或者让未来的评论者感到困惑,myinput-map-myfunction uuorelse-myfunction()
如果你使用fold
(也更惯用)@Dima我同意fold更惯用,但是,我发现大多数人觉得它更让人困惑(尤其是那些刚接触scala的人)。@AssafMendelson是的。。。如果你对某事物不熟悉,那么它越是习惯用法,你就越会感到困惑:)“大多数人”,对scala来说是新手,也会发现循环和变量“困惑”更少,然后foreach
和foldLeft
。。。这不是坚持前者的理由。。。“大多数人”可以接受教育。
myInput.fold(myfunction())(myfunction _)