在不更改父特征或大小写的情况下创建类型敏感函数 类
Creating a type-sensitive function without changing the parent trait or case classes
假设我有两个 类、Person
和 Business
,它们由特征 Entity
.
扩展
trait Entity
case class Person(name: String) extends Entity
case class Business(id: String) extends Entity
假设我无法更改 Entity
、Person
和 Business
(它们在不同的文件中并且不能更改)我如何定义一个函数,比如 printEntity
,根据实体打印字段 name
或 id
?例如,给定 Person
和 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)
}
如有任何想法,我们将不胜感激!抱歉,缺乏上下文,我还在学习!
这是通过所谓的 "extension methods" 完成的。在 scala 2 中,这是使用隐式包装器 class:
实现的
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
结果类型和副作用的方法应该使用明确的空括号调用。
更新:正如@DmytroMitin 指出的那样,你应该extend implicit wrapper classes from AnyVal
。这允许编译器避免在运行时实际分配包装器 class 实例,从而提高性能。
假设我有两个 类、Person
和 Business
,它们由特征 Entity
.
trait Entity
case class Person(name: String) extends Entity
case class Business(id: String) extends Entity
假设我无法更改 Entity
、Person
和 Business
(它们在不同的文件中并且不能更改)我如何定义一个函数,比如 printEntity
,根据实体打印字段 name
或 id
?例如,给定 Person
和 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)
}
如有任何想法,我们将不胜感激!抱歉,缺乏上下文,我还在学习!
这是通过所谓的 "extension methods" 完成的。在 scala 2 中,这是使用隐式包装器 class:
实现的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
结果类型和副作用的方法应该使用明确的空括号调用。
更新:正如@DmytroMitin 指出的那样,你应该extend implicit wrapper classes from AnyVal
。这允许编译器避免在运行时实际分配包装器 class 实例,从而提高性能。