假設我有兩個類Person和Business,它們由 trait 擴展Entity。
trait Entity
case class Person(name: String) extends Entity
case class Business(id: String) extends Entity
假設我不能更改Entity,Person并且Business(它們在不同的檔案中并且不會被更改)我如何定義一個函式,比如 a printEntity,它列印欄位nameor id,取決于物體?例如,給定Personand 的實體,Business我該如何做這樣的事情:
object Main extends App {
val person1: Person = Person("Aaaa Bbbb")
val business1: Business = Business("0001")
// How can I do something like this?
person1.printEntity // would call a function that executes println(id)
business1.printEntity // would call a function that executes println(name)
}
任何想法表示贊賞!抱歉沒有背景關系,我還在學習中!
uj5u.com熱心網友回復:
這是通過所謂的“擴展方法”完成的。在 Scala 2 中,這是使用隱式包裝器類實作的:
trait Entity
case class Person(name: String) extends Entity
case class Business(id: String) extends Entity
implicit class PersonWrapper(val p: Person) extends AnyVal {
def printEntity(): Unit = {
println(p.name)
}
}
implicit class BusinessWrapper(val b: Business) extends AnyVal {
def printEntity(): Unit = {
println(b.id)
}
}
val person1: Person = Person("Aaaa Bbbb")
val business1: Business = Business("0001")
person1.printEntity()
business1.printEntity()
// prints:
//Aaaa Bbbb
//0001
請注意,x.printEntity可以不帶括號呼叫,但按照慣例,Unit應使用顯式空括號呼叫具有結果型別和副作用的方法。
UPD:正如@DmytroMitin 所指出的,您應該從AnyVal. 這允許編譯器避免在運行時實際分配包裝類實體,從而提高性能。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/318734.html
