假設我有以下Scala代碼:添加自定義編譯時檢查到斯卡拉
sealed trait Foo
sealed trait Bar
object Foo1 extends Foo
object Foo2 extends Foo
object Foo3 extends Foo
object Bar1 extends Bar
object Bar2 extends Bar
object Bar3 extends Bar
case class Hello(foo:Foo, bar:Bar)
val a = Hello(Foo1, Bar2) // allowed
val b = Hello(Foo2, Bar2) // suppose not allowed
我需要在編譯的時候,如果任何不兼容的組合應用到Hello
趕上。假設僅允許以下組合:(Foo1, Bar1)
,(Foo1, Bar2)
,(Foo2, Bar3)
和(Foo3, Bar3)
。
在編譯期間可以測試這個嗎? 我知道plugins和macros可能允許我這樣做。一些提示將不勝感激。上面的教程對於最新版本的Scala(2.11.x)來說似乎已經過時了,所以其他教程的指針也會很棒。
在實際例子中,大約有Foo
和Bar
的實例,總共有100個組合,其中大約一半是無效的。而且,有效的組合可能在將來任意改變。
編輯
實際的問題是複雜一點。該Hello
方法接受Seq
如下:複雜的標準
case class Hello(foos:Seq[Foo], bars:Seq[Bar])
實例是:
- 如果
foos
包含Foo1
然後bars
不能有Bar1
。 foos
一起不能包含Foo1
和Foo3
。
代碼示例:
Hello(Seq(Foo1), Seq(Bar2, Bar3)) // valid
Hello(Seq(Foo1, Foo3), Seq(Bar1)) // invalid due to rule 2
除了@ DaunnC的回答,還有一個技術解釋[here](http://www.chuusai.com/2011/07/16/ fundeps合階/)。 – 2015-03-31 07:11:27
是否有任何規則確定哪些組合是有效的,哪些不是? – 2015-03-31 17:45:16
@MilesSabin號有效的組合是相當任意的..但有一定的規則..看到我上面的編輯。 – Jus12 2015-04-01 04:06:05