[英]Scala: pattern matching on nested type hierarchies
假設我有
sealed trait AlphaNumericChar
sealed trait AlphaChar
case object A extends AlphaNumericChar with AlphaChar
case object B extends AlphaNumericChar with AlphaChar
sealed trait NumericChar
case object One extends AlphaNumericChar with NumericChar
case object Two extends AlphaNumericChar with NumericChar
這種結構允許我在AlphaNumericChar
上進行模式匹配並獲得所有A,B,One,Two
和類似的模式匹配AlphaChar
和NumericChar
並僅獲得相關對象。
它不允許我寫的是:
def foo(x: AlphaNumericChar) = ???
def bar(x: AlphaChar) = foo(x)
即,僅對某些類型的foo
代理調用。 我當然可以改寫:
def baz(x: AlphaNumericChar with AlphaChar) = foo(x)
這會起作用,但這可能有點難看。
另一種方法是讓AlphaChar
和NumericChar
擴展AlphaNumericChar
但這會弄亂我在AlphaNumericChar
上的模式匹配,因為我現在必須處理_:AlphaChar
和_:NumericChar
以及我不希望的案例對象。
有沒有辦法以某種方式擁有兩個世界中最好的? IE。
AlphaChar
/ NumericChar
上的模式匹配條目的詳盡列表只有兩個元素。AlphaNumericChar
上的模式匹配條目的詳盡列表只有兩個元素。baz
語法的情況下讓上面的 function bar
工作。擴展 AlphaNumericChar 應該不是問題。 像這樣的東西很好用:
sealed trait AlphaNumericChar
sealed trait AlphaChar extends AlphaNumericChar
case object A extends AlphaChar
case object B extends AlphaChar
sealed trait NumericChar extends AlphaNumericChar
case object One extends NumericChar
case object Two extends NumericChar
def foo(x: AlphaNumericChar) = x match {
case One => println("hi")
case Two => println("bye")
case A => println("foo")
case B => println("bar")
}
def bar(x: AlphaChar) = foo(x)
def aThirdFunction(y: NumericChar) = y match {
case One => println("eggs")
case Two => println("beans")
}
foo(One) // hi
foo(Two) // bye
foo(A) // foo
foo(B) // bar
bar(A) // foo
bar(B) // bar
aThirdFunction(One) // eggs
aThirdFunction(Two) // beans
除非我誤解了你想要什么?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.