у меня есть:Scala - Match Кортеж Вариантов
val foo = Some(List(1, 2, 3)) -> Some("y")
Я хотел бы, чтобы бросить спичку его:
foo match {
case (Some(x), Some(y)) => println(x + " " + y)
case _ => println("error")
Это прекрасно работает Some(List(1, 2, 3) -> Some("score"))
, но не для Some(List(1, 2, 3) -> None
, None -> Some("y")
или None -> None
с:
error: constructor cannot be instantiated to expected type;
found : Some[A]
required: None.type
error: not found: value ...
Почему это так?
Конечно, я мог бы использовать getOrElse()
, но это не выглядит так элегантно.
Thx много, Карстен
Update:
foo match {
case (x: Some[List[Int]], y: Some[Int]) => println(x.get)
case _ => println("error")
}
завершается, а также с:
error: pattern type is incompatible with expected type;
found : Some[Int]
required: None.type
Я думаю, что case _
позаботится об этом.
Хм, это имеет смысл. Однако можно определить foo._1 и foo._2. Это то, что я хочу Знаю. – Karsten
Хорошо, теперь я понимаю. Я думал, что foo будет иметь тип (Option [List [Int]], Option [Any]). – Karsten
Вы могли бы так поступить. Но разработчики языка scala решили дать Some и None свой собственный тип, так что такие вещи можно найти во время компиляции. Обычно это не проблема в реальном коде, потому что вы должны определить foo для самого общего типа, который вы хотите обработать, например (Option [List [Int [ ]], Option [String]). –