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}
(你可以在代码上更好地格式化它)。是的,我现在可以按照你的建议工作了-谢谢