- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我有两个类,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 中,这是使用隐式包装类实现的:
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/
我这里有一些(遗留)代码,似乎在LD_LIBRARY_PATH上调用setenv(其值在编译时未知,实际上它将从命令中获取)行),现在我必须将其移植到 Windows。我怀疑 setenv 只是出于历
我在 SSIS 包上有一个敏感字符串参数,用于存储远程服务器的密码。 但是,当字符串值包含花括号时,作业代理会在配置该步骤的包参数时抛出错误: Microsoft SQL Server Managem
我们都非常了解 strictfp 的工作原理。 像这样: package com.hk.basicjava.tests.strictfp; import java.util.*; public cla
我正在对我的博客进行简单搜索。我使用亚美尼亚语,当我搜索时,这些字母总是很敏感。这是我的代码的一部分。提前谢谢你。 search_query = get.get('search') query_lis
我正在对我的博客进行简单搜索。我使用亚美尼亚语,当我搜索时,这些字母总是很敏感。这是我的代码的一部分。提前谢谢你。 search_query = get.get('search') query_lis
想象一下这个非常基本的可拖放设置: #dropArea 是可放置的。 #itemBox > .item 是可拖动对象。 由于某种原因,droppable
我有这样的网址: http://quickstart.local/public/category1/product2 并且在 url (category1/product2) 数字是 id ,从数据库
我是一名优秀的程序员,十分优秀!