gpt4 book ai didi

scala - 创建类型敏感函数而不更改父特征或案例类

转载 作者:行者123 更新时间:2023-12-02 01:56:18 24 4
gpt4 key购买 nike

假设我有两个类,PersonBusiness,它们由特征 Entity 扩展。

trait Entity
case class Person(name: String) extends Entity
case class Business(id: String) extends Entity

假设我无法更改EntityPersonBusiness(它们位于不同的文件中并且不能更改)我该如何定义一个函数,例如 printEntity,根据实体打印字段 nameid?例如,给定 PersonBusiness 实例,我该如何做这样的事情:

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 中,这是使用隐式包装类实现的:

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 指出的,你应该 extend implicit wrapper classes from AnyVal 。这允许编译器避免在运行时实际分配包装类实例,从而提高性能。

关于scala - 创建类型敏感函数而不更改父特征或案例类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69578750/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com