我们在Scala中有Some,None,我需要名为Default的第三个.背后的想法是:
默认(我的自定义事物)意味着用户希望我应用一些内置默认值.
它应该像None一样(即与Option兼容),我将在我的例程中以特殊方式处理Default.我看了一下:Scala:像Option(Some,None)之类的东西,但有三种状态:Some,None,Unknown
我不想用我的自定义类型完全"遮蔽"一些"无".我希望让用户使用它们并在某些情况下应用我自己的"默认".
@Michael Zajac给出了几个选择,我认为第一个非常好.
我可以内置Some,None和"artificial"之类的
case object DefaultParamHere {
def apply(): Option[String] = {
Some("Substitute me we default framework value, please")
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
用例将是:
case class Application(artifact: Artifact,
mainClass: Class[_],
jvmMemory: Option[Memory] = None,
jvmOpts: Option[String] = DefaultParamHere(),
applicationConfiguration: List[String] = Nil) extends Stage
Run Code Online (Sandbox Code Playgroud)
你有几个选择,真的.你可以:
使用哨兵值.例如,如果您正在使用Option[Int],Some(-1)可以编码"默认"而不是None值.客户端代码需要知道这个值需要特别处理,这使得这个解决方案很弱.它易于实现,但对于那些需要使用返回sentinel值的代码的人来说很难实现.我不推荐这种方法.
使用其他类型,例如Option[Either[Default, B]].在此解决方案中,Some(Right(a))将代表现有值,Some(Left(Default))代表您的特殊情况,并且None仍将完全代表缺少数据.Default可能就像一个案例对象一样简单,它表示你需要做的事情,或某种包含程序可能需要处理的默认值的数据类型.在我看来,这是最好的选择(双关语),因为它清楚地说明了返回此类型时方法可能返回的内容,并强制代码处理Default案例.
使用其他类型,例如Option[Option[A]].这里Some(Some(a))代表一个现有的值,Some(None)可以代表你的特殊情况,和None以前一样.这与之前的解决方案类似,不同之处在于没有办法在默认情况下对附加信息进行编码,并且对于返回此类型的方法实际上意味着什么会更加神秘.
使用其他类型,例如scalaz.Either3.类似于前面的两个解决方案,您可以使用编码你的三个案例Either3[None, Default, A],其中Right3(a),Middle3(Default)和Left3(None)将各自的情况.这将再次明确该类型的用途,并强制客户端代码处理所有三种情况.但是,你需要的东西可能有点过头了.不过,如果您想在None案例中编码更多信息,那么Either3总是在那里.
使用包装器.如果不了解更多关于你的用例的话,很难准确地说出这会是什么样子,但是你可以创建一个包装的简单类,Option并且可以提供你想要的默认值.
case class Option3[A](opt: Option[A], default: A) {
def getOrDefault: A = opt.getOrElse(default)
}
Run Code Online (Sandbox Code Playgroud)
当然,这可能不是你想要的,而是沿着这些方向的东西.您还可以提供从包装器到Option包含的默认值的隐式转换None,或者取决于您真正希望它执行的操作.
| 归档时间: |
|
| 查看次数: |
506 次 |
| 最近记录: |