加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 如何为类级别的隐式参数提供默认值

发布时间:2020-12-16 09:19:52 所属栏目:安全 来源:网络整理
导读:我正在尝试使用一些隐式参数定义一个类: object Greetings { def say(name: String)(implicit greetings: String): String = greetings + " " +name } 我从另一个类使用这个类 implicit val greetings = "hello" // greetings : java.lang.String = helloGr
我正在尝试使用一些隐式参数定义一个类:

object Greetings {
  def say(name: String)(implicit greetings: String): String = greetings + " " +name 
}

我从另一个类使用这个类

implicit val greetings = "hello"                //> greetings  : java.lang.String = hello
Greetings.say("loic")                           //> res0: String = hello loic
Greetings.say("loic")("hi")                     //> res1: String = hi loic

我的问题是,只有在我的Greetings对象外部定义隐式val时,它才起作用.
我希望能够提供隐式参数的方法,我的类中有一个默认值,以便更容易地使用我的API(如Scala集合API).

所以我想这样做,但它不工作(隐含值找不到):

object Greetings {
  implicit val greetings = "hello"    
  def say(name: String)(implicit greetings: String): String = greetings + " " +name 
}

接着

Greetings.say("loic")                         
Greetings.say("loic")("hi")

我知道我可以用(隐含的问候语:String =“hello”)定义一个默认值,但是我想在类级别这样做,以避免重复,如果有很多方法.

我想我缺少一些东西,因为我看到CanBuildFrom是在List类中定义的.

解决方法

在隐式中使用像String这样的一般类型是一个坏主意.
主要原因是隐式查找完全基于类型,那么如果别人定义了类型为String的另一个隐式值呢?你可能会遇到冲突.所以你应该为自己的目的定义你自己的特定类型(一个简单的包装String).

另一个原因是,当查找隐含值时,编译器会将(等于其他位置)查找到隐含值类型的伴随对象(如果有的话).你可以很容易地看到它是多么有用,因为伴侣对象是放置默认隐式值的自然的地方(如你的情况).但是,如果隐式值是您不拥有的类型(例如String),则您无法为其编写一个随播对象,而使用自己的包装器类型则没有问题.

好的,足够的语气,这里是你可以做到的:

case class Greetings( value: String ) {
  override def toString = value
}
object Greetings {
  // this implicit is just so that we don't have to manually wrap 
  // the string when explicitly passing a Greetings instance
  implicit def stringToGreetings( value: String ) = Greetings( value ) 

  // default implicit Greetings value
  implicit val greetings: Greetings ="hello"

  def say(name: String)(implicit greetings: Greetings): String = greetings + " " +name 
}
Greetings.say("loic")                         
Greetings.say("loic")("hi")

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读