Scala 带有选项字段的Case类的模式匹配

Scala 带有选项字段的Case类的模式匹配,scala,Scala,我有这样一个案例类: case类Foo(a:Option[String],b:Option[String]) 我想对它进行模式匹配,看看这些值是否存在于字段中。最好的方法是什么 我做了以下操作,但它不起作用,因为它认为我正在尝试创建一个Foo实例: val ff=Foo(部分(“a”),无) //伪代码 ff比赛{ case Foo(a,b)=>做点什么//所有值都存在 案例Foo(无,无)=>错误 您可以执行以下操作: case class Foo(a: Option[String],

我有这样一个案例类:

case类Foo(a:Option[String],b:Option[String])
我想对它进行模式匹配,看看这些值是否存在于字段中。最好的方法是什么

我做了以下操作,但它不起作用,因为它认为我正在尝试创建一个Foo实例:

val ff=Foo(部分(“a”),无)
//伪代码
ff比赛{
case Foo(a,b)=>做点什么//所有值都存在
案例Foo(无,无)=>错误
您可以执行以下操作:


  case class Foo(a: Option[String], b: Option[String])

  val ff = Foo(Some("a"), None)

  //psuedo code
  ff match {
    case Foo(Some(a), Some(b)) => // when both a and b present
    case Foo(Some(a), None)    => // when only a present
    case Foo(None, Some(b))    => // when only b present
    case Foo(None, None)       => // when both a and b are not present
  }
您可以执行以下操作:


  case class Foo(a: Option[String], b: Option[String])

  val ff = Foo(Some("a"), None)

  //psuedo code
  ff match {
    case Foo(Some(a), Some(b)) => // when both a and b present
    case Foo(Some(a), None)    => // when only a present
    case Foo(None, Some(b))    => // when only b present
    case Foo(None, None)       => // when both a and b are not present
  }
case Foo(a,b)
将匹配任何
Foo(Option,Option)
,因为您在
Option
的实例上不匹配。例如
部分

参见上面路易斯的评论

scala> ff match{
     | case Foo(None, None) => "nn"
     | case Foo(None, Some(a)) => "ns"
     | case Foo(Some(a), None) => "sn"
     | case Foo(Some(a), Some(b)) => "ss"
     | }
res4: String = sn
case Foo(a,b)
将匹配任何
Foo(Option,Option)
,因为您在
Option
的实例上不匹配。例如
部分

参见上面路易斯的评论

scala> ff match{
     | case Foo(None, None) => "nn"
     | case Foo(None, Some(a)) => "ns"
     | case Foo(Some(a), None) => "sn"
     | case Foo(Some(a), Some(b)) => "ss"
     | }
res4: String = sn

Foo(a,b)
将匹配任何类型的
Foo
,因为您没有对它们的组件施加任何限制,还请记住
macth
就像一个迭代,它逐个检查每个案例,它无法神奇地知道它应该去哪种情况。因此,更一般的案例应该是最后一个,更具体的案例应该是第一个。-也许吧你想要这个,而不是
ff match{case Foo(一些(a),一些(b))=>用a&b做点什么;case{u=>error}
(你可以在代码上更好地格式化它)。是的,我现在可以按照你的建议工作了-谢谢你
Foo(a,b)
将匹配任何类型的
Foo
,因为您没有对它们的组件施加任何限制,还请记住
macth
就像一个迭代,它逐个检查每个案例,它无法神奇地知道它应该去哪种情况。因此,更一般的案例应该是最后一个,更具体的案例应该是第一个。-也许吧你想要这个,而不是
ff match{case Foo(一些(a),一些(b))=>用a&b做点什么;case{u=>error}
(你可以在代码上更好地格式化它)。是的,我现在可以按照你的建议工作了-谢谢