我怎么會有類似的東西
var tuple : (Option[Any]) | (Option[Any], Option[Any]) | (Option[Any], Option[Any], Option[Any]) | (Option[Any], Option[Any], Option[Any], Option[Any])
但更優雅?
uj5u.com熱心網友回復:
Scala 3 聯合是華而不實和有趣的,但是對于稍微傳統的方法來說,有一些話要說,特別是當你最終得到一個需要水平滾動條的型別簽名時。
在這種情況下,由于您的優先級似乎是各個元組元素的型別安全,我可能會建議為孩子使用sealed traitwith case classes。
sealed trait MySpecialTuple
case class MyOneTuple(
val field: Option[Any],
) extends MySpecialTuple
case class MyTwoTuple(
val leftHandSide: Option[Int],
val rightHandSide: Option[String],
) extends MySpecialTuple
...
var tuple: MySpecialTuple
由于它是sealed,因此您可以對它進行詳盡的模式匹配以找出里面的內容。如果你想添加額外的功能(比如獲取事物的“長度”或其他屬性的方法),那可以是MySpecialTuple. 這里的重點是將“這東西可以是十種不同形狀中的一種”的難以置信的復雜性轉移到一堆命名的、有據可查的類上,而不是將其隱藏在單行變數宣告中。
uj5u.com熱心網友回復:
你可以在 scala3.0 中做這樣的事情:
scala> type OptTuple[T <: Tuple] = T match
| case Option[_] *: t => OptTuple[t]
| case EmptyTuple => DummyImplicit
|
scala> case class MyTuple[T <: Tuple : OptTuple](tuple: T)
// defined case class MyTuple
scala> val t1 = MyTuple((Option(1), Option("a"), Option(3.0)))
val t1: MyTuple[(Option[Int], Option[String], Option[Double])] = MyTuple((Some(1),Some(a),Some(3.0)))
scala> val t2 = MyTuple((Option(1), Option("a"), 3.0))
-- Error: ----------------------------------------------------------------------
1 |val t2 = MyTuple((Option(1), Option("a"), 3.0))
| ^
| Match type reduction failed since selector Double *: EmptyTuple.type
| matches none of the cases
|
| case Option[_] *: t => OptTuple[t]
| case EmptyTuple => DummyImplicit
1 error found
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/508557.html
