Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala部分、无和我的自定义默认值_Scala_Scala 2.11 - Fatal编程技术网

Scala部分、无和我的自定义默认值

Scala部分、无和我的自定义默认值,scala,scala-2.11,Scala,Scala 2.11,我们有一些,Scala中没有,我需要第三个名为Default的。 背后的想法是: 有些意味着有一些价值 没有意味着没有价值。不要使用值 默认值(我的自定义对象)意味着用户希望我应用一些内置默认值 它的行为应该像None(即与Option兼容),我将在例程中以一种特殊的方式处理默认值。 我看了一下: 我不想完全“阴影”一些,没有与我的自定义类型。我想让用户使用它们,并在某些情况下应用我自己的“默认值” @Michael Zajac给出了几个选择,我认为第一个很好 我可以在一些,没有和“人

我们有一些,Scala中没有,我需要第三个名为Default的。 背后的想法是:

  • 有些意味着有一些价值

  • 没有意味着没有价值。不要使用值

  • 默认值(我的自定义对象)意味着用户希望我应用一些内置默认值

    它的行为应该像None(即与Option兼容),我将在例程中以一种特殊的方式处理默认值。 我看了一下:

我不想完全“阴影”一些,没有与我的自定义类型。我想让用户使用它们,并在某些情况下应用我自己的“默认值”

@Michael Zajac给出了几个选择,我认为第一个很好

我可以在一些,没有和“人造”一样

谢谢

因此,用例将是:

case class Application(artifact: Artifact,
                              mainClass: Class[_],
                              jvmMemory: Option[Memory] = None,
                              jvmOpts: Option[String] = DefaultParamHere(),
                              applicationConfiguration: List[String] = Nil) extends Stage

你有很多选择,真的。你可以:

使用sentinel值。例如,如果使用
选项[Int]
某些(-1)
可以对“默认值”进行编码,但不能对
无值进行编码。客户机代码需要知道这个值需要专门处理,这使得这个解决方案很弱。这很容易实现,但对于那些需要使用返回sentinel值的代码的人来说很困难。我不推荐这种方法

使用不同的类型,例如
选项[默认值,B]]
。在这个解决方案中,
Some(Right(a))
将表示一个现有值,
Some(Left(Default))
将表示您的特殊情况,
None
仍将表示完全缺少数据<代码>默认值
可以是简单的case对象,表示您需要执行的操作,也可以是包含程序可能需要处理的默认值的某种数据类型。在我看来,这是最好的选择(双关语),因为它明确了返回此类型时方法可能返回的内容,并强制代码处理
Default
情况

使用不同的类型,例如
选项[Option[a]]
。这里
Some(Some(a))
表示一个现有值,
Some(None)
可以表示您的特殊情况,
None
与前面相同。这与前面的解决方案类似,只是在默认情况下没有编码其他信息的方法,而且返回此类型的方法的实际用途更为隐晦

使用不同的类型,例如。与前两种解决方案类似,您可以使用
对三种情况进行编码,其中
Right3(A)
Middle3(默认)
,以及
Left3(无)
将分别是这三种情况。这将再次明确该类型的用途,并强制客户机代码处理所有这三种情况。然而,对于你需要的东西来说,这可能是过分的。不过,如果您想在
None
案例中编码更多信息,
3
总是存在

使用包装器。在不了解更多用例的情况下,很难说这是什么样子,但是您可以创建一个简单的类来包装
选项
,并提供所需的默认值

case class Option3[A](opt: Option[A], default: A) {
  def getOrDefault: A = opt.getOrElse(default)
}

当然,这可能不是你想要的,而是沿着这些思路。您还可以提供从包装器到
选项的隐式转换,该转换可以在
None
或其他情况下替换默认值,具体取决于您真正希望它做什么。

您的用户是谁?程序员?为什么不使用
getOrElse(myDefault)
选项是密封的,因此您无法扩展它。也许你应该构建另一层,即另一个包装器class@RaphaelRoth当然,我不能,我正在寻找其他方法。@YuvalItzchakov你说的getOrElse是什么意思?我的用户是开发人员。他们应该告诉我:使用我的(用户)值,不要使用任何值或为我做一些好事(用户设置默认值)。你可以使用一个
def foo[T](默认值:T)
的方法,并将其用作
选项[T]
的备用值。这是一件好事。我可以模仿这些默认值。我可以做类似于smth的case对象{def apply={Some(-1)}},我认为这是一个很好的折衷方案。。。在我看来,这些解决方案太复杂了。谢谢你的主意@Sergey他们看起来很复杂,直到有人忘记了sentinel值是什么,然后他们引入了可能很难修复的bug。这就是折衷。
case class Option3[A](opt: Option[A], default: A) {
  def getOrDefault: A = opt.getOrElse(default)
}