gpt4 book ai didi

scala - 从多个隐式对象自动导入

转载 作者:行者123 更新时间:2023-12-01 23:30:50 24 4
gpt4 key购买 nike

我刚刚发现了 Scala 的类型类概念并且非常喜欢它。我遇到的问题是我找到的所有示例都将类型类(对象)放在一个对象下(像这里:http://danielwestheide.com/blog/2013/02/06/the-neophytes-guide-to-scala-part-12-type-classes.html)

也许这是错误的,但我是每个类(class)一个文件的 friend 。所以我喜欢做的是将类型类放入多个文件中,这意味着每个实现都需要放入一个单独的对象中。现在这导致了我需要手动导入每个实现的“问题”。为了更好地阐明这里的一个小例子:

package sth

import sth.like.Like
import sth.like.StringLike._
import sth.like.IntLike._

object Application extends App {
def t[T](arg: T)(implicit l: Like[T]) = {
l.print(arg)
}

t(1)
t("Blub")
}

-

package sth.like

trait Like[T] {
def print(arg: T)
}

-

package sth.like

object IntLike {
implicit object LikeIntLike extends Like[Int] {
def print(arg: Int): Unit = println(s"INT $arg")
}
}

-

package sth.like

object StringLike {
implicit object LikeStringLike extends Like[String] {
override def print(arg: String): Unit = println(s"STRING: $arg")
}
}

到目前为止,这是有效的。我知道,应用程序中的通配符导入不是必需的,但这不是重点。如您所见,我需要在 Application 中同时导入 StringLike 和 IntLike,否则它们对 Application 对象不可用。

那么是否有可能以通用方式执行此操作,或者以这种方式执行此操作是完全错误的做法吗?

最佳答案

你可以把你的隐含放在特征中,而不是对象

trait IntLike {
implicit object LikeIntLike extends Like[Int] {
def print(arg: Int): Unit = println(s"INT $arg")
}
}

然后有同名的对象,扩展这个特性,这会给你之前的东西,你可以单独导入每个隐式。

object IntLike extends IntLike

您可以对类型类的所有其他实例执行相同的操作:

trait StringLike {
implicit object LikeStringLike extends Like[String] {
override def print(arg: String): Unit = println(s"STRING: $arg")
}
}

object StringLike extends StringLike

在另一个文件中,您可以像这样将所有特征组合在一起:

object Implicits extends StringLike with IntLike

如果您希望所有隐式都在范围内,则只导入 Implicits 对象。

package sth

import sth.like.Like
import sth.like.Implicits._

object Application extends App {
def t[T](arg: T)(implicit l: Like[T]) = {
l.print(arg)
}

t(1)
t("Blub")
}

可选地,你可以混合你需要的特征

object Application extends App with StringLike with IntLike { ... }

甚至做

trait Implicits extends StringLike with IntLike
object Implicits extends Implicits

object Application extends App with Implicits { ... }

关于scala - 从多个隐式对象自动导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36674404/

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