2016-11-14 54 views
1

Scalatest編寫測試時我使用了所謂的Equality[A]特質看起來如(文檔省略):有沒有一種方法能簡明寫匿名信subtrait只有一個抽象方法?

trait Equality[A] extends Equivalence[A] { 
    def areEqual(a: A, b: Any): Boolean 
    final def areEquivalent(a: A, b: A): Boolean = areEqual(a, b) 
} 

目前,我實現它如下

implicit def positionEquality: Equality[SomeType] = new Equality[SomeType] { 
    override def areEqual(a: SomeType, b: Any): Boolean = b match { 
     //actual code 
    } 
} 

但我希望把它寫更簡潔...像函數文字或一些。有沒有這樣的事情?

UPD:我只能想象一些隱式轉換,但它看起來是我必須明確,我想用的時候把它納入範圍相當怪異。與Any

object Equality { 
    def apply[T: ClassTag](fun: (a: T, b: T) => Boolean) = new Equality[T] { 
    override def areEqual(a: T, b: Any): Boolean = b match { 
     case t: T => fun(a, t) 
     case _ => false 
    } 
    } 
} 

implicit def positionEquality: Equality[SomeType] = Equality({case (a, b) => ???}) 

還是走Eq路線,讓編譯器幫助你:

回答

2

在斯卡拉2.12

implicit def positionEquality: Equality[SomeType] = (a, b) => b match ... 

should work。在斯卡拉2.11它需要-Xexperimental編譯器選項(IIRC,還有它不能正常工作的情況下,不幸的是,我不知道他們是什麼,如果這是其中之一,但我不會想到這麼)。針對`在這種情況下T`

2

試試這個。

+0

匹配實際上並沒有正常工作。你需要'def爲此應用[T:ClassTag]'。 –

+0

正確,反思。 – Reactormonk

相關問題