gpt4 book ai didi

scala - 隐式类vs隐式转换为特征

转载 作者:行者123 更新时间:2023-12-04 11:35:23 25 4
gpt4 key购买 nike

我正在尝试向现有类型添加新功能(因此我可以让IDE自动为我无法控制的类型建议相关功能,例如Future[Option[A]])。我已经探究了隐式类和隐式转换来完成此任务,它们似乎都提供了相同的行为。

使用隐式类之间有什么有效的区别:

case class Foo(a: Int)
implicit class EnrichedFoo(foo: Foo) {
def beep = "boop"
}
Foo(1).beep // "boop"

并使用隐式转换:
case class Foo(a: Int)
trait Enriched {
def beep: String
}
implicit def fooToEnriched(foo: Foo) = new Enriched {
def beep = "boop"
}
Foo(1).beep // "boop"

我想这里的区别可能是第一个示例创建了一个一次性类而不是特征,但是我可以轻松地使隐式类适应扩展抽象特征,例如:
case class Foo(a: Int)
trait Enriched {
def beep: String
}
implicit class EnrichedFoo(foo: Foo) extends Enriched {
def beep = "boop"
}
Foo(1).beep // "boop"

最佳答案

据我所知,它们几乎完全相同。范围规则也同样适用于两者。

我认为,我会使用implicit classes来解决您的这种情况。它们可能正是针对这样的东西而创建的。

对我来说,隐式转换在您实际上已经拥有两种不同类型的类并且想要在两者之间进行转换时更合适。

您可以查看隐式类right here.的初始建议
那里说:

A new language construct is proposed to simplify the creation of classes which provide extension methods to another type.



您甚至可以看到它如何消除 implicit classes。以下:
implicit class RichInt(n: Int) extends Ordered[Int] {
def min(m: Int): Int = if (n <= m) n else m
...
}

将脱糖成:
class RichInt(n: Int) extends Ordered[Int] {
def min(m: Int): Int = if (n <= m) n else m
...
}
implicit final def RichInt(n: Int): RichInt = new RichInt(n)

关于scala - 隐式类vs隐式转换为特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36432376/

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